2655 m.erasure_field = new MethodType( |
2650 m.erasure_field = new MethodType( |
2656 olderasure.getParameterTypes().prepend(syms.intType).prepend(syms.stringType), |
2651 olderasure.getParameterTypes().prepend(syms.intType).prepend(syms.stringType), |
2657 olderasure.getReturnType(), |
2652 olderasure.getReturnType(), |
2658 olderasure.getThrownTypes(), |
2653 olderasure.getThrownTypes(), |
2659 syms.methodClass); |
2654 syms.methodClass); |
2660 |
|
2661 if (target.compilerBootstrap(m.owner)) { |
|
2662 // Initialize synthetic name field |
|
2663 Symbol nameVarSym = lookupSynthetic(names.fromString("$name"), |
|
2664 tree.sym.owner.members()); |
|
2665 JCIdent nameIdent = make.Ident(nameParam.sym); |
|
2666 JCIdent id1 = make.Ident(nameVarSym); |
|
2667 JCAssign newAssign = make.Assign(id1, nameIdent); |
|
2668 newAssign.type = id1.type; |
|
2669 JCExpressionStatement nameAssign = make.Exec(newAssign); |
|
2670 nameAssign.type = id1.type; |
|
2671 tree.body.stats = tree.body.stats.prepend(nameAssign); |
|
2672 |
|
2673 // Initialize synthetic ordinal field |
|
2674 Symbol ordinalVarSym = lookupSynthetic(names.fromString("$ordinal"), |
|
2675 tree.sym.owner.members()); |
|
2676 JCIdent ordIdent = make.Ident(ordParam.sym); |
|
2677 id1 = make.Ident(ordinalVarSym); |
|
2678 newAssign = make.Assign(id1, ordIdent); |
|
2679 newAssign.type = id1.type; |
|
2680 JCExpressionStatement ordinalAssign = make.Exec(newAssign); |
|
2681 ordinalAssign.type = id1.type; |
|
2682 tree.body.stats = tree.body.stats.prepend(ordinalAssign); |
|
2683 } |
|
2684 } |
2655 } |
2685 |
2656 |
2686 JCMethodDecl prevMethodDef = currentMethodDef; |
2657 JCMethodDecl prevMethodDef = currentMethodDef; |
2687 MethodSymbol prevMethodSym = currentMethodSym; |
2658 MethodSymbol prevMethodSym = currentMethodSym; |
2688 try { |
2659 try { |
3886 accessed = null; |
3857 accessed = null; |
3887 enumSwitchMap.clear(); |
3858 enumSwitchMap.clear(); |
3888 } |
3859 } |
3889 return translated.toList(); |
3860 return translated.toList(); |
3890 } |
3861 } |
3891 |
|
3892 ////////////////////////////////////////////////////////////// |
|
3893 // The following contributed by Borland for bootstrapping purposes |
|
3894 ////////////////////////////////////////////////////////////// |
|
3895 private void addEnumCompatibleMembers(JCClassDecl cdef) { |
|
3896 make_at(null); |
|
3897 |
|
3898 // Add the special enum fields |
|
3899 VarSymbol ordinalFieldSym = addEnumOrdinalField(cdef); |
|
3900 VarSymbol nameFieldSym = addEnumNameField(cdef); |
|
3901 |
|
3902 // Add the accessor methods for name and ordinal |
|
3903 MethodSymbol ordinalMethodSym = addEnumFieldOrdinalMethod(cdef, ordinalFieldSym); |
|
3904 MethodSymbol nameMethodSym = addEnumFieldNameMethod(cdef, nameFieldSym); |
|
3905 |
|
3906 // Add the toString method |
|
3907 addEnumToString(cdef, nameFieldSym); |
|
3908 |
|
3909 // Add the compareTo method |
|
3910 addEnumCompareTo(cdef, ordinalFieldSym); |
|
3911 } |
|
3912 |
|
3913 private VarSymbol addEnumOrdinalField(JCClassDecl cdef) { |
|
3914 VarSymbol ordinal = new VarSymbol(PRIVATE|FINAL|SYNTHETIC, |
|
3915 names.fromString("$ordinal"), |
|
3916 syms.intType, |
|
3917 cdef.sym); |
|
3918 cdef.sym.members().enter(ordinal); |
|
3919 cdef.defs = cdef.defs.prepend(make.VarDef(ordinal, null)); |
|
3920 return ordinal; |
|
3921 } |
|
3922 |
|
3923 private VarSymbol addEnumNameField(JCClassDecl cdef) { |
|
3924 VarSymbol name = new VarSymbol(PRIVATE|FINAL|SYNTHETIC, |
|
3925 names.fromString("$name"), |
|
3926 syms.stringType, |
|
3927 cdef.sym); |
|
3928 cdef.sym.members().enter(name); |
|
3929 cdef.defs = cdef.defs.prepend(make.VarDef(name, null)); |
|
3930 return name; |
|
3931 } |
|
3932 |
|
3933 private MethodSymbol addEnumFieldOrdinalMethod(JCClassDecl cdef, VarSymbol ordinalSymbol) { |
|
3934 // Add the accessor methods for ordinal |
|
3935 Symbol ordinalSym = lookupMethod(cdef.pos(), |
|
3936 names.ordinal, |
|
3937 cdef.type, |
|
3938 List.<Type>nil()); |
|
3939 |
|
3940 Assert.check(ordinalSym instanceof MethodSymbol); |
|
3941 |
|
3942 JCStatement ret = make.Return(make.Ident(ordinalSymbol)); |
|
3943 cdef.defs = cdef.defs.append(make.MethodDef((MethodSymbol)ordinalSym, |
|
3944 make.Block(0L, List.of(ret)))); |
|
3945 |
|
3946 return (MethodSymbol)ordinalSym; |
|
3947 } |
|
3948 |
|
3949 private MethodSymbol addEnumFieldNameMethod(JCClassDecl cdef, VarSymbol nameSymbol) { |
|
3950 // Add the accessor methods for name |
|
3951 Symbol nameSym = lookupMethod(cdef.pos(), |
|
3952 names._name, |
|
3953 cdef.type, |
|
3954 List.<Type>nil()); |
|
3955 |
|
3956 Assert.check(nameSym instanceof MethodSymbol); |
|
3957 |
|
3958 JCStatement ret = make.Return(make.Ident(nameSymbol)); |
|
3959 |
|
3960 cdef.defs = cdef.defs.append(make.MethodDef((MethodSymbol)nameSym, |
|
3961 make.Block(0L, List.of(ret)))); |
|
3962 |
|
3963 return (MethodSymbol)nameSym; |
|
3964 } |
|
3965 |
|
3966 private MethodSymbol addEnumToString(JCClassDecl cdef, |
|
3967 VarSymbol nameSymbol) { |
|
3968 Symbol toStringSym = lookupMethod(cdef.pos(), |
|
3969 names.toString, |
|
3970 cdef.type, |
|
3971 List.<Type>nil()); |
|
3972 |
|
3973 JCTree toStringDecl = null; |
|
3974 if (toStringSym != null) |
|
3975 toStringDecl = TreeInfo.declarationFor(toStringSym, cdef); |
|
3976 |
|
3977 if (toStringDecl != null) |
|
3978 return (MethodSymbol)toStringSym; |
|
3979 |
|
3980 JCStatement ret = make.Return(make.Ident(nameSymbol)); |
|
3981 |
|
3982 JCTree resTypeTree = make.Type(syms.stringType); |
|
3983 |
|
3984 MethodType toStringType = new MethodType(List.<Type>nil(), |
|
3985 syms.stringType, |
|
3986 List.<Type>nil(), |
|
3987 cdef.sym); |
|
3988 toStringSym = new MethodSymbol(PUBLIC, |
|
3989 names.toString, |
|
3990 toStringType, |
|
3991 cdef.type.tsym); |
|
3992 toStringDecl = make.MethodDef((MethodSymbol)toStringSym, |
|
3993 make.Block(0L, List.of(ret))); |
|
3994 |
|
3995 cdef.defs = cdef.defs.prepend(toStringDecl); |
|
3996 cdef.sym.members().enter(toStringSym); |
|
3997 |
|
3998 return (MethodSymbol)toStringSym; |
|
3999 } |
|
4000 |
|
4001 private MethodSymbol addEnumCompareTo(JCClassDecl cdef, VarSymbol ordinalSymbol) { |
|
4002 Symbol compareToSym = lookupMethod(cdef.pos(), |
|
4003 names.compareTo, |
|
4004 cdef.type, |
|
4005 List.of(cdef.sym.type)); |
|
4006 |
|
4007 Assert.check(compareToSym instanceof MethodSymbol); |
|
4008 |
|
4009 JCMethodDecl compareToDecl = (JCMethodDecl) TreeInfo.declarationFor(compareToSym, cdef); |
|
4010 |
|
4011 ListBuffer<JCStatement> blockStatements = new ListBuffer<JCStatement>(); |
|
4012 |
|
4013 JCModifiers mod1 = make.Modifiers(0L); |
|
4014 Name oName = names.fromString("o"); |
|
4015 JCVariableDecl par1 = make.Param(oName, cdef.type, compareToSym); |
|
4016 |
|
4017 JCIdent paramId1 = make.Ident(names.java_lang_Object); |
|
4018 paramId1.type = cdef.type; |
|
4019 paramId1.sym = par1.sym; |
|
4020 |
|
4021 ((MethodSymbol)compareToSym).params = List.of(par1.sym); |
|
4022 |
|
4023 JCIdent par1UsageId = make.Ident(par1.sym); |
|
4024 JCIdent castTargetIdent = make.Ident(cdef.sym); |
|
4025 JCTypeCast cast = make.TypeCast(castTargetIdent, par1UsageId); |
|
4026 cast.setType(castTargetIdent.type); |
|
4027 |
|
4028 Name otherName = names.fromString("other"); |
|
4029 |
|
4030 VarSymbol otherVarSym = new VarSymbol(mod1.flags, |
|
4031 otherName, |
|
4032 cdef.type, |
|
4033 compareToSym); |
|
4034 JCVariableDecl otherVar = make.VarDef(otherVarSym, cast); |
|
4035 blockStatements.append(otherVar); |
|
4036 |
|
4037 JCIdent id1 = make.Ident(ordinalSymbol); |
|
4038 |
|
4039 JCIdent fLocUsageId = make.Ident(otherVarSym); |
|
4040 JCExpression sel = make.Select(fLocUsageId, ordinalSymbol); |
|
4041 JCBinary bin = makeBinary(MINUS, id1, sel); |
|
4042 JCReturn ret = make.Return(bin); |
|
4043 blockStatements.append(ret); |
|
4044 JCMethodDecl compareToMethod = make.MethodDef((MethodSymbol)compareToSym, |
|
4045 make.Block(0L, |
|
4046 blockStatements.toList())); |
|
4047 compareToMethod.params = List.of(par1); |
|
4048 cdef.defs = cdef.defs.append(compareToMethod); |
|
4049 |
|
4050 return (MethodSymbol)compareToSym; |
|
4051 } |
|
4052 ////////////////////////////////////////////////////////////// |
|
4053 // The above contributed by Borland for bootstrapping purposes |
|
4054 ////////////////////////////////////////////////////////////// |
|
4055 } |
3862 } |