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(); } }
protected abstract void VisitLoadStaticFieldInstruction(LoadStaticFieldInstruction instruction);