Beispiel #1
0
        void EmitSwapThunk(TypeBuilder tb)
        {
            MethodBuilder mb  = tb.DefineMethod("swapThunk", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Virtual, typeof(void), new Type[] { typeof(int), typeof(ILookupThunk) });
            CljILGen      ilg = new CljILGen(mb.GetILGenerator());

            Label endLabel = ilg.DefineLabel();

            Label[] labels = new Label[KeywordCallsites.count()];
            for (int i = 0; i < KeywordCallsites.count(); i++)
            {
                labels[i] = ilg.DefineLabel();
            }

            ilg.EmitLoadArg(1);
            ilg.Emit(OpCodes.Switch, labels);
            ilg.Emit(OpCodes.Br, endLabel);

            for (int i = 0; i < KeywordCallsites.count(); i++)
            {
                ilg.MarkLabel(labels[i]);
                ilg.EmitLoadArg(2);
                ilg.EmitFieldSet(_thunkFields[i]);
                ilg.Emit(OpCodes.Br, endLabel);
            }

            ilg.MarkLabel(endLabel);
            ilg.Emit(OpCodes.Ret);
        }
Beispiel #2
0
 private void EmitKeywordCallsiteInits(CljILGen ilg)
 {
     for (int i = 0; i < KeywordCallsites.count(); i++)
     {
         Keyword k = (Keyword)KeywordCallsites.nth(i);
         EmitValue(k, ilg);
         ilg.Emit(OpCodes.Newobj, Compiler.Ctor_KeywordLookupSite_1);
         ilg.Emit(OpCodes.Dup);
         ilg.Emit(OpCodes.Stsfld, _keywordLookupSiteFields[i]);
         ilg.Emit(OpCodes.Castclass, typeof(ILookupThunk));
         ilg.Emit(OpCodes.Stsfld, _thunkFields[i]);
     }
 }
Beispiel #3
0
        private void EmitStaticConstructorBody(CljILGen ilg)
        {
            GenContext.EmitDebugInfo(ilg, SpanMap);

            if (Constants.count() > 0)
                EmitConstantFieldInits(ilg);

            if (KeywordCallsites.count() > 0)
                EmitKeywordCallsiteInits(ilg);

            if ( IsDefType && RT.booleanCast(RT.get(Opts,Compiler.LoadNsKeyword)))
                EmitLoadNsInitForDeftype(ilg);

            ilg.Emit(OpCodes.Ret);
        }
Beispiel #4
0
        private void EmitStaticConstructorBody(CljILGen ilg)
        {
            GenContext.EmitDebugInfo(ilg, SpanMap);

            if (Constants.count() > 0)
            {
                EmitConstantFieldInits(ilg);
            }

            if (KeywordCallsites.count() > 0)
            {
                EmitKeywordCallsiteInits(ilg);
            }

            ilg.Emit(OpCodes.Ret);
        }
Beispiel #5
0
        void EmitKeywordCallsiteDefs(TypeBuilder baseTB)
        {
            int count = KeywordCallsites.count();

            _keywordLookupSiteFields = new List <FieldBuilder>(count);
            _thunkFields             = new List <FieldBuilder>(count);

            for (int i = 0; i < KeywordCallsites.count(); i++)
            {
                //Keyword k = (Keyword)_keywordCallsites.nth(i);
                string       siteName  = SiteNameStatic(i);
                string       thunkName = ThunkNameStatic(i);
                FieldBuilder fb1       = baseTB.DefineField(siteName, typeof(KeywordLookupSite), FieldAttributes.FamORAssem | FieldAttributes.Static);
                FieldBuilder fb2       = baseTB.DefineField(thunkName, typeof(ILookupThunk), FieldAttributes.FamORAssem | FieldAttributes.Static);
                _keywordLookupSiteFields.Add(fb1);
                _thunkFields.Add(fb2);
            }
        }