Skip to content

Commit 64f4d3d

Browse files
committed
refactor(TasmStruct): Remove unreachable code
Remove derive-macro generated unreachable code for unit structs.
1 parent 1c4528b commit 64f4d3d

File tree

1 file changed

+65
-57
lines changed

1 file changed

+65
-57
lines changed

tasm-object-derive/src/lib.rs

Lines changed: 65 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ fn generate_integral_size_indicators_code(parse_result: &ParseResult) -> TokenSt
179179

180180
fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
181181
let parse_result = generate_parse_result(&ast);
182+
let name = &ast.ident;
183+
let name_as_string = ast.ident.to_string();
182184

183185
// generate clauses for match statements
184186
let get_current_field_start_with_jump = (0..parse_result.field_names.len()).map(|index| {
@@ -216,6 +218,28 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
216218
}
217219
}
218220
});
221+
let get_field_code = if parse_result.field_names.is_empty() {
222+
quote!(panic!("{} has no fields", #name_as_string);)
223+
} else {
224+
quote!(
225+
let field_getter = match field_name {
226+
#( #just_field_clauses ,)*
227+
unknown_field_name => panic!("Cannot match on field name `{unknown_field_name}`."),
228+
};
229+
let hint_appendix = [
230+
crate::triton_vm::isa::instruction::LabelledInstruction::TypeHint(
231+
crate::triton_vm::isa::instruction::TypeHint {
232+
starting_index: 0,
233+
length: 1,
234+
type_name: ::std::option::Option::<::std::string::String>::None,
235+
variable_name: ::std::string::String::from(field_name),
236+
}
237+
)
238+
].to_vec();
239+
[field_getter, hint_appendix].concat()
240+
)
241+
};
242+
219243
let field_with_size_clauses = parse_result
220244
.field_names
221245
.iter()
@@ -231,23 +255,54 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
231255
}
232256
}
233257
});
258+
let get_field_with_size_code = if parse_result.field_names.is_empty() {
259+
quote!(panic!("{} has no fields", #name_as_string);)
260+
} else {
261+
quote!(
262+
let field_getter = match field_name {
263+
#( #field_with_size_clauses ,)*
264+
unknown_field_name => panic!("Cannot match on field name `{unknown_field_name}`."),
265+
};
266+
let hint_appendix = [
267+
crate::triton_vm::isa::instruction::LabelledInstruction::TypeHint(
268+
crate::triton_vm::isa::instruction::TypeHint {
269+
starting_index: 0,
270+
length: 1,
271+
type_name: ::std::option::Option::Some(::std::string::String::from("u32")),
272+
variable_name: ::std::string::String::from("size"),
273+
}
274+
),
275+
crate::triton_vm::isa::instruction::LabelledInstruction::TypeHint(
276+
crate::triton_vm::isa::instruction::TypeHint {
277+
starting_index: 1,
278+
length: 1,
279+
type_name: ::std::option::Option::<::std::string::String>::None,
280+
variable_name: ::std::string::String::from(field_name),
281+
}
282+
)
283+
].to_vec();
284+
285+
[field_getter, hint_appendix].concat()
286+
)
287+
};
288+
234289
let field_starter_clauses = parse_result.field_names
235290
.iter()
236291
.zip(parse_result.jumpers.iter())
237292
.enumerate()
238-
.map(|(index,(name, jumper))| {
239-
let name_as_string = name.to_string();
293+
.map(|(index, (name, jumper))| {
294+
let field_name = name.to_string();
240295
match index {
241296
0 => quote!{
242-
#name_as_string => { #jumper }
297+
#field_name => { #jumper }
243298
},
244299
not_zero => {
245-
let previous_field_name_as_string = parse_result.field_names[not_zero-1].to_string();
300+
let previous_field_name = parse_result.field_names[not_zero-1].to_string();
246301
quote! {
247-
#name_as_string => {
302+
#field_name => {
248303
let prev =
249304
[
250-
Self::get_field_start_with_jump_distance(#previous_field_name_as_string),
305+
Self::get_field_start_with_jump_distance(#previous_field_name),
251306
// _ *prev_field_start prev_field_size
252307
[crate::triton_vm::isa::instruction::LabelledInstruction::Instruction(crate::triton_vm::isa::instruction::AnInstruction::Add)].to_vec(),
253308
// _ *current_field_start
@@ -307,9 +362,7 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
307362

308363
let integral_size_indicators_code = generate_integral_size_indicators_code(&parse_result);
309364

310-
let name = &ast.ident;
311-
let name_as_string = ast.ident.to_string();
312-
let gen = quote! {
365+
quote! {
313366
impl #impl_generics crate::tasm_lib::structure::tasm_object::TasmObject
314367
for #name #ty_generics #new_where_clause {
315368
fn label_friendly_name() -> String {
@@ -343,56 +396,13 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
343396
fn get_field(
344397
field_name: &str
345398
) -> ::std::vec::Vec<crate::triton_vm::isa::instruction::LabelledInstruction> {
346-
let field_getter = match field_name {
347-
#( #just_field_clauses ,)*
348-
unknown_field_name => panic!("Cannot match on field name `{unknown_field_name}`."),
349-
};
350-
let hint_appendix = [
351-
crate::triton_vm::isa::instruction::LabelledInstruction::TypeHint(
352-
crate::triton_vm::isa::instruction::TypeHint {
353-
starting_index: 0,
354-
length: 1,
355-
type_name: ::std::option::Option::<::std::string::String>::None,
356-
variable_name: ::std::string::String::from(field_name),
357-
}
358-
)
359-
].to_vec();
360-
[
361-
field_getter,
362-
hint_appendix,
363-
].concat()
399+
#get_field_code
364400
}
365401

366402
fn get_field_with_size(
367403
field_name: &str
368404
) -> ::std::vec::Vec<crate::triton_vm::isa::instruction::LabelledInstruction> {
369-
let field_getter = match field_name {
370-
#( #field_with_size_clauses ,)*
371-
unknown_field_name => panic!("Cannot match on field name `{unknown_field_name}`."),
372-
};
373-
let hint_appendix = [
374-
crate::triton_vm::isa::instruction::LabelledInstruction::TypeHint(
375-
crate::triton_vm::isa::instruction::TypeHint {
376-
starting_index: 0,
377-
length: 1,
378-
type_name: ::std::option::Option::Some(::std::string::String::from("u32")),
379-
variable_name: ::std::string::String::from("size"),
380-
}
381-
),
382-
crate::triton_vm::isa::instruction::LabelledInstruction::TypeHint(
383-
crate::triton_vm::isa::instruction::TypeHint {
384-
starting_index: 1,
385-
length: 1,
386-
type_name: ::std::option::Option::<::std::string::String>::None,
387-
variable_name: ::std::string::String::from(field_name),
388-
}
389-
)
390-
].to_vec();
391-
392-
[
393-
field_getter,
394-
hint_appendix
395-
].concat()
405+
#get_field_with_size_code
396406
}
397407

398408
fn get_field_start_with_jump_distance(
@@ -404,9 +414,7 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
404414
}
405415
}
406416
}
407-
};
408-
409-
gen
417+
}
410418
}
411419

412420
fn generate_parse_result(ast: &DeriveInput) -> ParseResult {

0 commit comments

Comments
 (0)