2108 enumDefs.append(make.VarDef(valuesVar, newArray)); |
2108 enumDefs.append(make.VarDef(valuesVar, newArray)); |
2109 tree.sym.members().enter(valuesVar); |
2109 tree.sym.members().enter(valuesVar); |
2110 |
2110 |
2111 Symbol valuesSym = lookupMethod(tree.pos(), names.values, |
2111 Symbol valuesSym = lookupMethod(tree.pos(), names.values, |
2112 tree.type, List.<Type>nil()); |
2112 tree.type, List.<Type>nil()); |
2113 JCTypeCast valuesResult = |
2113 List<JCStatement> valuesBody; |
2114 make.TypeCast(valuesSym.type.getReturnType(), |
2114 if (useClone()) { |
2115 make.App(make.Select(make.Ident(valuesVar), |
2115 // return (T[]) $VALUES.clone(); |
2116 syms.arrayCloneMethod))); |
2116 JCTypeCast valuesResult = |
|
2117 make.TypeCast(valuesSym.type.getReturnType(), |
|
2118 make.App(make.Select(make.Ident(valuesVar), |
|
2119 syms.arrayCloneMethod))); |
|
2120 valuesBody = List.<JCStatement>of(make.Return(valuesResult)); |
|
2121 } else { |
|
2122 // template: T[] $result = new T[$values.length]; |
|
2123 Name resultName = names.fromString(target.syntheticNameChar() + "result"); |
|
2124 while (tree.sym.members().lookup(resultName).scope != null) // avoid name clash |
|
2125 resultName = names.fromString(resultName + "" + target.syntheticNameChar()); |
|
2126 VarSymbol resultVar = new VarSymbol(FINAL|SYNTHETIC, |
|
2127 resultName, |
|
2128 arrayType, |
|
2129 valuesSym); |
|
2130 JCNewArray resultArray = make.NewArray(make.Type(types.erasure(tree.type)), |
|
2131 List.of(make.Select(make.Ident(valuesVar), syms.lengthVar)), |
|
2132 null); |
|
2133 resultArray.type = arrayType; |
|
2134 JCVariableDecl decl = make.VarDef(resultVar, resultArray); |
|
2135 |
|
2136 // template: System.arraycopy($VALUES, 0, $result, 0, $VALUES.length); |
|
2137 if (systemArraycopyMethod == null) { |
|
2138 systemArraycopyMethod = |
|
2139 new MethodSymbol(PUBLIC | STATIC, |
|
2140 names.fromString("arraycopy"), |
|
2141 new MethodType(List.<Type>of(syms.objectType, |
|
2142 syms.intType, |
|
2143 syms.objectType, |
|
2144 syms.intType, |
|
2145 syms.intType), |
|
2146 syms.voidType, |
|
2147 List.<Type>nil(), |
|
2148 syms.methodClass), |
|
2149 syms.systemType.tsym); |
|
2150 } |
|
2151 JCStatement copy = |
|
2152 make.Exec(make.App(make.Select(make.Ident(syms.systemType.tsym), |
|
2153 systemArraycopyMethod), |
|
2154 List.of(make.Ident(valuesVar), make.Literal(0), |
|
2155 make.Ident(resultVar), make.Literal(0), |
|
2156 make.Select(make.Ident(valuesVar), syms.lengthVar)))); |
|
2157 |
|
2158 // template: return $result; |
|
2159 JCStatement ret = make.Return(make.Ident(resultVar)); |
|
2160 valuesBody = List.<JCStatement>of(decl, copy, ret); |
|
2161 } |
|
2162 |
2117 JCMethodDecl valuesDef = |
2163 JCMethodDecl valuesDef = |
2118 make.MethodDef((MethodSymbol)valuesSym, |
2164 make.MethodDef((MethodSymbol)valuesSym, make.Block(0, valuesBody)); |
2119 make.Block(0, List.<JCStatement>nil() |
2165 |
2120 .prepend(make.Return(valuesResult)))); |
|
2121 enumDefs.append(valuesDef); |
2166 enumDefs.append(valuesDef); |
|
2167 |
|
2168 if (debugLower) |
|
2169 System.err.println(tree.sym + ".valuesDef = " + valuesDef); |
2122 |
2170 |
2123 /** The template for the following code is: |
2171 /** The template for the following code is: |
2124 * |
2172 * |
2125 * public static E valueOf(String name) { |
2173 * public static E valueOf(String name) { |
2126 * return (E)Enum.valueOf(E.class, name); |
2174 * return (E)Enum.valueOf(E.class, name); |
2153 // Add the necessary members for the EnumCompatibleMode |
2201 // Add the necessary members for the EnumCompatibleMode |
2154 if (target.compilerBootstrap(tree.sym)) { |
2202 if (target.compilerBootstrap(tree.sym)) { |
2155 addEnumCompatibleMembers(tree); |
2203 addEnumCompatibleMembers(tree); |
2156 } |
2204 } |
2157 } |
2205 } |
|
2206 // where |
|
2207 private MethodSymbol systemArraycopyMethod; |
|
2208 private boolean useClone() { |
|
2209 try { |
|
2210 Scope.Entry e = syms.objectType.tsym.members().lookup(names.clone); |
|
2211 return (e.sym != null); |
|
2212 } |
|
2213 catch (CompletionFailure e) { |
|
2214 return false; |
|
2215 } |
|
2216 } |
2158 |
2217 |
2159 /** Translate an enumeration constant and its initializer. */ |
2218 /** Translate an enumeration constant and its initializer. */ |
2160 private void visitEnumConstantDef(JCVariableDecl var, int ordinal) { |
2219 private void visitEnumConstantDef(JCVariableDecl var, int ordinal) { |
2161 JCNewClass varDef = (JCNewClass)var.init; |
2220 JCNewClass varDef = (JCNewClass)var.init; |
2162 varDef.args = varDef.args. |
2221 varDef.args = varDef.args. |