@@ -319,6 +319,7 @@ where
319319 } ;
320320
321321 * operand = new_value;
322+ context. retire_op ( op) ;
322323 }
323324 Opcode :: LAnd
324325 | Opcode :: LOr
@@ -358,6 +359,7 @@ where
358359 // TODO: use potentially-updated result for return value here
359360 self . do_store ( target, result. clone ( ) ) ?;
360361 context. contribute_arg ( Argument :: Object ( result) ) ;
362+ context. retire_op ( op) ;
361363 }
362364 Opcode :: FromBCD => self . do_from_bcd ( & mut context, op) ?,
363365 Opcode :: ToBCD => self . do_to_bcd ( & mut context, op) ?,
@@ -368,6 +370,7 @@ where
368370
369371 let name = name. resolve ( & context. current_scope ) ?;
370372 self . namespace . lock ( ) . insert ( name, object. clone ( ) ) ?;
373+ context. retire_op ( op) ;
371374 }
372375 Opcode :: Fatal => {
373376 let [ Argument :: ByteData ( typ) , Argument :: DWordData ( code) , Argument :: Object ( arg) ] =
@@ -377,6 +380,7 @@ where
377380 } ;
378381 let arg = arg. as_integer ( ) ?;
379382 self . handler . handle_fatal_error ( * typ, * code, arg) ;
383+ context. retire_op ( op) ;
380384 }
381385 Opcode :: OpRegion => {
382386 let [
@@ -396,6 +400,7 @@ where
396400 parent_device_path : context. current_scope . clone ( ) ,
397401 } ) ;
398402 self . namespace . lock ( ) . insert ( name. resolve ( & context. current_scope ) ?, region. wrap ( ) ) ?;
403+ context. retire_op ( op) ;
399404 }
400405 Opcode :: DataRegion => {
401406 let [
@@ -423,6 +428,7 @@ where
423428 parent_device_path : context. current_scope . clone ( ) ,
424429 } ) ;
425430 self . namespace . lock ( ) . insert ( name. resolve ( & context. current_scope ) ?, region. wrap ( ) ) ?;
431+ context. retire_op ( op) ;
426432 }
427433 Opcode :: Buffer => {
428434 let [
@@ -444,6 +450,7 @@ where
444450 context. current_block . pc += buffer_len;
445451
446452 context. contribute_arg ( Argument :: Object ( Object :: Buffer ( buffer) . wrap ( ) ) ) ;
453+ context. retire_op ( op) ;
447454 }
448455 Opcode :: Package | Opcode :: VarPackage => {
449456 let mut elements = Vec :: with_capacity ( op. expected_arguments ) ;
@@ -467,6 +474,7 @@ where
467474 assert_eq ! ( context. peek( ) , Err ( AmlError :: RunOutOfStream ) ) ;
468475 context. current_block = context. block_stack . pop ( ) . unwrap ( ) ;
469476 context. contribute_arg ( Argument :: Object ( Object :: Package ( elements) . wrap ( ) ) ) ;
477+ context. retire_op ( op) ;
470478 }
471479 Opcode :: If => {
472480 let [
@@ -501,6 +509,7 @@ where
501509 Err ( other) => Err ( other) ?,
502510 }
503511 }
512+ context. retire_op ( op) ;
504513 }
505514 opcode @ Opcode :: CreateBitField
506515 | opcode @ Opcode :: CreateByteField
@@ -524,6 +533,7 @@ where
524533 name. resolve ( & context. current_scope ) ?,
525534 Object :: BufferField { buffer : buffer. clone ( ) , offset : offset as usize , length } . wrap ( ) ,
526535 ) ?;
536+ context. retire_op ( op) ;
527537 }
528538 Opcode :: CreateField => {
529539 let [ Argument :: Object ( buffer) , Argument :: Object ( bit_index) , Argument :: Object ( num_bits) ] =
@@ -544,16 +554,19 @@ where
544554 }
545555 . wrap ( ) ,
546556 ) ?;
557+ context. retire_op ( op) ;
547558 }
548559 Opcode :: Store => {
549560 let [ Argument :: Object ( object) , target] = & op. arguments [ ..] else { panic ! ( ) } ;
550561 self . do_store ( & target, object. clone ( ) ) ?;
562+ context. retire_op ( op) ;
551563 }
552564 Opcode :: RefOf => {
553565 let [ Argument :: Object ( object) ] = & op. arguments [ ..] else { panic ! ( ) } ;
554566 let reference =
555567 Object :: Reference { kind : ReferenceKind :: RefOf , inner : object. clone ( ) } . wrap ( ) ;
556568 context. contribute_arg ( Argument :: Object ( reference) ) ;
569+ context. retire_op ( op) ;
557570 }
558571 Opcode :: CondRefOf => {
559572 let [ Argument :: Object ( object) , target] = & op. arguments [ ..] else { panic ! ( ) } ;
@@ -566,6 +579,7 @@ where
566579 Object :: Integer ( u64:: MAX )
567580 } ;
568581 context. contribute_arg ( Argument :: Object ( result. wrap ( ) ) ) ;
582+ context. retire_op ( op) ;
569583 }
570584 Opcode :: DerefOf => {
571585 let [ Argument :: Object ( object) ] = & op. arguments [ ..] else { panic ! ( ) } ;
@@ -582,14 +596,17 @@ where
582596 } ) ;
583597 } ;
584598 context. contribute_arg ( Argument :: Object ( result) ) ;
599+ context. retire_op ( op) ;
585600 }
586601 Opcode :: Sleep => {
587602 let [ Argument :: Object ( msec) ] = & op. arguments [ ..] else { panic ! ( ) } ;
588603 self . handler . sleep ( msec. as_integer ( ) ?) ;
604+ context. retire_op ( op) ;
589605 }
590606 Opcode :: Stall => {
591607 let [ Argument :: Object ( usec) ] = & op. arguments [ ..] else { panic ! ( ) } ;
592608 self . handler . stall ( usec. as_integer ( ) ?) ;
609+ context. retire_op ( op) ;
593610 }
594611 Opcode :: Acquire => {
595612 let [ Argument :: Object ( mutex) ] = & op. arguments [ ..] else { panic ! ( ) } ;
@@ -600,6 +617,7 @@ where
600617
601618 // TODO: should we do something with the sync level??
602619 self . handler . acquire ( mutex, timeout) ?;
620+ context. retire_op ( op) ;
603621 }
604622 Opcode :: Release => {
605623 let [ Argument :: Object ( mutex) ] = & op. arguments [ ..] else { panic ! ( ) } ;
@@ -608,6 +626,7 @@ where
608626 } ;
609627 // TODO: should we do something with the sync level??
610628 self . handler . release ( mutex) ;
629+ context. retire_op ( op) ;
611630 }
612631 Opcode :: InternalMethodCall => {
613632 let [ Argument :: Object ( method) , Argument :: Namestring ( method_scope) ] = & op. arguments [ 0 ..2 ]
@@ -632,6 +651,7 @@ where
632651 MethodContext :: new_from_method ( method. clone ( ) , args, method_scope. clone ( ) ) ?;
633652 let old_context = mem:: replace ( & mut context, new_context) ;
634653 self . context_stack . lock ( ) . push ( old_context) ;
654+ context. retire_op ( op) ;
635655 }
636656 Opcode :: Return => {
637657 let [ Argument :: Object ( object) ] = & op. arguments [ ..] else { panic ! ( ) } ;
@@ -640,6 +660,7 @@ where
640660 if let Some ( last) = self . context_stack . lock ( ) . pop ( ) {
641661 context = last;
642662 context. contribute_arg ( Argument :: Object ( object. clone ( ) ) ) ;
663+ context. retire_op ( op) ;
643664 } else {
644665 /*
645666 * If this is the top-most context, this is a `Return` from the actual
@@ -675,6 +696,7 @@ where
675696 } ;
676697
677698 context. contribute_arg ( Argument :: Object ( Object :: Integer ( typ) . wrap ( ) ) ) ;
699+ context. retire_op ( op) ;
678700 }
679701 Opcode :: SizeOf => self . do_size_of ( & mut context, op) ?,
680702 Opcode :: Index => self . do_index ( & mut context, op) ?,
@@ -701,6 +723,7 @@ where
701723
702724 let kind = FieldUnitKind :: Bank { region, bank, bank_value } ;
703725 self . parse_field_list ( & mut context, kind, * start_pc, * pkg_length, field_flags) ?;
726+ context. retire_op ( op) ;
704727 }
705728 Opcode :: While => {
706729 /*
@@ -713,6 +736,7 @@ where
713736 if predicate == 0 {
714737 // Exit from the while loop by skipping out of the current block
715738 context. current_block = context. block_stack . pop ( ) . unwrap ( ) ;
739+ context. retire_op ( op) ;
716740 }
717741 }
718742 _ => panic ! ( "Unexpected operation has created in-flight op!" ) ,
@@ -1409,6 +1433,7 @@ where
14091433 // TODO: use result for arg
14101434 self . do_store ( target, result. clone ( ) ) ?;
14111435 context. contribute_arg ( Argument :: Object ( result) ) ;
1436+ context. retire_op ( op) ;
14121437 Ok ( ( ) )
14131438 }
14141439
@@ -1450,6 +1475,7 @@ where
14501475 } ;
14511476
14521477 context. contribute_arg ( Argument :: Object ( Object :: Integer ( result) . wrap ( ) ) ) ;
1478+ context. retire_op ( op) ;
14531479 Ok ( ( ) )
14541480 }
14551481
@@ -1459,12 +1485,8 @@ where
14591485 let operand = operand. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
14601486 let result = if operand == 0 { u64:: MAX } else { 0 } ;
14611487
1462- if let Some ( prev_op) = context. in_flight . last_mut ( ) {
1463- if prev_op. arguments . len ( ) < prev_op. expected_arguments {
1464- prev_op. arguments . push ( Argument :: Object ( Object :: Integer ( result) . wrap ( ) ) ) ;
1465- }
1466- }
1467-
1488+ context. contribute_arg ( Argument :: Object ( Object :: Integer ( result) . wrap ( ) ) ) ;
1489+ context. retire_op ( op) ;
14681490 return Ok ( ( ) ) ;
14691491 }
14701492
@@ -1526,6 +1548,7 @@ where
15261548 let result = if result { Object :: Integer ( u64:: MAX ) } else { Object :: Integer ( 0 ) } ;
15271549
15281550 context. contribute_arg ( Argument :: Object ( result. wrap ( ) ) ) ;
1551+ context. retire_op ( op) ;
15291552 Ok ( ( ) )
15301553 }
15311554
@@ -1558,6 +1581,7 @@ where
15581581 // TODO: use result of store
15591582 self . do_store ( target, result. clone ( ) ) ?;
15601583 context. contribute_arg ( Argument :: Object ( result) ) ;
1584+ context. retire_op ( op) ;
15611585 Ok ( ( ) )
15621586 }
15631587
@@ -1601,6 +1625,7 @@ where
16011625 // TODO: use result of store
16021626 self . do_store ( target, result. clone ( ) ) ?;
16031627 context. contribute_arg ( Argument :: Object ( result) ) ;
1628+ context. retire_op ( op) ;
16041629 Ok ( ( ) )
16051630 }
16061631
@@ -1627,6 +1652,7 @@ where
16271652 // TODO: use result of store
16281653 self . do_store ( target, result. clone ( ) ) ?;
16291654 context. contribute_arg ( Argument :: Object ( result) ) ;
1655+ context. retire_op ( op) ;
16301656 Ok ( ( ) )
16311657 }
16321658
@@ -1670,6 +1696,7 @@ where
16701696 // TODO: use result of store
16711697 self . do_store ( target, result. clone ( ) ) ?;
16721698 context. contribute_arg ( Argument :: Object ( result) ) ;
1699+ context. retire_op ( op) ;
16731700 Ok ( ( ) )
16741701 }
16751702
@@ -1707,6 +1734,7 @@ where
17071734
17081735 self . do_store ( target, result. clone ( ) ) ?;
17091736 context. contribute_arg ( Argument :: Object ( result) ) ;
1737+ context. retire_op ( op) ;
17101738
17111739 Ok ( ( ) )
17121740 }
@@ -1736,6 +1764,7 @@ where
17361764 Object :: Debug => "[Debug Object]" . to_string ( ) ,
17371765 }
17381766 }
1767+
17391768 let result = match source1. typ ( ) {
17401769 ObjectType :: Integer => {
17411770 let source1 = source1. as_integer ( ) ?;
@@ -1764,6 +1793,7 @@ where
17641793 // TODO: use result of store
17651794 self . do_store ( target, result. clone ( ) ) ?;
17661795 context. contribute_arg ( Argument :: Object ( result) ) ;
1796+ context. retire_op ( op) ;
17671797 Ok ( ( ) )
17681798 }
17691799
@@ -1780,6 +1810,7 @@ where
17801810 }
17811811
17821812 context. contribute_arg ( Argument :: Object ( Object :: Integer ( result) . wrap ( ) ) ) ;
1813+ context. retire_op ( op) ;
17831814 Ok ( ( ) )
17841815 }
17851816
@@ -1796,6 +1827,7 @@ where
17961827 }
17971828
17981829 context. contribute_arg ( Argument :: Object ( Object :: Integer ( result) . wrap ( ) ) ) ;
1830+ context. retire_op ( op) ;
17991831 Ok ( ( ) )
18001832 }
18011833
@@ -1811,6 +1843,7 @@ where
18111843 } ;
18121844
18131845 context. contribute_arg ( Argument :: Object ( Object :: Integer ( result as u64 ) . wrap ( ) ) ) ;
1846+ context. retire_op ( op) ;
18141847 Ok ( ( ) )
18151848 }
18161849
@@ -1861,6 +1894,7 @@ where
18611894
18621895 self . do_store ( target, result. clone ( ) ) ?;
18631896 context. contribute_arg ( Argument :: Object ( result) ) ;
1897+ context. retire_op ( op) ;
18641898 Ok ( ( ) )
18651899 }
18661900
@@ -2374,9 +2408,19 @@ impl MethodContext {
23742408 }
23752409
23762410 fn start_in_flight_op ( & mut self , op : OpInFlight ) {
2411+ trace ! (
2412+ "START OP: {:?}, args: {:?}, with {} more needed" ,
2413+ op. op,
2414+ op. arguments,
2415+ op. expected_arguments - op. arguments. len( )
2416+ ) ;
23772417 self . in_flight . push ( op) ;
23782418 }
23792419
2420+ fn retire_op ( & mut self , op : OpInFlight ) {
2421+ trace ! ( "RETIRE OP: {:?}, args: {:?}" , op. op, op. arguments) ;
2422+ }
2423+
23802424 fn start_new_block ( & mut self , kind : BlockKind , length : usize ) {
23812425 let block = Block {
23822426 stream : & self . current_block . stream ( ) [ ..( self . current_block . pc + length) ] as * const [ u8 ] ,
0 commit comments