Пример #1
0
        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);
        }
Пример #2
0
 public CILantroMethodInfo(CILMethod cilMethod, CILProgramInstance programInstance, Type declaringType)
 {
     _cilMethod       = cilMethod;
     _programInstance = programInstance;
     _declaringType   = declaringType;
     Method           = cilMethod;
 }
Пример #3
0
        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();
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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.");
        }
Пример #6
0
        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.");
        }
Пример #7
0
 public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack)
 {
     return(instructionInstance.GetInstructionInstanceByBranchTarget(Label));
 }
Пример #8
0
 public CILantroParameterInfo(CILType cilType, CILProgramInstance programInstance)
 {
     _cilType         = cilType;
     _programInstance = programInstance;
 }
Пример #9
0
        public override CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack)
        {
            if (!ParentMethod.IsEntryPoint)
            {
                return(callStack.Pop());
            }

            return(null);
        }
Пример #10
0
        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());
        }
Пример #11
0
        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());
        }
Пример #13
0
        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());
        }
Пример #15
0
        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());
        }
Пример #16
0
        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());
        }
Пример #17
0
        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());
        }
Пример #18
0
        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());
        }
Пример #19
0
        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());
        }
Пример #20
0
        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());
        }
Пример #21
0
        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());
        }
Пример #22
0
        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());
        }
Пример #23
0
        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());
        }
Пример #24
0
        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());
        }
Пример #25
0
        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());
        }
Пример #26
0
 public CILantroConstructorInfo(CILMethod cilMethod, CILProgramInstance programInstance)
 {
     _programInstance = programInstance;
     Method           = cilMethod;
 }
Пример #27
0
        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());
        }
Пример #28
0
 public abstract CILInstructionInstance Execute(CILInstructionInstance instructionInstance, CILProgramState state, CILProgramInstance programInstance, Stack <CILInstructionInstance> callStack);
Пример #29
0
        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());
        }