@@ -116,6 +116,26 @@ void Disassembler::DumpMethod(MethodGenerationContext* mgenc,
116116 dumpMethod (bytecodes.data (), bytecodes.size (), indent, nullptr , true );
117117}
118118
119+ static void PrintFieldAccess (VMMethod* method, bool printObjects,
120+ uint8_t const fieldIdx) {
121+ if (method != nullptr && printObjects) {
122+ auto * holder = dynamic_cast <VMClass*>((VMObject*)method->GetHolder ());
123+ if (holder != nullptr ) {
124+ VMSymbol* name = holder->GetInstanceFieldName (fieldIdx);
125+ if (name != nullptr ) {
126+ DebugPrint (" (index: %d) field: %s\n " , fieldIdx,
127+ name->GetStdString ().c_str ());
128+ } else {
129+ DebugPrint (" (index: %d) field: !nullptr!: error!\n " , fieldIdx);
130+ }
131+ } else {
132+ DebugPrint (" (index: %d) block holder is not a class!!\n " , fieldIdx);
133+ }
134+ } else {
135+ DebugPrint (" (index: %d)\n " , fieldIdx);
136+ }
137+ }
138+
119139void Disassembler::dumpMethod (uint8_t * bytecodes, size_t numberOfBytecodes,
120140 const char * indent, VMMethod* method,
121141 bool printObjects) {
@@ -152,7 +172,8 @@ void Disassembler::dumpMethod(uint8_t* bytecodes, size_t numberOfBytecodes,
152172 switch (bytecode) {
153173 case BC_PUSH_0:
154174 case BC_PUSH_1:
155- case BC_PUSH_NIL: {
175+ case BC_PUSH_NIL:
176+ case BC_RETURN_SELF: {
156177 // no more details to be printed
157178 break ;
158179 }
@@ -260,26 +281,12 @@ void Disassembler::dumpMethod(uint8_t* bytecodes, size_t numberOfBytecodes,
260281 case BC_POP_FIELD:
261282 case BC_PUSH_FIELD: {
262283 uint8_t const fieldIdx = bytecodes[bc_idx + 1 ];
263- if (method != nullptr && printObjects) {
264- auto * holder =
265- dynamic_cast <VMClass*>((VMObject*)method->GetHolder ());
266- if (holder != nullptr ) {
267- VMSymbol* name = holder->GetInstanceFieldName (fieldIdx);
268- if (name != nullptr ) {
269- DebugPrint (" (index: %d) field: %s\n " , fieldIdx,
270- name->GetStdString ().c_str ());
271- } else {
272- DebugPrint (" (index: %d) field: !nullptr!: error!\n " ,
273- fieldIdx);
274- }
275- } else {
276- DebugPrint (
277- " (index: %d) block holder is not a class!!\n " ,
278- fieldIdx);
279- }
280- } else {
281- DebugPrint (" (index: %d)\n " , fieldIdx);
282- }
284+ PrintFieldAccess (method, printObjects, fieldIdx);
285+ break ;
286+ }
287+ case BC_POP_FIELD_1:
288+ case BC_PUSH_FIELD_1: {
289+ PrintFieldAccess (method, printObjects, 1 );
283290 break ;
284291 }
285292 case BC_SEND:
@@ -399,6 +406,16 @@ void Disassembler::printNth(uint8_t idx, VMFrame* frame, const char* op) {
399406 DebugPrint (" >\n " );
400407}
401408
409+ void Disassembler::printConstantAccess (vm_oop_t constant, uint8_t index) {
410+ VMClass* c = CLASS_OF (constant);
411+ VMSymbol* cname = c->GetName ();
412+
413+ DebugPrint (" (index: %d) value: (%s) " , index,
414+ cname->GetStdString ().c_str ());
415+ dispatch (constant);
416+ DebugPrint (" \n " );
417+ }
418+
402419/* *
403420 * Dump bytecode from the frame running
404421 */
@@ -528,13 +545,22 @@ void Disassembler::DumpBytecode(VMFrame* frame, VMMethod* method,
528545 }
529546 case BC_PUSH_CONSTANT: {
530547 vm_oop_t constant = method->GetConstant (bc_idx);
531- VMClass* c = CLASS_OF (constant);
532- VMSymbol* cname = c->GetName ();
533-
534- DebugPrint (" (index: %d) value: (%s) " , BC_1,
535- cname->GetStdString ().c_str ());
536- dispatch (constant);
537- DebugPrint (" \n " );
548+ printConstantAccess (constant, BC_1);
549+ break ;
550+ }
551+ case BC_PUSH_CONSTANT_0: {
552+ vm_oop_t constant = method->GetIndexableField (0 );
553+ printConstantAccess (constant, 0 );
554+ break ;
555+ }
556+ case BC_PUSH_CONSTANT_1: {
557+ vm_oop_t constant = method->GetIndexableField (1 );
558+ printConstantAccess (constant, 1 );
559+ break ;
560+ }
561+ case BC_PUSH_CONSTANT_2: {
562+ vm_oop_t constant = method->GetIndexableField (2 );
563+ printConstantAccess (constant, 2 );
538564 break ;
539565 }
540566 case BC_PUSH_GLOBAL: {
0 commit comments