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();
            }
        }
예제 #2
0
        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());
        }
예제 #3
0
        public override Type GetRuntimeType(CilProgram program)
        {
            if (program.IsExternalType(ClassName))
            {
                return(ReflectionHelper.GetExternalType(ClassName));
            }

            throw new NotImplementedException();
        }
예제 #4
0
        public override IValue CreateValueFromRuntime(object obj, CilManagedMemory managedMemory, CilProgram program)
        {
            if (program.IsExternalType(ClassName))
            {
                return(new CilValueExternal(obj));
            }

            throw new NotImplementedException();
        }
예제 #5
0
        public override Type GetValueType(CilProgram program)
        {
            if (program.IsExternalType(ClassName))
            {
                return(typeof(CilValueExternal));
            }

            return(typeof(CilValueValueType));
        }
예제 #6
0
        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();
        }
예제 #7
0
        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);
            }
        }
예제 #8
0
        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();
            }
        }