public override TypeReference ResolveType(Application app, Page page) { ParameterDefinition pvar = page.FindParameter (Name.Name); if (pvar != null) { ResolvedType = pvar.ParameterType; return ResolvedType; } VariableDefinition localvar = page.FindLocalVariable (Name.Name); if (localvar != null) { ResolvedType = localvar.VariableType; return ResolvedType; } ResolvedType = app.Assembly.MainModule.Import (typeof (object)); return ResolvedType; }
public override void Emit(Application app, Page page, ILProcessor processor) { if (page.IsForLoopVariable (Name.Name)) { page.EmitForLoopVariableAccess (); return; } if (page.IsBuiltInVariable (Name.Name)) { page.EmitBuiltInVariable (Name.Name); return; } ParameterDefinition pvar = page.FindParameter (Name.Name); if (pvar != null) { ResolvedType = pvar.ParameterType; processor.Emit (OpCodes.Ldarg, pvar); return; } VariableDefinition localvar = page.FindLocalVariable (Name.Name); if (localvar != null) { ResolvedType = localvar.VariableType; processor.Emit (OpCodes.Ldloc, localvar); return; } // Attempt to resolve the property on the resolved type PropertyDefinition prop = page.Definition.Properties.Where (p => p.Name == Name.Name).FirstOrDefault (); if (prop != null) { MethodReference get_method = app.Assembly.MainModule.Import (prop.GetMethod); processor.Emit (OpCodes.Call, get_method); return; } // // Attempt to load it from the supplied type, look for a property // on the type with the correct name. // processor.Emit (OpCodes.Ldarg_2); processor.Emit (OpCodes.Callvirt, app.CommonMethods.GetTypeMethod); processor.Emit (OpCodes.Ldstr, Name.Name); processor.Emit (OpCodes.Ldc_I4, (int) (System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public)); processor.Emit (OpCodes.Callvirt, app.CommonMethods.GetPropertyMethod); processor.Emit (OpCodes.Ldarg_2); processor.Emit (OpCodes.Ldnull); processor.Emit (OpCodes.Callvirt, app.CommonMethods.GetPropertyValueMethod); /* ResolvedType = app.Assembly.MainModule.Import (typeof (object)); processor.Emit (OpCodes.Ldarg_2); processor.Emit (OpCodes.Ldstr, Name.Name); processor.Emit (OpCodes.Callvirt, app.CommonMethods.ContainsKeyMethod); Instruction contains_branch = processor.Emit (OpCodes.Brfalse, processor.Create (OpCodes.Nop)); processor.Emit (OpCodes.Ldarg_2); processor.Emit (OpCodes.Ldstr, Name.Name); processor.Emit (OpCodes.Callvirt, app.CommonMethods.GetArgMethod); Instruction gotarg_branch = processor.Emit (OpCodes.Br, processor.Create (OpCodes.Nop)); Instruction load_empty_target = processor.Emit (OpCodes.Ldsfld, app.CommonMethods.StringEmptyField); contains_branch.Operand = load_empty_target; Instruction completed_target = processor.Emit (OpCodes.Nop); gotarg_branch.Operand = completed_target; */ }