private static Instruction GetLoadField(FieldInfo field)
        {
            lock (s_loadFields)
            {
                Instruction instruction;
                if (!s_loadFields.TryGetValue(field, out instruction))
                {
                    if (field.IsStatic)
                    {
                        instruction = new LoadStaticFieldInstruction(field);
                    }
                    else
                    {
                        instruction = new LoadFieldInstruction(field);
                    }

                    s_loadFields.Add(field, instruction);
                }

                return(instruction);
            }
        }
        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();
            }
        }
Beispiel #3
0
 protected abstract void VisitLoadStaticFieldInstruction(LoadStaticFieldInstruction instruction);