internal override bool InternalsVisibleToImpl(TypeWrapper wrapper, TypeWrapper friend)
        {
            ClassLoaderWrapper other = friend.GetClassLoader();

            if (this == other)
            {
                return(true);
            }
            AssemblyName otherName;

#if STATIC_COMPILER
            CompilerClassLoader ccl = other as CompilerClassLoader;
            if (ccl == null)
            {
                return(false);
            }
            otherName = ccl.GetAssemblyName();
#else
            AssemblyClassLoader acl = other as AssemblyClassLoader;
            if (acl == null)
            {
                return(false);
            }
            otherName = acl.GetAssembly(friend).GetName();
#endif
            return(GetLoader(GetAssembly(wrapper)).InternalsVisibleTo(otherName));
        }
        private static AssemblyClassLoader Create(Assembly assembly)
        {
            // If the assembly is a part of a multi-assembly shared class loader,
            // it will export the __<MainAssembly> type from the main assembly in the group.
            Type forwarder = assembly.GetType("__<MainAssembly>");

            if (forwarder != null)
            {
                Assembly mainAssembly = forwarder.Assembly;
                if (mainAssembly != assembly)
                {
                    return(FromAssembly(mainAssembly));
                }
            }
#if STATIC_COMPILER
            if (JVM.CoreAssembly == null && CompilerClassLoader.IsCoreAssembly(assembly))
            {
                JVM.CoreAssembly = assembly;
                ClassLoaderWrapper.LoadRemappedTypes();
            }
#endif
            if (assembly == JVM.CoreAssembly)
            {
                // This cast is necessary for ikvmc and a no-op for the runtime.
                // Note that the cast cannot fail, because ikvmc will only return a non AssemblyClassLoader
                // from GetBootstrapClassLoader() when compiling the core assembly and in that case JVM.CoreAssembly
                // will be null.
                return((AssemblyClassLoader)GetBootstrapClassLoader());
            }
            return(new AssemblyClassLoader(assembly));
        }
Beispiel #3
0
        private static void CreateNoFail(CompilerClassLoader loader, TypeWrapper[] interfaces, List <ProxyMethod> methods)
        {
            bool ispublic = true;

            Type[] interfaceTypes = new Type[interfaces.Length];
            for (int i = 0; i < interfaceTypes.Length; i++)
            {
                ispublic         &= interfaces[i].IsPublic;
                interfaceTypes[i] = interfaces[i].TypeAsBaseType;
            }
            TypeAttributes attr = TypeAttributes.Class | TypeAttributes.Sealed;

            attr |= ispublic ? TypeAttributes.NestedPublic : TypeAttributes.NestedAssembly;
            DynamicClassLoader factory = (DynamicClassLoader)loader.GetTypeWrapperFactory();
            TypeBuilder        tb      = factory.DefineProxy(TypeNameUtil.GetProxyNestedName(interfaces), attr, proxyClass.TypeAsBaseType, interfaceTypes);

            AttributeHelper.SetImplementsAttribute(tb, interfaces);
            // we apply an InnerClass attribute to avoid the CompiledTypeWrapper heuristics for figuring out the modifiers
            AttributeHelper.SetInnerClass(tb, null, ispublic ? Modifiers.Public | Modifiers.Final : Modifiers.Final);
            CreateConstructor(tb);
            for (int i = 0; i < methods.Count; i++)
            {
                methods[i].fb = tb.DefineField("m" + i, javaLangReflectMethod.TypeAsSignatureType, FieldAttributes.Private | FieldAttributes.Static);
            }
            foreach (ProxyMethod method in methods)
            {
                CreateMethod(loader, tb, method);
            }
            CreateStaticInitializer(tb, methods, loader);
        }
Beispiel #4
0
        private static List <ProxyMethod> CheckAndCollect(CompilerClassLoader loader, TypeWrapper[] interfaces)
        {
            List <MethodWrapper> methods = new List <MethodWrapper>();

            // The java.lang.Object methods precede any interface methods.
            methods.Add(equalsMethod);
            methods.Add(hashCodeMethod);
            methods.Add(toStringMethod);

            // Add the interfaces methods in order.
            foreach (TypeWrapper tw in interfaces)
            {
                if (!tw.IsInterface)
                {
                    throw new ProxyException(tw.Name + " is not an interface");
                }
                if (tw.IsRemapped)
                {
                    // TODO handle java.lang.Comparable
                    throw new ProxyException(tw.Name + " is a remapped interface (not currently supported)");
                }
                foreach (MethodWrapper mw in GetInterfaceMethods(tw))
                {
                    // Check for duplicates
                    if (!MethodExists(methods, mw))
                    {
                        mw.Link();
                        methods.Add(mw);
                    }
                }
            }

            // TODO verify restrictions

            // Collect declared exceptions.
            Dictionary <string, TypeWrapper[]> exceptions = new Dictionary <string, TypeWrapper[]>();

            foreach (MethodWrapper mw in methods)
            {
                Add(loader, exceptions, mw);
            }

            // Build the definitive proxy method list.
            List <ProxyMethod> proxyMethods = new List <ProxyMethod>();

            foreach (MethodWrapper mw in methods)
            {
                proxyMethods.Add(new ProxyMethod(mw, exceptions[mw.Signature]));
            }
            return(proxyMethods);
        }
Beispiel #5
0
        private static void Add(CompilerClassLoader loader, Dictionary <string, TypeWrapper[]> exceptions, MethodWrapper mw)
        {
            string signature = mw.Signature;

            TypeWrapper[] newExceptionTypes = LoadTypes(loader, mw.GetDeclaredExceptions());
            TypeWrapper[] curExceptionTypes;
            if (exceptions.TryGetValue(signature, out curExceptionTypes))
            {
                exceptions[signature] = Merge(newExceptionTypes, curExceptionTypes);
            }
            else
            {
                exceptions.Add(signature, newExceptionTypes);
            }
        }
Beispiel #6
0
        private static void CreateNoFail(CompilerClassLoader loader, TypeWrapper[] interfaces, List <ProxyMethod> methods)
        {
            DynamicClassLoader factory = (DynamicClassLoader)loader.GetTypeWrapperFactory();
            TypeBuilder        tb      = factory.DefineProxy(proxyClass, interfaces);

            AttributeHelper.SetImplementsAttribute(tb, interfaces);
            CreateConstructor(tb);
            for (int i = 0; i < methods.Count; i++)
            {
                methods[i].fb = tb.DefineField("m" + i, javaLangReflectMethod.TypeAsSignatureType, FieldAttributes.Private | FieldAttributes.Static);
            }
            foreach (ProxyMethod method in methods)
            {
                CreateMethod(loader, tb, method);
            }
            CreateStaticInitializer(tb, methods);
        }
        private static void EmitClassLiteral(CompilerClassLoader ccl)
        {
            TypeBuilder tb = ccl.GetTypeWrapperFactory().ModuleBuilder.DefineType("ikvm.internal.ClassLiteral`1", TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Abstract | TypeAttributes.Class | TypeAttributes.BeforeFieldInit);
            GenericTypeParameterBuilder typeParam = tb.DefineGenericParameters("T")[0];
            Type classType = CoreClasses.java.lang.Class.Wrapper.TypeAsSignatureType;

            classLiteralField = tb.DefineField("Value", classType, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.InitOnly);
            CodeEmitter ilgen = CodeEmitter.Create(ReflectUtil.DefineTypeInitializer(tb));

            ilgen.Emit(OpCodes.Ldtoken, typeParam);
            ilgen.Emit(OpCodes.Call, Types.Type.GetMethod("GetTypeFromHandle", new Type[] { Types.RuntimeTypeHandle }));
            MethodWrapper mw = CoreClasses.java.lang.Class.Wrapper.GetMethodWrapper("<init>", "(Lcli.System.Type;)V", false);

            mw.Link();
            mw.EmitNewobj(ilgen);
            ilgen.Emit(OpCodes.Stsfld, classLiteralField);
            ilgen.Emit(OpCodes.Ret);
            ilgen.DoEmit();
            classLiteralType = tb.CreateType();
        }
Beispiel #8
0
        private static void Create(CompilerClassLoader loader, string proxy, TypeWrapper[] interfaces)
        {
            List <ProxyMethod> methods;

            try
            {
                methods = CheckAndCollect(loader, interfaces);
            }
            catch (RetargetableJavaException x)
            {
                StaticCompiler.IssueMessage(Message.UnableToCreateProxy, proxy, x.Message);
                return;
            }
            catch (ProxyException x)
            {
                StaticCompiler.IssueMessage(Message.UnableToCreateProxy, proxy, x.Message);
                return;
            }
            CreateNoFail(loader, interfaces, methods);
        }
Beispiel #9
0
 internal static void Create(CompilerClassLoader loader, string proxy)
 {
     string[]      interfaces = proxy.Split(',');
     TypeWrapper[] wrappers   = new TypeWrapper[interfaces.Length];
     for (int i = 0; i < interfaces.Length; i++)
     {
         try
         {
             wrappers[i] = loader.LoadClassByDottedNameFast(interfaces[i]);
         }
         catch (RetargetableJavaException)
         {
         }
         if (wrappers[i] == null)
         {
             StaticCompiler.IssueMessage(Message.UnableToCreateProxy, proxy, "unable to load interface " + interfaces[i]);
             return;
         }
     }
     Create(loader, proxy, wrappers);
 }
 internal static void Create(CompilerClassLoader ccl)
 {
     EmitClassLiteral(ccl);
 }
Beispiel #11
0
    static int Main(string[] args)
    {
        DateTime start = DateTime.Now;

        System.Threading.Thread.CurrentThread.Name = "compiler";
        Tracer.EnableTraceConsoleListener();
        Tracer.EnableTraceForDebug();
        List <string> argList = GetArgs(args);

        if (argList.Count == 0)
        {
            PrintHelp();
            return(1);
        }
        IkvmcCompiler          comp     = new IkvmcCompiler();
        List <CompilerOptions> targets  = new List <CompilerOptions>();
        CompilerOptions        toplevel = new CompilerOptions();

        StaticCompiler.toplevel = toplevel;
        int rc = comp.ParseCommandLine(argList.GetEnumerator(), targets, toplevel);

        if (rc == 0)
        {
            resolver.Warning += new AssemblyResolver.WarningEvent(loader_Warning);
            resolver.Init(StaticCompiler.Universe, nostdlib, toplevel.unresolvedReferences, libpaths);
        }
        if (rc == 0)
        {
            rc = ResolveReferences(targets);
        }
        if (rc == 0)
        {
            rc = ResolveStrongNameKeys(targets);
        }
        if (rc == 0)
        {
            try
            {
                if (targets.Count == 0)
                {
                    Console.Error.WriteLine("Error: no target founds");
                    rc = 1;
                }
                else
                {
                    try
                    {
                        rc = CompilerClassLoader.Compile(runtimeAssembly, targets);
                    }
                    catch (FileFormatLimitationExceededException x)
                    {
                        Console.Error.WriteLine("Error: {0}", x.Message);
                        rc = 1;
                    }
                }
            }
            catch (Exception x)
            {
                Console.Error.WriteLine(x);
                rc = 1;
            }
        }
        if (time)
        {
            Console.WriteLine("Total cpu time: {0}", System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime);
            Console.WriteLine("User cpu time: {0}", System.Diagnostics.Process.GetCurrentProcess().UserProcessorTime);
            Console.WriteLine("Total wall clock time: {0}", DateTime.Now - start);
            Console.WriteLine("Peak virtual memory: {0}", System.Diagnostics.Process.GetCurrentProcess().PeakVirtualMemorySize64);
            for (int i = 0; i <= GC.MaxGeneration; i++)
            {
                Console.WriteLine("GC({0}) count: {1}", i, GC.CollectionCount(i));
            }
        }
        return(rc);
    }
Beispiel #12
0
        private static void CreateMethod(CompilerClassLoader loader, TypeBuilder tb, ProxyMethod pm)
        {
            MethodBuilder mb         = pm.mw.GetDefineMethodHelper().DefineMethod(loader.GetTypeWrapperFactory(), tb, pm.mw.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final);
            List <string> exceptions = new List <string>();

            foreach (TypeWrapper tw in pm.exceptions)
            {
                exceptions.Add(tw.Name);
            }
            AttributeHelper.SetThrowsAttribute(mb, exceptions.ToArray());
            CodeEmitter ilgen = CodeEmitter.Create(mb);

            ilgen.BeginExceptionBlock();
            ilgen.Emit(OpCodes.Ldarg_0);
            invocationHandlerField.EmitGet(ilgen);
            ilgen.Emit(OpCodes.Ldarg_0);
            ilgen.Emit(OpCodes.Ldsfld, pm.fb);
            TypeWrapper[] parameters = pm.mw.GetParameters();
            if (parameters.Length == 0)
            {
                ilgen.Emit(OpCodes.Ldnull);
            }
            else
            {
                ilgen.EmitLdc_I4(parameters.Length);
                ilgen.Emit(OpCodes.Newarr, Types.Object);
                for (int i = 0; i < parameters.Length; i++)
                {
                    ilgen.Emit(OpCodes.Dup);
                    ilgen.EmitLdc_I4(i);
                    ilgen.EmitLdarg(i);
                    if (parameters[i].IsNonPrimitiveValueType)
                    {
                        parameters[i].EmitBox(ilgen);
                    }
                    else if (parameters[i].IsPrimitive)
                    {
                        Boxer.EmitBox(ilgen, parameters[i]);
                    }
                    ilgen.Emit(OpCodes.Stelem_Ref);
                }
            }
            invokeMethod.EmitCallvirt(ilgen);
            TypeWrapper      returnType  = pm.mw.ReturnType;
            CodeEmitterLocal returnValue = null;

            if (returnType != PrimitiveTypeWrapper.VOID)
            {
                returnValue = ilgen.DeclareLocal(returnType.TypeAsSignatureType);
                if (returnType.IsNonPrimitiveValueType)
                {
                    returnType.EmitUnbox(ilgen);
                }
                else if (returnType.IsPrimitive)
                {
                    Boxer.EmitUnbox(ilgen, returnType);
                }
                else if (returnType != CoreClasses.java.lang.Object.Wrapper)
                {
                    ilgen.EmitCastclass(returnType.TypeAsSignatureType);
                }
                ilgen.Emit(OpCodes.Stloc, returnValue);
            }
            CodeEmitterLabel returnLabel = ilgen.DefineLabel();

            ilgen.EmitLeave(returnLabel);
            // TODO consider using a filter here (but we would need to add filter support to CodeEmitter)
            ilgen.BeginCatchBlock(Types.Exception);
            ilgen.EmitLdc_I4(0);
            ilgen.Emit(OpCodes.Call, ByteCodeHelperMethods.mapException.MakeGenericMethod(Types.Exception));
            CodeEmitterLocal exception = ilgen.DeclareLocal(Types.Exception);

            ilgen.Emit(OpCodes.Stloc, exception);
            CodeEmitterLabel rethrow = ilgen.DefineLabel();

            ilgen.Emit(OpCodes.Ldloc, exception);
            errorClass.EmitInstanceOf(ilgen);
            ilgen.EmitBrtrue(rethrow);
            ilgen.Emit(OpCodes.Ldloc, exception);
            runtimeExceptionClass.EmitInstanceOf(ilgen);
            ilgen.EmitBrtrue(rethrow);
            foreach (TypeWrapper tw in pm.exceptions)
            {
                ilgen.Emit(OpCodes.Ldloc, exception);
                tw.EmitInstanceOf(ilgen);
                ilgen.EmitBrtrue(rethrow);
            }
            ilgen.Emit(OpCodes.Ldloc, exception);
            undeclaredThrowableExceptionConstructor.EmitNewobj(ilgen);
            ilgen.Emit(OpCodes.Throw);
            ilgen.MarkLabel(rethrow);
            ilgen.Emit(OpCodes.Rethrow);
            ilgen.EndExceptionBlock();
            ilgen.MarkLabel(returnLabel);
            if (returnValue != null)
            {
                ilgen.Emit(OpCodes.Ldloc, returnValue);
            }
            ilgen.Emit(OpCodes.Ret);
            ilgen.DoEmit();
        }
Beispiel #13
0
        private static void CreateStaticInitializer(TypeBuilder tb, List <ProxyMethod> methods, CompilerClassLoader loader)
        {
            CodeEmitter      ilgen      = CodeEmitter.Create(ReflectUtil.DefineTypeInitializer(tb, loader));
            CodeEmitterLocal callerID   = ilgen.DeclareLocal([email protected]);
            TypeBuilder      tbCallerID = DynamicTypeWrapper.FinishContext.EmitCreateCallerID(tb, ilgen);

            ilgen.Emit(OpCodes.Stloc, callerID);
            // HACK we shouldn't create the nested type here (the outer type must be created first)
            tbCallerID.CreateType();
            ilgen.BeginExceptionBlock();
            foreach (ProxyMethod method in methods)
            {
                method.mw.DeclaringType.EmitClassLiteral(ilgen);
                ilgen.Emit(OpCodes.Ldstr, method.mw.Name);
                TypeWrapper[] parameters = method.mw.GetParameters();
                ilgen.EmitLdc_I4(parameters.Length);
                ilgen.Emit(OpCodes.Newarr, CoreClasses.java.lang.Class.Wrapper.TypeAsArrayType);
                for (int i = 0; i < parameters.Length; i++)
                {
                    ilgen.Emit(OpCodes.Dup);
                    ilgen.EmitLdc_I4(i);
                    parameters[i].EmitClassLiteral(ilgen);
                    ilgen.Emit(OpCodes.Stelem_Ref);
                }
                if (javaLangClass_getMethod.HasCallerID)
                {
                    ilgen.Emit(OpCodes.Ldloc, callerID);
                }
                javaLangClass_getMethod.EmitCallvirt(ilgen);
                ilgen.Emit(OpCodes.Stsfld, method.fb);
            }
            CodeEmitterLabel label = ilgen.DefineLabel();

            ilgen.EmitLeave(label);
            ilgen.BeginCatchBlock(javaLangNoSuchMethodException.TypeAsExceptionType);
            javaLangThrowable_getMessage.EmitCallvirt(ilgen);
            javaLangNoClassDefFoundErrorConstructor.EmitNewobj(ilgen);
            ilgen.Emit(OpCodes.Throw);
            ilgen.EndExceptionBlock();
            ilgen.MarkLabel(label);
            ilgen.Emit(OpCodes.Ret);
            ilgen.DoEmit();
        }