clojure.lang.CljCompiler.Ast.ObjExpr.EmitNonMetaConstructor C# (CSharp) Method

EmitNonMetaConstructor() private method

private EmitNonMetaConstructor ( TypeBuilder fnTB, Type baseType ) : ConstructorBuilder
fnTB System.Reflection.Emit.TypeBuilder
baseType System.Type
return System.Reflection.Emit.ConstructorBuilder
        private ConstructorBuilder EmitNonMetaConstructor(TypeBuilder fnTB, Type baseType)
        {
            Type[] ctorTypes = CtorTypes();
            Type[] noMetaCtorTypes = new Type[ctorTypes.Length - 1];
            for (int i = 1; i < ctorTypes.Length; i++)
                noMetaCtorTypes[i - 1] = ctorTypes[i];

            ConstructorBuilder cb = fnTB.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, noMetaCtorTypes);
            CljILGen gen = new CljILGen(cb.GetILGenerator());

            gen.EmitLoadArg(0);
            gen.EmitNull();     // null meta
            for (int i = 0; i < noMetaCtorTypes.Length; i++)
                gen.EmitLoadArg(i + 1);
            gen.Emit(OpCodes.Call, CtorInfo);
            gen.Emit(OpCodes.Ret);

            return cb;
        }