src/share/classes/com/sun/tools/javac/comp/Lower.java

changeset 1646
a4913ea9bb62
parent 1640
fa24eba012bd
child 1687
a4be2c2fe0a1
equal deleted inserted replaced
1645:97f6839673d6 1646:a4913ea9bb62
2602 System.err.println(tree.sym + ".valueOf = " + valueOf); 2602 System.err.println(tree.sym + ".valueOf = " + valueOf);
2603 enumDefs.append(valueOf); 2603 enumDefs.append(valueOf);
2604 2604
2605 enumDefs.appendList(otherDefs.toList()); 2605 enumDefs.appendList(otherDefs.toList());
2606 tree.defs = enumDefs.toList(); 2606 tree.defs = enumDefs.toList();
2607
2608 // Add the necessary members for the EnumCompatibleMode
2609 if (target.compilerBootstrap(tree.sym)) {
2610 addEnumCompatibleMembers(tree);
2611 }
2612 } 2607 }
2613 // where 2608 // where
2614 private MethodSymbol systemArraycopyMethod; 2609 private MethodSymbol systemArraycopyMethod;
2615 private boolean useClone() { 2610 private boolean useClone() {
2616 try { 2611 try {
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 }

mercurial