protected override void VisitLoadTokenInstruction(LoadTokenInstruction instruction) { if (instruction.TypeSpec != null) { if (_program.IsExternalType(instruction.TypeSpec.ClassName)) { var type = ReflectionHelper.GetExternalType(instruction.TypeSpec.ClassName); var result = new CilValueExternal(type.TypeHandle); ControlState.EvaluationStack.PushValue(result); ControlState.MoveToNextInstruction(); } else { var @class = _program.Classes.Single(c => c.Name.ToString() == instruction.TypeSpec.ClassName.ToString()); var runtimeType = @class.BuildRuntimeType(_program, ManagedMemory); var runtimeHandle = runtimeType.TypeHandle; var result = new CilValueExternal(runtimeHandle); ControlState.EvaluationStack.PushValue(result); ControlState.MoveToNextInstruction(); } } else if (!string.IsNullOrEmpty(instruction.FieldId)) { if (_program.IsExternalType(instruction.FieldTypeSpec.ClassName)) { throw new System.NotImplementedException(); } else { var @class = _program.AllClasses.Single(c => c.Name.ToString() == instruction.FieldTypeSpec.ClassName.ToString()); var runtimeType = @class.BuildRuntimeType(_program, ManagedMemory); throw new System.NotImplementedException(); var runtimeHandle = runtimeType.TypeHandle; var result = new CilValueExternal(runtimeHandle); ControlState.EvaluationStack.PushValue(result); ControlState.MoveToNextInstruction(); } } else { throw new System.NotImplementedException(); } }
public override IValue CreateDefaultValue(CilProgram program) { if (program.IsExternalType(ClassName)) { var type = ReflectionHelper.GetExternalType(ClassName); var getDefault = GetType().GetMethod(nameof(GetDefaultGeneric), BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type); var defaultValue = getDefault.Invoke(null, null); return(new CilValueExternal(defaultValue)); } var @class = program.AllClasses.Single(c => c.Name.ToString() == ClassName.ToString()); if (@class.IsInterface) { return(new CilValueNull()); } if (IsValueType(program)) { var emptyInstance = new CilClassInstance(@class, program, null); return(new CilValueValueType(emptyInstance)); } return(new CilValueNull()); }
public override Type GetRuntimeType(CilProgram program) { if (program.IsExternalType(ClassName)) { return(ReflectionHelper.GetExternalType(ClassName)); } throw new NotImplementedException(); }
public override IValue CreateValueFromRuntime(object obj, CilManagedMemory managedMemory, CilProgram program) { if (program.IsExternalType(ClassName)) { return(new CilValueExternal(obj)); } throw new NotImplementedException(); }
public override Type GetValueType(CilProgram program) { if (program.IsExternalType(ClassName)) { return(typeof(CilValueExternal)); } return(typeof(CilValueValueType)); }
public override IValue CreateValueFromRuntime(object obj, CilManagedMemory managedMemory, CilProgram program) { if (program.IsExternalType(ClassName)) { var cilObj = new CilObjectExternal(obj); var objRef = managedMemory.Store(cilObj); return(objRef); } throw new NotImplementedException(); }
public override void VisitCallInstruction(CallInstruction instruction) { var callExternal = _program.IsExternalType(instruction.TypeSpec); var methodArgs = PopMethodArgs(instruction); IValue thisVal = null; if (instruction.CallConv.IsInstance) { ControlState.EvaluationStack.PopValue(_program, instruction.TypeSpec.GetCilType(_program), out thisVal); } if (callExternal) { var result = CallExternalMethod(instruction, thisVal, methodArgs.ToArray(), null); if (!(instruction.ReturnType is CilTypeVoid)) { var resultVal = instruction.ReturnType.CreateValueFromRuntime(result, ManagedMemory, _program); ControlState.EvaluationStack.PushValue(resultVal); } ControlState.MoveToNextInstruction(); } else { var @class = _program.Classes.Single(c => c.Name.ToString() == instruction.TypeSpec.ClassName.ToString()); var method = @class.Methods.Single(m => m.Name == instruction.MethodName && AreArgumentsAssignable(instruction.SigArgs, m.Arguments)); var sigArgsWithThis = CompleteSigArgs(instruction, method); var argsWithThis = CompleteArgs(instruction, methodArgs, thisVal); var newMethodState = new CilMethodState(method, sigArgsWithThis, argsWithThis, _program); ControlState.MoveToNextInstruction(); ControlState.CallStack.Push(newMethodState); } }
public override IValue CreateDefaultValue(CilProgram program) { if (program.IsExternalType(ClassName)) { var type = ReflectionHelper.GetExternalType(ClassName); var getDefault = GetType().GetMethod(nameof(GetDefaultGeneric), BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type); var defaultValue = getDefault.Invoke(null, null); return(new CilValueExternal(defaultValue)); } var classType = new CilTypeClass(ClassName); return(classType.CreateDefaultValue(program)); }
protected override void VisitLoadStaticFieldInstruction(LoadStaticFieldInstruction instruction) { if (_program.IsExternalType(instruction.ClassTypeSpec.ClassName)) { var @class = ReflectionHelper.GetExternalType(instruction.ClassTypeSpec.ClassName); var field = @class.GetField(instruction.FieldId, BindingFlags.Static | BindingFlags.Public); var externalValue = field.GetValue(null); var value = instruction.FieldType.CreateValueFromRuntime(externalValue, ManagedMemory, _program); ControlState.EvaluationStack.PushValue(value); ControlState.MoveToNextInstruction(); } else { var value = ControlState.StaticInstances[instruction.ClassTypeSpec.ClassName.ToString()].StaticFields[instruction.FieldId]; ControlState.EvaluationStack.PushValue(value); ControlState.MoveToNextInstruction(); } }