コード例 #1
0
ファイル: vm_opcode.py プロジェクト: bstockus/vm
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")
コード例 #2
0
ファイル: vm_opcode.py プロジェクト: bstockus/vm
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")