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

changeset 86
3437676858e3
parent 81
8973372aedf8
child 113
eff38cc97183
equal deleted inserted replaced
83:37470f5ea179 86:3437676858e3
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.

mercurial