public Type RegisterType(CILClass cilClass, CILProgramInstance programInstance, CILantroType cilantroType) { var parentTypeAssembly = Assembly.Load(cilClass.Extends.AssemblyName); var parentType = parentTypeAssembly.GetType(cilClass.Extends.ClassName); var typeBuilder = _moduleBuilder.DefineType(cilClass.ClassName.ClassName, TypeAttributes.Class, parentType); foreach (var method in parentType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { if (method.IsAbstract) { //typeBuilder.DefineMethodOverride(method, method); var methodBuilder = typeBuilder.DefineMethod(method.Name, (method.Attributes & (~MethodAttributes.Abstract)), method.ReturnType, method.GetParameters().Select(p => p.ParameterType).ToArray()); var msil = methodBuilder.GetILGenerator(); msil.ThrowException(typeof(NotImplementedException)); typeBuilder.DefineMethodOverride(methodBuilder, method); //var cilMethods = cilClass.Methods.Select(m => new CILantroMethodInfo(m, programInstance, typeBuilder)).ToList(); //var cilMethod = cilMethods.SingleOrDefault(m => m.Name == method.Name && CILantroType.CompareArgumentTypes(m.GetParameters().Select(p => p.ParameterType).ToArray(), method.GetParameters().Select(p => p.ParameterType).ToArray())); //typeBuilder.DefineMethodOverride(cilMethod, method); } } var type = typeBuilder.CreateType(); return(type); }
public CILantroMethodInfo(CILMethod cilMethod, CILProgramInstance programInstance, Type declaringType) { _cilMethod = cilMethod; _programInstance = programInstance; _declaringType = declaringType; Method = cilMethod; }
public CILantroType(CILClass cilClass, CILProgramInstance programInstance) { _programInstance = programInstance; _cilClass = cilClass; _fields = _cilClass.Fields.Select(f => new CILantroFieldInfo(f, cilClass)).ToList(); _constructors = _cilClass.Constructors.Select(c => new CILantroConstructorInfo(c, _programInstance)).ToList(); var methods = _cilClass.Methods.Select(m => new CILantroMethodInfo(m, _programInstance, this)).ToList(); var constructorMethods = _cilClass.Constructors.Select(m => new CILantroMethodInfo(m, _programInstance, this)).ToList(); _methods = methods.Union(constructorMethods).ToList(); }
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 Type GetTypeSpecified(CILProgramInstance programInstance) { if (Type != null) { return(Type.GetRuntimeType(programInstance)); } if (ClassName != null) { var customType = programInstance.GetCustomType(ClassName); if (customType != null) { return(customType); } var reflectedAssembly = Assembly.Load(ClassName.AssemblyName); return(reflectedAssembly.GetType(ClassName.ClassName)); } throw new ArgumentException("Cannot get type specified."); }
public Type GetRuntimeType(CILProgramInstance programInstance) { if (SimpleType != null) { return(SimpleType); } if (ClassName != null) { var customType = programInstance.GetCustomType(ClassName); if (customType != null) { return(customType); } var reflectedAssembly = Assembly.Load(ClassName.AssemblyName); return(reflectedAssembly.GetType(ClassName.ClassName)); } throw new NotImplementedException("Complex types are not supported yet."); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { return(instructionInstance.GetInstructionInstanceByBranchTarget(Label)); }
public CILantroParameterInfo(CILType cilType, CILProgramInstance programInstance) { _cilType = cilType; _programInstance = programInstance; }
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 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 value = state.Stack.Pop(); ParentMethod.Locals[VariableId] = value; return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { state.Stack.Push(instructionInstance.MethodInstance.Arguments[VariableId]); 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); if (intValue1 != intValue2) { return(instructionInstance.GetInstructionInstanceByBranchTarget(Label)); } return(instructionInstance.GetNextInstructionInstance()); }
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) { 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 reflectedType = TypeSpecification.GetTypeSpecified(programInstance); var reflectedMethod = (MethodBase)reflectedType.GetMethod(MethodName, GetMethodArgumentRuntimeTypes(programInstance).ToArray()); if (reflectedMethod == null && MethodName.Equals(".ctor")) { var reflectedConstructor = reflectedType.GetConstructor(GetMethodArgumentRuntimeTypes(programInstance).ToArray()); if (reflectedConstructor == null) { reflectedConstructor = reflectedType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, GetMethodArgumentRuntimeTypes(programInstance).ToArray(), null); } reflectedMethod = (MethodBase)reflectedConstructor; } 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(); if (reflectedMethod is CILantroMethodInfo) { callStack.Push(instructionInstance.GetNextInstructionInstance()); object obj = null; if (CallConvention.Instance) { obj = state.Stack.Pop(); } var cilantroMethod = reflectedMethod as CILantroMethodInfo; return(cilantroMethod.Method.CreateInstance(obj, methodArguments.ToArray()).GetFirstInstructionInstance()); } 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; } var methodResult = reflectedMethod.Invoke(methodObjectToCall, methodArguments.ToArray()); if (MethodReturnType.GetRuntimeType(programInstance) != typeof(void)) { state.Stack.Push(methodResult); } else if (MethodName.Equals(".ctor")) { state.Stack.Push(methodObject); } return(instructionInstance.GetNextInstructionInstance()); }
public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack) { var instance = state.Stack.Pop(); var cilClassInstance = instance as CILClassInstance; var address = cilClassInstance.GetField(FieldName); state.Stack.Push(address); return(instructionInstance.GetNextInstructionInstance()); }
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) { var typeSpecified = OwnerType.TypeSpecification.GetTypeSpecified(programInstance); var typeHandle = typeSpecified.TypeHandle; state.Stack.Push(typeHandle); return(instructionInstance.GetNextInstructionInstance()); }
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 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) { 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 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 = (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 CILantroConstructorInfo(CILMethod cilMethod, CILProgramInstance programInstance) { _programInstance = programInstance; Method = cilMethod; }
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 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) { 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 result = ConvertHelper.ToUnsignedLong(value); state.Stack.Push(result); return(instructionInstance.GetNextInstructionInstance()); }