< prev index next >
src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/StringConcat.java
Print this page
*** 31,42 ****
import com.sun.tools.javac.tree.TreeInfo;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.util.*;
import static com.sun.tools.javac.code.Kinds.Kind.MTH;
! import static com.sun.tools.javac.code.TypeTag.DOUBLE;
! import static com.sun.tools.javac.code.TypeTag.LONG;
import static com.sun.tools.javac.jvm.ByteCodes.*;
import static com.sun.tools.javac.tree.JCTree.Tag.PLUS;
import com.sun.tools.javac.jvm.Items.*;
import java.util.HashMap;
--- 31,41 ----
import com.sun.tools.javac.tree.TreeInfo;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.util.*;
import static com.sun.tools.javac.code.Kinds.Kind.MTH;
! import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.jvm.ByteCodes.*;
import static com.sun.tools.javac.tree.JCTree.Tag.PLUS;
import com.sun.tools.javac.jvm.Items.*;
import java.util.HashMap;
*** 141,150 ****
--- 140,168 ----
}
return res.append(tree);
}
/**
+ * If the type is not accessible from current context, try to figure out the
+ * sharpest accessible supertype.
+ *
+ * @param originalType type to sharpen
+ * @return sharped type
+ */
+ protected Type sharpestAccessible(Type originalType) {
+ if (originalType.hasTag(ARRAY)) {
+ return types.makeArrayType(sharpestAccessible(types.elemtype(originalType)));
+ }
+
+ Type type = originalType;
+ while (!rs.isAccessible(gen.getAttrEnv(), type.asElement())) {
+ type = types.supertype(type);
+ }
+ return type;
+ }
+
+ /**
* "Legacy" bytecode flavor: emit the StringBuilder.append chains for string
* concatenation.
*/
private static class Inline extends StringConcat {
public Inline(Context context) {
*** 312,322 ****
Object constVal = arg.type.constValue();
if ("".equals(constVal)) continue;
if (arg.type == syms.botType) {
dynamicArgs.add(types.boxedClass(syms.voidType).type);
} else {
! dynamicArgs.add(arg.type);
}
gen.genExpr(arg, arg.type).load();
}
doCall(type, pos, dynamicArgs.toList());
--- 330,340 ----
Object constVal = arg.type.constValue();
if ("".equals(constVal)) continue;
if (arg.type == syms.botType) {
dynamicArgs.add(types.boxedClass(syms.voidType).type);
} else {
! dynamicArgs.add(sharpestAccessible(arg.type));
}
gen.genExpr(arg, arg.type).load();
}
doCall(type, pos, dynamicArgs.toList());
*** 413,423 ****
recipe.append(a);
}
} else {
// Ordinary arguments come through the dynamic arguments.
recipe.append(TAG_ARG);
! dynamicArgs.add(arg.type);
gen.genExpr(arg, arg.type).load();
}
}
doCall(type, pos, recipe.toString(), staticArgs.toList(), dynamicArgs.toList());
--- 431,441 ----
recipe.append(a);
}
} else {
// Ordinary arguments come through the dynamic arguments.
recipe.append(TAG_ARG);
! dynamicArgs.add(sharpestAccessible(arg.type));
gen.genExpr(arg, arg.type).load();
}
}
doCall(type, pos, recipe.toString(), staticArgs.toList(), dynamicArgs.toList());
< prev index next >