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); }
public override string ToString() { return(fldType.ToString() + " " + declType.ToString() + "::" + name); }
public override string ToString() { return(returnParam.Type.ToString() + " " + declType.ToString() + "::" + name + "(" + string.Join(",", parameters.Select(P => P.Type.ToString() + " " + P.Name).ToArray()) + ")"); }
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); }