public void StartInterpreter(CILProgram cilProgram, StreamReader reader, StreamWriter writer) { State = new CILProgramState(); Program = cilProgram; StreamReader = reader; StreamWriter = writer; Interpret(); }
public override CILInstruction Execute(CILProgram program, CILProgramState state) { var argument = state.Stack.Pop(); state.Stack.Push(argument); state.Stack.Push(argument); return(Method.GetNextInstruction(this)); }
public override CILInstruction Execute(CILProgram program, CILProgramState state) { var value = (int)state.Stack.Pop(); if (value == 0) { return(Method.GetInstructionByBranchTarget(this, Target)); } return(Method.GetNextInstruction(this)); }
public override CILInstruction Execute(CILProgram program, CILProgramState state) { var value1 = state.Stack.Pop(); var value2 = state.Stack.Pop(); if (!value1.Equals(value2)) { return(Method.GetInstructionByBranchTarget(this, Target)); } return(Method.GetNextInstruction(this)); }
public override CILInstruction Execute(CILProgram program, CILProgramState state) { var argument1 = (int)state.Stack.Pop(); var argument2 = (int)state.Stack.Pop(); var result = argument1 + argument2; state.Stack.Push(result); return(Method.GetNextInstruction(this)); }
public void Interpret(CILProgramInstance programInstance, StreamReader inputStream, StreamWriter outputStrem) { var state = new CILProgramState(); var callStack = new Stack <CILInstructionInstance>(); var entryPointInstance = programInstance.CreateEntryPointInstance(); var instructionInstance = entryPointInstance.GetFirstInstructionInstance(); while (instructionInstance != null) { instructionInstance = instructionInstance.Execute(state, programInstance, callStack); } }
public override CILInstruction Execute(CILProgram program, CILProgramState state) { var reflectedAssembly = Assembly.Load(AssemblyName); var reflectedClass = reflectedAssembly.GetType(ClassName); var reflectedMethod = reflectedClass.GetMethod(MethodName, ArgumentsTypes); var argumentsList = new List <object>(); for (int i = 0; i < ArgumentsTypes.Length; i++) { var argument = state.Stack.Pop(); argumentsList.Add(argument); } var result = reflectedMethod.Invoke(null, argumentsList.ToArray()); if (reflectedMethod.ReturnType != typeof(void)) { state.Stack.Push(result); } return(Method.GetNextInstruction(this)); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var reflectedType = FieldOwnerTypeSpecification.GetTypeSpecified(programInstance); var reflectedField = reflectedType.GetField(FieldName, BindingFlags.Static); var value = reflectedField.GetValue(null); state.Stack.Push(value); return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstruction Execute(CILProgram program, CILProgramState state) { state.Stack.Push(4); return(Method.GetNextInstruction(this)); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var reflectedType = TypeSpecification.GetTypeSpecified(programInstance); var reflectedMethod = (MethodBase)reflectedType.GetMethod(MethodName, GetMethodArgumentRuntimeTypes(programInstance).ToArray()); if (reflectedMethod == null && MethodName.Equals(".ctor") && ParentMethod.IsConstructor) { return(instructionInstance.GetNextInstructionInstance()); } var methodArguments = new List <object>(); for (int i = 0; i < MethodArgumentTypes.Count; i++) { var argumentType = GetMethodArgumentRuntimeTypes(programInstance)[MethodArgumentTypes.Count - i - 1]; var argument = state.Stack.Pop(); var methodArgument = ConvertHelper.ConvertIfPossible(argument, argumentType); methodArguments.Add(methodArgument); } methodArguments.Reverse(); object methodObject = null; if (CallConvention.Instance) { methodObject = state.Stack.Pop(); if (methodObject is Guid) { var objectAddress = (Guid)methodObject; methodObject = ParentMethod.GetLocalByAddress(objectAddress); } } var methodObjectToCall = methodObject; if (methodObjectToCall is CILClassInstance) { methodObjectToCall = (methodObjectToCall as CILClassInstance).BaseInstance; } if (methodObject is CILClassInstance) { var cilClass = (methodObject as CILClassInstance)._cilClass; var cilMethod = cilClass.Methods.SingleOrDefault(m => m.MethodName == this.MethodName && CILantroType.CompareArgumentTypes(m.ArgumentTypes.Select(at => at.GetRuntimeType(programInstance)).ToArray(), this.GetMethodArgumentRuntimeTypes(programInstance).ToArray())); while (cilClass != null && cilMethod == null) { cilClass = cilClass.ExtendsClass; if (cilClass != null) { cilMethod = cilClass.Methods.SingleOrDefault(m => m.MethodName == this.MethodName && CILantroType.CompareArgumentTypes(m.ArgumentTypes.Select(at => at.GetRuntimeType(programInstance)).ToArray(), this.GetMethodArgumentRuntimeTypes(programInstance).ToArray())); } } if (cilMethod != null) { var newMethodInfo = new CILantroMethodInfo(cilMethod, programInstance, cilMethod.ReturnType.GetRuntimeType(programInstance)); reflectedMethod = newMethodInfo; } } if (reflectedMethod is CILantroMethodInfo) { callStack.Push(instructionInstance.GetNextInstructionInstance()); var cilantroMethodInfo = reflectedMethod as CILantroMethodInfo; CILMethod methodToCall = null; object obj = methodObject; //object obj = null; if (CallConvention.Instance) { //obj = state.Stack.Pop(); var cilClassInstance = obj as CILClassInstance; var cilClass = cilClassInstance._cilClass; while (cilClass != null) { var matchingMethod = cilClass.Methods.FirstOrDefault(m => m.MethodName.Equals(MethodName) && CILantroType.CompareArgumentTypes(GetMethodArgumentRuntimeTypes(programInstance).ToArray(), m.ArgumentTypes.Select(ct => ct.GetRuntimeType(programInstance)).ToArray())); if (matchingMethod != null) { methodToCall = matchingMethod; break; } cilClass = programInstance.Program.Classes.FirstOrDefault(c => c.ClassName.UniqueName == cilClass.Extends.UniqueName); } } if (methodToCall == null) { methodToCall = cilantroMethodInfo.Method; } return(methodToCall.CreateInstance(obj, methodArguments.ToArray()).GetFirstInstructionInstance()); } var methodResult = reflectedMethod.Invoke(methodObjectToCall, methodArguments.ToArray()); if (MethodReturnType.GetRuntimeType(programInstance) != typeof(void)) { state.Stack.Push(methodResult); } return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value2 = state.Stack.Pop(); var value1 = state.Stack.Pop(); var intValue1 = Convert.ToInt32(value1); var intValue2 = Convert.ToInt32(value2); var result = intValue1 + intValue2; state.Stack.Push(result); return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value2 = (int)state.Stack.Pop(); var value1 = (int)state.Stack.Pop(); var result = value1 < value2 ? 1 : 0; state.Stack.Push(result); return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { if (!ParentMethod.IsEntryPoint) { return(callStack.Pop()); } return(null); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var reflectedType = TypeSpecification.GetTypeSpecified(programInstance); var reflectedConstructor = reflectedType.GetConstructor(GetMethodArgumentRuntimeTypes(programInstance).ToArray()); var methodArguments = new List <object>(); for (int i = 0; i < MethodArgumentTypes.Count; i++) { var argument = state.Stack.Pop(); var methodArgument = argument; try { methodArgument = Convert.ChangeType(argument, GetMethodArgumentRuntimeTypes(programInstance)[MethodArgumentTypes.Count - i - 1]); } catch (Exception) { } methodArguments.Add(methodArgument); } methodArguments.Reverse(); if (reflectedConstructor is CILantroConstructorInfo) { callStack.Push(instructionInstance.GetNextInstructionInstance()); var cilantroConstructor = reflectedConstructor as CILantroConstructorInfo; return(cilantroConstructor.Method.CreateInstance(null, methodArguments.ToArray()).GetFirstInstructionInstance()); } var methodResult = reflectedConstructor.Invoke(methodArguments.ToArray()); state.Stack.Push(methodResult); return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value = state.Stack.Pop(); var result = ConvertHelper.ToUnsignedLong(value); state.Stack.Push(result); return(instructionInstance.GetNextInstructionInstance()); }
public abstract CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack);
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value = ParentMethod.Locals[3]; state.Stack.Push(value); return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value = state.Stack.Pop(); var intValue = Convert.ToInt32(value); if (intValue >= 0 && intValue < Labels.Count) { var switchLabel = Labels[intValue]; return(instructionInstance.GetInstructionInstanceByBranchTarget(switchLabel)); } return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { if (ParentMethod.CallConvention.Instance) { state.Stack.Push(instructionInstance.MethodInstance.Arguments[2]); } else { state.Stack.Push(instructionInstance.MethodInstance.Arguments[3]); } return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value = state.Stack.Pop(); ParentMethod.Locals[VariableId] = value; return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value = (int)state.Stack.Pop(); var index = (int)state.Stack.Pop(); var array = state.Stack.Pop() as Array; array.SetValue(value, index); return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { return(instructionInstance.GetInstructionInstanceByBranchTarget(Label)); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value = state.Stack.Pop(); var newType = TypeSpecification.GetTypeSpecified(programInstance); if (newType is CILantroType) { newType = (newType as CILantroType).GetRuntimeType(); } var newValue = Convert.ChangeType(value, newType); state.Stack.Push(newValue); return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { state.Stack.Push(Value); return(instructionInstance.GetNextInstructionInstance()); }
public CILInstructionInstance Execute(CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { return(Instruction.Execute(this, state, programInstance, callStack)); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var typeSpecified = OwnerType.TypeSpecification.GetTypeSpecified(programInstance); var typeHandle = typeSpecified.TypeHandle; state.Stack.Push(typeHandle); return(instructionInstance.GetNextInstructionInstance()); }
public abstract CILInstruction Execute(CILProgram program, CILProgramState state);
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var array = state.Stack.Pop() as Array; state.Stack.Push(array.Length); return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstruction Execute(CILProgram program, CILProgramState state) { return(Method.GetInstructionByBranchTarget(this, Target)); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var value2 = state.Stack.Pop(); var value1 = state.Stack.Pop(); var intValue1 = Convert.ToInt32(value1); var intValue2 = Convert.ToInt32(value2); if (intValue1 != intValue2) { return(instructionInstance.GetInstructionInstanceByBranchTarget(Label)); } return(instructionInstance.GetNextInstructionInstance()); }