예제 #1
0
파일: codegen.cs 프로젝트: KevinT/manos
        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;
        }
예제 #2
0
파일: codegen.cs 프로젝트: KevinT/manos
        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;
            */
        }