aboutsummaryrefslogtreecommitdiff
path: root/src/jdk/nashorn/internal/codegen/ClassEmitter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jdk/nashorn/internal/codegen/ClassEmitter.java')
-rw-r--r--src/jdk/nashorn/internal/codegen/ClassEmitter.java45
1 files changed, 25 insertions, 20 deletions
diff --git a/src/jdk/nashorn/internal/codegen/ClassEmitter.java b/src/jdk/nashorn/internal/codegen/ClassEmitter.java
index 8ad81238..b9f645e4 100644
--- a/src/jdk/nashorn/internal/codegen/ClassEmitter.java
+++ b/src/jdk/nashorn/internal/codegen/ClassEmitter.java
@@ -52,6 +52,8 @@ import static jdk.nashorn.internal.codegen.CompilerConstants.methodDescriptor;
import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup;
import static jdk.nashorn.internal.codegen.CompilerConstants.typeDescriptor;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashSet;
@@ -166,8 +168,8 @@ public class ClassEmitter implements Emitter {
* @param unitClassName Compile unit class name.
* @param strictMode Should we generate this method in strict mode
*/
- ClassEmitter(final Compiler compiler, final String unitClassName, final boolean strictMode) {
- this(compiler.getContext(),
+ ClassEmitter(final Context context, final String sourceName, final String unitClassName, final boolean strictMode) {
+ this(context,
new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS) {
private static final String OBJECT_CLASS = "java/lang/Object";
@@ -187,13 +189,23 @@ public class ClassEmitter implements Emitter {
this.unitClassName = unitClassName;
this.constantMethodNeeded = new HashSet<>();
- cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, unitClassName, null, Compiler.pathName(jdk.nashorn.internal.scripts.JS$.class.getName()), null);
- cw.visitSource(compiler.getSource().getName(), null);
+ cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, unitClassName, null, pathName(jdk.nashorn.internal.scripts.JS$.class.getName()), null);
+ cw.visitSource(sourceName, null);
defineCommonStatics(strictMode);
}
/**
+ * Convert a binary name to a package/class name.
+ *
+ * @param name Binary name.
+ * @return Package/class name.
+ */
+ private static String pathName(final String name) {
+ return name.replace('.', '/');
+ }
+
+ /**
* Define the static fields common in all scripts.
* @param strictMode Should we generate this method in strict mode
*/
@@ -295,7 +307,7 @@ public class ClassEmitter implements Emitter {
* Ensure a get constant method is issued for the class.
* @param cls Class of constant.
*/
- public void needGetConstantMethod(final Class<?> cls) {
+ void needGetConstantMethod(final Class<?> cls) {
constantMethodNeeded.add(cls);
}
@@ -348,22 +360,15 @@ public class ClassEmitter implements Emitter {
/**
* Disassemble an array of byte code.
- *
- * @param context the context
* @param bytecode byte array representing bytecode
+ * @return disassembly as human readable string
*/
- public static void disassemble(final Context context, final byte[] bytecode) {
- new ClassReader(bytecode).accept(new TraceClassVisitor(context.getErr()), 0);
- }
-
- /**
- * Verify an array of byte code as a valid Java class
- *
- * @param context the context
- * @param bytecode the bytecode array
- */
- public static void verify(final Context context, final byte[] bytecode) {
- context.verify(bytecode);
+ public static String disassemble(final byte[] bytecode) {
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try (final PrintWriter pw = new PrintWriter(baos)) {
+ new ClassReader(bytecode).accept(new TraceClassVisitor(pw), 0);
+ }
+ return new String(baos.toByteArray());
}
/**
@@ -459,7 +464,7 @@ public class ClassEmitter implements Emitter {
final MethodVisitor mv = cw.visitMethod(
ACC_PUBLIC | ACC_STATIC | (functionNode.isVarArg() ? ACC_VARARGS : 0),
functionNode.getName(),
- FunctionSignature.functionSignature(functionNode),
+ new FunctionSignature(functionNode).toString(),
null,
null);