making this work
This commit is contained in:
		
							parent
							
								
									e0ae0724e2
								
							
						
					
					
						commit
						59e18ad659
					
				
							
								
								
									
										8
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -237,11 +237,15 @@ dependencies = [ | |||||||
| name = "ethcore" | name = "ethcore" | ||||||
| version = "1.1.0" | version = "1.1.0" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  |  "bincode 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "clippy 0.0.63 (registry+https://github.com/rust-lang/crates.io-index)", |  "clippy 0.0.63 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "crossbeam 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", |  "crossbeam 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", |  "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "ethash 1.1.0", |  "ethash 1.1.0", | ||||||
|  "ethcore-devtools 1.1.0", |  "ethcore-devtools 1.1.0", | ||||||
|  |  "ethcore-ipc 1.1.0", | ||||||
|  |  "ethcore-ipc-codegen 1.1.0", | ||||||
|  |  "ethcore-ipc-nano 1.1.0", | ||||||
|  "ethcore-util 1.1.0", |  "ethcore-util 1.1.0", | ||||||
|  "ethjson 0.1.0", |  "ethjson 0.1.0", | ||||||
|  "heapsize 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", |  "heapsize 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| @ -250,6 +254,10 @@ dependencies = [ | |||||||
|  "num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", |  "num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rust-crypto 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", |  "rust-crypto 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", |  "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  |  "semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  |  "serde 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  |  "serde_codegen 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  |  "syntex 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", |  "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -122,7 +122,7 @@ fn binary_expr( | |||||||
| ) -> Result<BinaryExpressions, Error> { | ) -> Result<BinaryExpressions, Error> { | ||||||
| 	match item.node { | 	match item.node { | ||||||
| 		ast::ItemKind::Struct(ref variant_data, _) => { | 		ast::ItemKind::Struct(ref variant_data, _) => { | ||||||
| 			binary_expr_struct( | 			binary_expr_item_struct( | ||||||
| 				cx, | 				cx, | ||||||
| 				builder, | 				builder, | ||||||
| 				impl_generics, | 				impl_generics, | ||||||
| @ -149,29 +149,54 @@ fn binary_expr( | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct BinaryExpressions { | struct BinaryExpressions { | ||||||
| 	size: P<ast::Expr>, | 	pub size: P<ast::Expr>, | ||||||
| 	write: P<ast::Stmt>, | 	pub write: P<ast::Stmt>, | ||||||
| 	read: P<ast::Expr>, | 	pub read: P<ast::Expr>, | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn serialize_tuple_struct( |  | ||||||
| 	cx: &ExtCtxt, |  | ||||||
| 	builder: &aster::AstBuilder, |  | ||||||
| 	impl_generics: &ast::Generics, |  | ||||||
| 	ty: P<ast::Ty>, |  | ||||||
| 	fields: usize, |  | ||||||
| ) -> Result<P<ast::Expr>, Error> { |  | ||||||
|     let type_name = field.ty; |  | ||||||
| 	let id = field.id; |  | ||||||
| 
 |  | ||||||
|     Ok(BinaryExpressions { |  | ||||||
| 		size: quote_expr!(cx, self. $id .size() ), |  | ||||||
| 		write: quote_stmt!(cx, self. $id .write(buffer); ), |  | ||||||
| 		read: quote_expr!(cx, Self { $id: $type_name ::from_bytes(buffer) }), |  | ||||||
| 	}); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn binary_expr_struct( | fn binary_expr_struct( | ||||||
|  | 	cx: &ExtCtxt, | ||||||
|  | 	builder: &aster::AstBuilder, | ||||||
|  | 	ty: P<ast::Ty>, | ||||||
|  |     fields: &[ast::StructField], | ||||||
|  | 	value_ident: Option<P<ast::Ident>>, | ||||||
|  | ) -> Result<BinaryExpressions, Error> { | ||||||
|  |     let type_name = field.ty; | ||||||
|  | 	let id = field.id; | ||||||
|  | 
 | ||||||
|  | 	let mut size_exprs = Vec::new(); | ||||||
|  | 	fields.iter().enumerate(|(index, field)| { | ||||||
|  | 		let index_ident = builder.id(format!("{}", index)); | ||||||
|  | 		value_ident.and_then(|value_ident| size_exprs.push(quote_expr!(cx, $value_ident . $index_ident .size()))) | ||||||
|  | 			.unwrap_or_else(|| size_exprs.push(quote_expr!(cx, $index_ident .size()))); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	let mut total_size_expr = size_exprs[0].clone(); | ||||||
|  | 	for index in 1..size_expr.len() { | ||||||
|  | 		let next_expr = size_exprs[i].clone(); | ||||||
|  | 		total_size_expr = quote_expr!(cx, $total_size_expr + $next_expr); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	let mut write_stmts = Vec::new(); | ||||||
|  | 	write_stmts.push(quote_stmt!(cx, let mut offset = 0usize;)); | ||||||
|  | 	fields.iter().enumerate(|(index, field)| { | ||||||
|  | 		let index_ident = builder.id(format!("{}", index)); | ||||||
|  | 		let size_expr = size_exprs[index]; | ||||||
|  | 		write_stmts.push(quote_stmt!(cx, let next_line = offset + $size_expr; )); | ||||||
|  | 		value_ident.and_then(|x| | ||||||
|  | 				write_stmts.push(quote_stmt!(cx, $x . $index_ident .write(&mut buffer[offset..next_line]);)) | ||||||
|  | 			).unwrap_or_else(|| write_stmts.push(quote_stmt!(cx, $index_ident .write(&mut buffer[offset..next_line]);))); | ||||||
|  | 		write_stmts.push(quote_stmt!(cx, offset = next_line; )); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  |     Ok(BinaryExpressions { | ||||||
|  | 		size: total_size_expr, | ||||||
|  | 		write: quote_stmt!(cx, { $write_stmts } ), | ||||||
|  | 		read: quote_expr!(cx, $ty { }), | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn binary_expr_item_struct( | ||||||
| 	cx: &ExtCtxt, | 	cx: &ExtCtxt, | ||||||
| 	builder: &aster::AstBuilder, | 	builder: &aster::AstBuilder, | ||||||
| 	impl_generics: &ast::Generics, | 	impl_generics: &ast::Generics, | ||||||
| @ -181,22 +206,139 @@ fn binary_expr_struct( | |||||||
| ) -> Result<BinaryExpressions, Error> { | ) -> Result<BinaryExpressions, Error> { | ||||||
| 	match *variant_data { | 	match *variant_data { | ||||||
| 		ast::VariantData::Tuple(ref fields, _) => { | 		ast::VariantData::Tuple(ref fields, _) => { | ||||||
| 			binary_expr_struct_tuple( | 			binary_expr_struct( | ||||||
| 				cx, | 				cx, | ||||||
| 				&builder, | 				&builder, | ||||||
| 				impl_generics, |  | ||||||
| 				ty, | 				ty, | ||||||
| 				fields, | 				fields, | ||||||
| 			) | 			) | ||||||
| 		} | 		} | ||||||
| 		ast::VariantData::Struct(ref fields, _) => { | 		ast::VariantData::Struct(ref fields, _) => { | ||||||
| 			binary_expr_struct_inner( | 			binary_expr_struct( | ||||||
| 				cx, | 				cx, | ||||||
| 				&builder, | 				&builder, | ||||||
| 				impl_generics, |  | ||||||
| 				ty, | 				ty, | ||||||
| 				fields, | 				fields, | ||||||
| 			) | 			) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn binary_expr_enum( | ||||||
|  |     cx: &ExtCtxt, | ||||||
|  |     builder: &aster::AstBuilder, | ||||||
|  |     type_ident: Ident, | ||||||
|  |     impl_generics: &ast::Generics, | ||||||
|  |     ty: P<ast::Ty>, | ||||||
|  |     enum_def: &ast::EnumDef, | ||||||
|  | ) -> Result<BinaryExpressions, Error> { | ||||||
|  | 	let arms: Vec<_> = try!( | ||||||
|  | 		enum_def.variants.iter() | ||||||
|  | 			.enumerate() | ||||||
|  | 			.map(|(variant_index, variant)| { | ||||||
|  | 				binary_expr_variant( | ||||||
|  | 					cx, | ||||||
|  | 					builder, | ||||||
|  | 					type_ident, | ||||||
|  | 					impl_generics, | ||||||
|  | 					ty.clone(), | ||||||
|  | 					variant, | ||||||
|  | 					variant_index, | ||||||
|  | 				) | ||||||
|  | 			}) | ||||||
|  | 			.collect() | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	let (size_arms, write_arms, read_arms) = ( | ||||||
|  | 		arms.iter().map(|x| x.size).collect::<Vec<P<ast::Arm>>>(), | ||||||
|  | 		arms.iter().map(|x| x.write).collect::<Vec<P<ast::Arm>>>(), | ||||||
|  | 		arms.iter().map(|x| x.read).collect::<Vec<P<ast::Arm>>>()); | ||||||
|  | 
 | ||||||
|  | 	Ok(BinaryExpressions { | ||||||
|  | 		size: quote_expr!(cx, match *self { $size_arms }), | ||||||
|  | 		write: quote_stmt!(cx, match *self { $write_arms }; ), | ||||||
|  | 		read: quote_expr!(cx, match *self { $read_arms }), | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct BinaryArm { | ||||||
|  | 	size: P<ast::Arm>, | ||||||
|  | 	write: P<ast::Arm>, | ||||||
|  | 	read: P<ast::Arm>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn binary_expr_variant( | ||||||
|  |     cx: &ExtCtxt, | ||||||
|  |     builder: &aster::AstBuilder, | ||||||
|  |     type_ident: Ident, | ||||||
|  |     generics: &ast::Generics, | ||||||
|  |     ty: P<ast::Ty>, | ||||||
|  |     variant: &ast::Variant, | ||||||
|  |     variant_index: usize, | ||||||
|  | ) -> Result<BinaryArm, Error> { | ||||||
|  | 	let type_name = ty.name; | ||||||
|  | 
 | ||||||
|  | 	let variant_ident = variant.node.name; | ||||||
|  | 
 | ||||||
|  | 	match variant.node.data { | ||||||
|  | 		ast::VariantData::Tuple(ref fields, _) => { | ||||||
|  | 			let field_names: Vec<ast::Ident> = (0 .. fields.len()) | ||||||
|  | 				.map(|i| builder.id(format!("__field{}", i))) | ||||||
|  | 				.collect(); | ||||||
|  | 
 | ||||||
|  | 			let pat = builder.pat().enum_() | ||||||
|  | 				.id(type_ident).id(variant_ident).build() | ||||||
|  | 				.with_pats( | ||||||
|  | 					field_names.iter() | ||||||
|  | 						.map(|field| builder.pat().ref_id(field)) | ||||||
|  | 				) | ||||||
|  | 				.build(); | ||||||
|  | 
 | ||||||
|  | 			let binary_expr = try!(binary_expr_struct( | ||||||
|  | 				cx, | ||||||
|  | 				&builder, | ||||||
|  | 				ty, | ||||||
|  | 				fields, | ||||||
|  | 				None, | ||||||
|  | 			)); | ||||||
|  | 
 | ||||||
|  | 			let (size_expr, write, read_expr) = (binary_expr.size, vec![binary_expr.write], binary_expr.read); | ||||||
|  | 
 | ||||||
|  | 			Ok(BinaryArm { | ||||||
|  | 				size: P(quote_arm!(cx, $pat => { $size_expr } )), | ||||||
|  | 				write: P(quote_arm!(cx, $pat => { $write } )), | ||||||
|  | 				read: P(quote_arm!(cx, $pat => { $read_expr } )), | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 		ast::VariantData::Struct(ref fields, _) => { | ||||||
|  | 			let field_names: Vec<_> = (0 .. fields.len()) | ||||||
|  | 				.map(|i| builder.id(format!("__field{}", i))) | ||||||
|  | 				.collect(); | ||||||
|  | 
 | ||||||
|  | 			let pat = builder.pat().struct_() | ||||||
|  | 				.id(type_ident).id(variant_ident).build() | ||||||
|  | 				.with_pats( | ||||||
|  | 					field_names.iter() | ||||||
|  | 						.zip(fields.iter()) | ||||||
|  | 						.map(|(id, field)|(name, builder.pat().ref_id(id)))) | ||||||
|  | 				.build(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 			let binary_expr = try!(binary_expr_struct( | ||||||
|  | 				cx, | ||||||
|  | 				&builder, | ||||||
|  | 				ty, | ||||||
|  | 				fields, | ||||||
|  | 				None, | ||||||
|  | 			)); | ||||||
|  | 
 | ||||||
|  | 			let (size_expr, write, read_expr) = (binary_expr.size, vec![binary_expr.write], binary_expr.read); | ||||||
|  | 			Ok(BinaryArm { | ||||||
|  | 				size: P(quote_arm!(cx, $pat => { $size_expr } )), | ||||||
|  | 				write: P(quote_arm!(cx, $pat => { $write } )), | ||||||
|  | 				read: P(quote_arm!(cx, $pat => { $read_expr } )), | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ | |||||||
| 
 | 
 | ||||||
| //! Binary representation of types
 | //! Binary representation of types
 | ||||||
| 
 | 
 | ||||||
| trait BinaryConvertable { | pub trait BinaryConvertable { | ||||||
| 	fn size(&self) -> usize; | 	fn size(&self) -> usize; | ||||||
| 
 | 
 | ||||||
| 	fn to_bytes(buffer: &mut [u8]); | 	fn to_bytes(buffer: &mut [u8]); | ||||||
|  | |||||||
| @ -21,4 +21,6 @@ extern crate semver; | |||||||
| extern crate nanomsg; | extern crate nanomsg; | ||||||
| 
 | 
 | ||||||
| pub mod interface; | pub mod interface; | ||||||
| pub use interface::{IpcInterface, IpcSocket, invoke, IpcConfig, Handshake, Error, WithSocket, BinaryConvertable}; | pub mod binary; | ||||||
|  | pub use interface::{IpcInterface, IpcSocket, invoke, IpcConfig, Handshake, Error, WithSocket}; | ||||||
|  | pub use binary::{BinaryConvertable}; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user