示例#1
0
        internal override void Generate(CodeGenContext context, CodeEmitter ilgen)
        {
            FieldWrapper fw = ClassLoaderWrapper.LoadClassCritical(Class).GetFieldWrapper(Name, Sig);

            fw.Link();
            ilgen.Emit(OpCodes.Ldflda, fw.GetField());
        }
示例#2
0
        internal override void Generate(CodeGenContext context, CodeEmitter ilgen)
        {
            FieldWrapper fw = ClassLoaderWrapper.LoadClassCritical(Class).GetFieldWrapper(Name, Sig);

            fw.Link();
            // we don't use fw.EmitSet because we don't want automatic unboxing and whatever
            ilgen.Emit(OpCodes.Stsfld, fw.GetField());
        }
示例#3
0
 internal override void Generate(CodeGenContext context, CodeEmitter ilgen)
 {
     if (Type != null)
     {
         ilgen.Emit(OpCodes.Ldsfld, StaticCompiler.GetType(context.ClassLoader, Type).GetField(Name, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic));
     }
     else
     {
         FieldWrapper fw = ClassLoaderWrapper.LoadClassCritical(Class).GetFieldWrapper(Name, Sig);
         fw.Link();
         // we don't use fw.EmitGet because we don't want automatic unboxing and whatever
         ilgen.Emit(OpCodes.Ldsfld, fw.GetField());
     }
 }
示例#4
0
    // TODO consider caching this delegate in MethodWrapper
    private static Delegate CreateMemberNameDelegate(MethodWrapper mw, java.lang.Class caller, bool doDispatch, MethodType type)
    {
#if FIRST_PASS
        return(null);
#else
        if (mw.IsDynamicOnly)
        {
            return(MethodHandleUtil.DynamicMethodBuilder.CreateDynamicOnly(mw, type));
        }
        // HACK this code is duplicated in compiler.cs
        if (mw.IsProtected && (mw.DeclaringType == CoreClasses.java.lang.Object.Wrapper || mw.DeclaringType == CoreClasses.java.lang.Throwable.Wrapper))
        {
            TypeWrapper thisType             = TypeWrapper.FromClass(caller);
            TypeWrapper cli_System_Object    = ClassLoaderWrapper.LoadClassCritical("cli.System.Object");
            TypeWrapper cli_System_Exception = ClassLoaderWrapper.LoadClassCritical("cli.System.Exception");
            // HACK we may need to redirect finalize or clone from java.lang.Object/Throwable
            // to a more specific base type.
            if (thisType.IsAssignableTo(cli_System_Object))
            {
                mw = cli_System_Object.GetMethodWrapper(mw.Name, mw.Signature, true);
            }
            else if (thisType.IsAssignableTo(cli_System_Exception))
            {
                mw = cli_System_Exception.GetMethodWrapper(mw.Name, mw.Signature, true);
            }
            else if (thisType.IsAssignableTo(CoreClasses.java.lang.Throwable.Wrapper))
            {
                mw = CoreClasses.java.lang.Throwable.Wrapper.GetMethodWrapper(mw.Name, mw.Signature, true);
            }
        }
        TypeWrapper tw = mw.DeclaringType;
        tw.Finish();
        mw.Link();
        mw.ResolveMethod();
        MethodInfo mi = mw.GetMethod() as MethodInfo;
        if (mi != null &&
            !mw.HasCallerID &&
            mw.IsStatic &&
            MethodHandleUtil.HasOnlyBasicTypes(mw.GetParameters(), mw.ReturnType) &&
            type.parameterCount() <= MethodHandleUtil.MaxArity)
        {
            return(Delegate.CreateDelegate(MethodHandleUtil.CreateMemberWrapperDelegateType(mw.GetParameters(), mw.ReturnType), mi));
        }
        else
        {
            // slow path where we emit a DynamicMethod
            return(MethodHandleUtil.DynamicMethodBuilder.CreateMemberName(mw, type, doDispatch));
        }
#endif
    }
示例#5
0
    private static void DoEmit(DynamicTypeWrapper.FinishContext context, TypeWrapper wrapper, CodeEmitter ilgen, FieldWrapper field)
    {
        ConstructorBuilder cb;
        bool exists;

        lock (map)
        {
            exists = map.TryGetValue(field, out cb);
        }
        if (!exists)
        {
            // note that we don't need to lock here, because we're running as part of FinishCore, which is already protected by a lock
            TypeWrapper arfuTypeWrapper = ClassLoaderWrapper.LoadClassCritical("ikvm.internal.IntrinsicAtomicReferenceFieldUpdater");
            TypeBuilder tb = wrapper.TypeAsBuilder.DefineNestedType("__<ARFU>_" + field.Name + field.Signature.Replace('.', '/'), TypeAttributes.NestedPrivate | TypeAttributes.Sealed, arfuTypeWrapper.TypeAsBaseType);
            EmitCompareAndSet("compareAndSet", tb, field.GetField());
            EmitGet(tb, field.GetField());
            EmitSet("set", tb, field.GetField());

            cb = tb.DefineConstructor(MethodAttributes.Assembly, CallingConventions.Standard, Type.EmptyTypes);
            lock (map)
            {
                map.Add(field, cb);
            }
            CodeEmitter ctorilgen = CodeEmitter.Create(cb);
            ctorilgen.Emit(OpCodes.Ldarg_0);
            MethodWrapper basector = arfuTypeWrapper.GetMethodWrapper("<init>", "()V", false);
            basector.Link();
            basector.EmitCall(ctorilgen);
            ctorilgen.Emit(OpCodes.Ret);
            ctorilgen.DoEmit();
            context.RegisterPostFinishProc(delegate
            {
                arfuTypeWrapper.Finish();
                tb.CreateType();
            });
        }
        ilgen.Emit(OpCodes.Pop);
        ilgen.Emit(OpCodes.Pop);
        ilgen.Emit(OpCodes.Pop);
        ilgen.Emit(OpCodes.Newobj, cb);
    }
    public static object createDelegate(MethodType type, MemberName m, bool doDispatch, jlClass lookupClass)
    {
#if FIRST_PASS
        return(null);
#else
        int index = m.getVMIndex();
        if (index == Int32.MaxValue)
        {
            bool invokeExact        = m.getName() == "invokeExact";
            Type targetDelegateType = MethodHandleUtil.CreateDelegateType(invokeExact ? type.dropParameterTypes(0, 1) : type);
            MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder("DirectMethodHandle." + m.getName(), type, typeof(IKVM.Runtime.InvokeCache <>).MakeGenericType(targetDelegateType));
            dm.Ldarg(0);
            if (invokeExact)
            {
                dm.Call(ByteCodeHelperMethods.GetDelegateForInvokeExact.MakeGenericMethod(targetDelegateType));
            }
            else
            {
                dm.LoadValueAddress();
                dm.Call(ByteCodeHelperMethods.GetDelegateForInvoke.MakeGenericMethod(targetDelegateType));
                dm.Ldarg(0);
            }
            for (int i = 1, count = type.parameterCount(); i < count; i++)
            {
                dm.Ldarg(i);
            }
            dm.CallDelegate(targetDelegateType);
            dm.Ret();
            return(dm.CreateDelegate());
        }
        else
        {
            TypeWrapper tw = (TypeWrapper)typeof(MemberName).GetField("vmtarget", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(m);
            tw.Finish();
            MethodWrapper mw = tw.GetMethods()[index];
            if (mw.IsDynamicOnly)
            {
                MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder("CustomInvoke:" + mw.Name, type, (ICustomInvoke)mw);
                if (mw.IsStatic)
                {
                    dm.LoadNull();
                    dm.BoxArgs(0);
                }
                else
                {
                    dm.Ldarg(0);
                    dm.BoxArgs(1);
                }
                dm.Callvirt(typeof(ICustomInvoke).GetMethod("Invoke"));
                dm.Convert(typeof(object), type.returnType(), 0);
                dm.Ret();
                return(dm.CreateDelegate());
            }
            // HACK this code is duplicated in compiler.cs
            if (mw.IsProtected && (mw.DeclaringType == CoreClasses.java.lang.Object.Wrapper || mw.DeclaringType == CoreClasses.java.lang.Throwable.Wrapper))
            {
                TypeWrapper thisType             = TypeWrapper.FromClass(lookupClass);
                TypeWrapper cli_System_Object    = ClassLoaderWrapper.LoadClassCritical("cli.System.Object");
                TypeWrapper cli_System_Exception = ClassLoaderWrapper.LoadClassCritical("cli.System.Exception");
                // HACK we may need to redirect finalize or clone from java.lang.Object/Throwable
                // to a more specific base type.
                if (thisType.IsAssignableTo(cli_System_Object))
                {
                    mw = cli_System_Object.GetMethodWrapper(mw.Name, mw.Signature, true);
                }
                else if (thisType.IsAssignableTo(cli_System_Exception))
                {
                    mw = cli_System_Exception.GetMethodWrapper(mw.Name, mw.Signature, true);
                }
                else if (thisType.IsAssignableTo(CoreClasses.java.lang.Throwable.Wrapper))
                {
                    mw = CoreClasses.java.lang.Throwable.Wrapper.GetMethodWrapper(mw.Name, mw.Signature, true);
                }
            }
            mw.ResolveMethod();
            MethodInfo mi = mw.GetMethod() as MethodInfo;
            if (mi != null &&
                !tw.IsRemapped &&
                !tw.IsGhost &&
                !tw.IsNonPrimitiveValueType &&
                type.parameterCount() <= MethodHandleUtil.MaxArity
                // FXBUG we should be able to use a normal (unbound) delegate for virtual methods
                // (when doDispatch is set), but the x64 CLR crashes when doing a virtual method dispatch on
                // a null reference
                && (!mi.IsVirtual || (doDispatch && IntPtr.Size == 4)) &&
                (doDispatch || !mi.IsVirtual))
            {
                return(Delegate.CreateDelegate(MethodHandleUtil.CreateDelegateType(tw, mw), mi));
            }
            else
            {
                // slow path where we emit a DynamicMethod
                MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder(mw.DeclaringType.TypeAsBaseType, "DirectMethodHandle:" + mw.Name, type);
                for (int i = 0, count = type.parameterCount(); i < count; i++)
                {
                    if (i == 0 && !mw.IsStatic && (tw.IsGhost || tw.IsNonPrimitiveValueType))
                    {
                        dm.LoadFirstArgAddress();
                    }
                    else
                    {
                        dm.Ldarg(i);
                    }
                }
                if (doDispatch && !mw.IsStatic)
                {
                    dm.Callvirt(mw);
                }
                else
                {
                    dm.Call(mw);
                }
                dm.Ret();
                return(dm.CreateDelegate());
            }
        }
#endif
    }