def op_NEWOBJ(frame, opcode): type_ref_value = frame.pop_eval_stack_value() if vm_values.isRefValue(type_ref_value): type_block = type_ref_value.block() if isinstance(type_block, vm_blocks.Type): obj_ref_value = frame.get_pool().add_block(vm_blocks.Obj(type_block.instc_fields_count)) frame.push_eval_stack_value(obj_ref_value) else: raise vm_exception.VMException("InvalidOperationError", "InvalidBlockKind", opcode, "Frame") else: raise vm_exception.VMException("InvalidOperationError", "InvalidValueTypeOnEvalStack", opcode, "Frame")
def op_ST_FIELD(frame, opcode, operand): value = frame.pop_eval_stack_value() obj_ref_value = frame.pop_eval_stack_value() if vm_values.isRefValue(obj_ref_value): obj_block = obj_ref_value.block() if isinstance(obj_block, vm_blocks.Obj): if operand >= len(obj_block.instc_fields): raise vm_exception.VMException("InvalidOperationError", "FieldIndexIsOutOfBounds", opcode, "Frame") else: obj_block.instc_fields[operand] = value else: raise vm_exception.VMException("InvalidOperationError", "InvalidBlockKind", opcode, "Frame") else: raise vm_exception.VMException("InvalidOperationError", "InvalidValueTypeOnEvalStack", opcode, "Frame")