Esempio n. 1
0
        private void BoxTypeImpl(Dictionary <InterType, string> BoxTypes, InterType type, object tag)
        {
            if (type.IsNullable)
            {
                InterType instant = type.GenericArguments[0].Type;

                string labelsSufix   = rnd.Next().ToString();
                string hasValueLabel = "hasValue" + labelsSufix;
                string exitLabel     = "exit" + labelsSufix;

                MethodRef hasValueMethodRef = new MethodRef(namesController.TypeNameToJava(type),
                                                            ClassNames.SystemNullable_1.GetHasValueMethodName, "()Z");
                MethodRef valueMethodRef = new MethodRef(hasValueMethodRef.Class,
                                                         ClassNames.SystemNullable_1.GetValueMethodName, "()" + namesController.GetFieldDescriptor(instant));

                codeGenerator
                .Add(OpCodes.dup, null, tag)
                .Add(OpCodes.invokevirtual, hasValueMethodRef, tag)
                .Add(OpCodes.ifne, hasValueLabel, tag)
                .Add(OpCodes.pop, null, tag)
                .Add(OpCodes.aconst_null, null, tag)
                .Add(OpCodes._goto, exitLabel, tag)
                .Label(hasValueLabel)
                .Add(OpCodes.invokevirtual, valueMethodRef, tag);

                BoxType(instant, tag);

                codeGenerator.Label(exitLabel);
                return;
            }

            if (type.IsEnum)
            {
                codeGenerator.Add(Java.OpCodes.invokestatic, new Java.Constants.MethodRef(
                                      namesController.TypeNameToJava(type), ClassNames.EnumGetBoxedMethodName,
                                      "(" + namesController.GetFieldDescriptor(type.ElementType) + ")L" +
                                      namesController.TypeNameToJava(type.Fullname) + ";"));
                return;
            }

            if (type.IsValueType)
            {
                return;
            }

            if (!BoxTypes.ContainsKey(type))
            {
                Messages.Message(MessageCode.UnknownPrimitiveType, type.ToString());
                type = InterType.PrimitiveTypes[(int)PrimitiveType.Int32];
            }

            string boxType = BoxTypes[type];

            Java.Constants.MethodRef valueOfRef = new Java.Constants.MethodRef(
                namesController.TypeNameToJava(boxType),
                "valueOf",
                "(" + namesController.GetFieldDescriptor(type) + ")L" + namesController.TypeNameToJava(boxType) + ";");
            codeGenerator.Add(Java.OpCodes.invokestatic, valueOfRef, tag);
        }
Esempio n. 2
0
 public override string ToString()
 {
     return(fldType.ToString() + " " + declType.ToString() + "::" + name);
 }
Esempio n. 3
0
 public override string ToString()
 {
     return(returnParam.Type.ToString() + " " + declType.ToString() + "::" + name + "(" + string.Join(",", parameters.Select(P => P.Type.ToString() + " " + P.Name).ToArray()) + ")");
 }
Esempio n. 4
0
        private Java.Class ComplileType(InterType type)
        {
            sourceFileNameCounter = new Counter <string>();

            Messages.Verbose("  Compiling type {0}...", type.ToString());
            currentType      = type;
            currentJavaClass = new Java.Class();

            currentJavaClass.AccessFlag = (Java.ClassAccessFlag)GetClassAccessFlags(type, false);

            currentJavaClass.ThisClass = TypeNameToJava(type.Fullname);
            if (type.BaseType == null)
            {
                currentJavaClass.SuperClass = TypeNameToJava(ClassNames.JavaObject);
            }
            else
            {
                currentJavaClass.SuperClass = TypeNameToJava(type.BaseType.Fullname);
            }

            foreach (InterType i in type.Interfaces)
            {
                currentJavaClass.Interfaces.Add(TypeNameToJava(i.Fullname));
            }

            if (type.IsValueType)
            {
                CompileValueType(type);
            }
            if (type.IsEnum)
            {
                CompileEnum(type);
            }

            currentJavaInnerClasses = new Java.Attributes.InnerClasses();

            if (type.DeclaringType != null)
            {
                Java.Attributes.InnerClasses.InnerClass innerClass = new Java.Attributes.InnerClasses.InnerClass();
                innerClass.AccessFlags    = (Java.Attributes.InnerClasses.InnerClassAccessFlags)GetClassAccessFlags(type, true);
                innerClass.InnerClassInfo = TypeNameToJava(type.Fullname);
                innerClass.InnerName      = TypeNameToJava(type.Name);
                innerClass.OuterClassInfo = TypeNameToJava(type.DeclaringType.Fullname);
                currentJavaInnerClasses.Classes.Add(innerClass);
            }

            foreach (InterType nestedClass in type.NestedClasses)
            {
                Java.Attributes.InnerClasses.InnerClass innerClass = new Java.Attributes.InnerClasses.InnerClass();
                innerClass.AccessFlags    = (Java.Attributes.InnerClasses.InnerClassAccessFlags)GetClassAccessFlags(nestedClass, true);
                innerClass.InnerClassInfo = TypeNameToJava(nestedClass.Fullname);
                innerClass.InnerName      = TypeNameToJava(nestedClass.Name);
                innerClass.OuterClassInfo = TypeNameToJava(type.Fullname);
                currentJavaInnerClasses.Classes.Add(innerClass);
            }

            if (type.IsDelegate)
            {
                CompileDelegate(type);
            }
            else
            {
                foreach (InterField field in type.Fields)
                {
                    currentJavaClass.Fields.Add(CompileField(field));
                }

                foreach (InterMethod method in type.Methods)
                {
                    currentJavaClass.Methods.Add(CompileMethod(method));
                }

                if (type.BaseType != null)
                {
                    CompileOverridedMethods(type, type.BaseType);
                }
                foreach (InterType iface in type.Interfaces)
                {
                    CompileOverridedMethods(type, iface);
                }

                GenerateFieldAccessors(type);
            }

            bool hasStaticCtor  = type.Methods.Where(M => ((M.IsConstructor) && (M.IsStatic))).Count() > 0;
            bool needStaticCtor = type.Fields.Where(F => ((F.FieldType.IsValueType) && (F.IsStatic))).Count() > 0;

            needStaticCtor |= type.Fields.Where(F => F.IsStatic && F.IsThreadLocal).Count() > 0;

            if ((needStaticCtor) && (!hasStaticCtor))
            {
                GenerateStaticCtor(type);
            }

            if (currentJavaInnerClasses.Classes.Count > 0)
            {
                currentJavaClass.Attributes.Add(currentJavaInnerClasses);
            }

            if ((Program.Debug) && (sourceFileNameCounter != null) && (sourceFileNameCounter.IsStarted))
            {
                string fileName = sourceFileNameCounter.MostUsed;
                if (!Program.FullPathInSourceFileName)
                {
                    fileName = System.IO.Path.GetFileName(fileName);
                }

                currentJavaClass.Attributes.Add(new Java.Attributes.SourceFile(fileName));
            }
            return(currentJavaClass);
        }