@@ -179,6 +179,8 @@ fn generate_integral_size_indicators_code(parse_result: &ParseResult) -> TokenSt
179
179
180
180
fn impl_tasm_object_derive_macro ( ast : DeriveInput ) -> TokenStream {
181
181
let parse_result = generate_parse_result ( & ast) ;
182
+ let name = & ast. ident ;
183
+ let name_as_string = ast. ident . to_string ( ) ;
182
184
183
185
// generate clauses for match statements
184
186
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 {
216
218
}
217
219
}
218
220
} ) ;
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
+
219
243
let field_with_size_clauses = parse_result
220
244
. field_names
221
245
. iter ( )
@@ -231,23 +255,54 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
231
255
}
232
256
}
233
257
} ) ;
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
+
234
289
let field_starter_clauses = parse_result. field_names
235
290
. iter ( )
236
291
. zip ( parse_result. jumpers . iter ( ) )
237
292
. 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 ( ) ;
240
295
match index {
241
296
0 => quote ! {
242
- #name_as_string => { #jumper }
297
+ #field_name => { #jumper }
243
298
} ,
244
299
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 ( ) ;
246
301
quote ! {
247
- #name_as_string => {
302
+ #field_name => {
248
303
let prev =
249
304
[
250
- Self :: get_field_start_with_jump_distance( #previous_field_name_as_string ) ,
305
+ Self :: get_field_start_with_jump_distance( #previous_field_name ) ,
251
306
// _ *prev_field_start prev_field_size
252
307
[ crate :: triton_vm:: isa:: instruction:: LabelledInstruction :: Instruction ( crate :: triton_vm:: isa:: instruction:: AnInstruction :: Add ) ] . to_vec( ) ,
253
308
// _ *current_field_start
@@ -307,9 +362,7 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
307
362
308
363
let integral_size_indicators_code = generate_integral_size_indicators_code ( & parse_result) ;
309
364
310
- let name = & ast. ident ;
311
- let name_as_string = ast. ident . to_string ( ) ;
312
- let gen = quote ! {
365
+ quote ! {
313
366
impl #impl_generics crate :: tasm_lib:: structure:: tasm_object:: TasmObject
314
367
for #name #ty_generics #new_where_clause {
315
368
fn label_friendly_name( ) -> String {
@@ -343,56 +396,13 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
343
396
fn get_field(
344
397
field_name: & str
345
398
) -> :: 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
364
400
}
365
401
366
402
fn get_field_with_size(
367
403
field_name: & str
368
404
) -> :: 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
396
406
}
397
407
398
408
fn get_field_start_with_jump_distance(
@@ -404,9 +414,7 @@ fn impl_tasm_object_derive_macro(ast: DeriveInput) -> TokenStream {
404
414
}
405
415
}
406
416
}
407
- } ;
408
-
409
- gen
417
+ }
410
418
}
411
419
412
420
fn generate_parse_result ( ast : & DeriveInput ) -> ParseResult {
0 commit comments