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.java72
1 files changed, 71 insertions, 1 deletions
diff --git a/src/jdk/nashorn/internal/codegen/ClassEmitter.java b/src/jdk/nashorn/internal/codegen/ClassEmitter.java
index 386effdc..9f7fe79d 100644
--- a/src/jdk/nashorn/internal/codegen/ClassEmitter.java
+++ b/src/jdk/nashorn/internal/codegen/ClassEmitter.java
@@ -59,6 +59,7 @@ import java.security.PrivilegedAction;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;
+
import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.util.TraceClassVisitor;
@@ -135,6 +136,16 @@ public class ClassEmitter implements Emitter {
/** Set of constants access methods required. */
private Set<Class<?>> constantMethodNeeded;
+ private int methodCount;
+
+ private int initCount;
+
+ private int clinitCount;
+
+ private int fieldCount;
+
+ private final Set<String> methodNames;
+
/**
* Constructor - only used internally in this class as it breaks
* abstraction towards ASM or other code generator below
@@ -146,6 +157,11 @@ public class ClassEmitter implements Emitter {
this.context = context;
this.cw = cw;
this.methodsStarted = new HashSet<>();
+ this.methodNames = new HashSet<>();
+ }
+
+ public Set<String> getMethodNames() {
+ return methodNames;
}
/**
@@ -209,6 +225,38 @@ public class ClassEmitter implements Emitter {
}
/**
+ * Get the method count, including init and clinit methods
+ * @return method count
+ */
+ public int getMethodCount() {
+ return methodCount;
+ }
+
+ /**
+ * Get the clinit count
+ * @return clinit count
+ */
+ public int getClinitCount() {
+ return clinitCount;
+ }
+
+ /**
+ * Get the init count
+ * @return init count
+ */
+ public int getInitCount() {
+ return initCount;
+ }
+
+ /**
+ * Get the field count
+ * @return field count
+ */
+ public int getFieldCount() {
+ return fieldCount;
+ }
+
+ /**
* Convert a binary name to a package/class name.
*
* @param name Binary name.
@@ -359,9 +407,16 @@ public class ClassEmitter implements Emitter {
*/
@Override
public void end() {
- assert classStarted;
+ assert classStarted : "class not started for " + unitClassName;
if (unitClassName != null) {
+ final MethodEmitter initMethod = init(EnumSet.of(Flag.PRIVATE));
+ initMethod.begin();
+ initMethod.load(Type.OBJECT, 0);
+ initMethod.newInstance(jdk.nashorn.internal.scripts.JS.class);
+ initMethod.returnVoid();
+ initMethod.end();
+
defineCommonUtilities();
}
@@ -419,6 +474,8 @@ public class ClassEmitter implements Emitter {
}
SplitMethodEmitter method(final SplitNode splitNode, final String methodName, final Class<?> rtype, final Class<?>... ptypes) {
+ methodCount++;
+ methodNames.add(methodName);
return new SplitMethodEmitter(this, methodVisitor(EnumSet.of(Flag.PUBLIC, Flag.STATIC), methodName, rtype, ptypes), splitNode);
}
@@ -446,6 +503,8 @@ public class ClassEmitter implements Emitter {
* @return method emitter to use for weaving this method
*/
MethodEmitter method(final EnumSet<Flag> methodFlags, final String methodName, final Class<?> rtype, final Class<?>... ptypes) {
+ methodCount++;
+ methodNames.add(methodName);
return new MethodEmitter(this, methodVisitor(methodFlags, methodName, rtype, ptypes));
}
@@ -471,6 +530,8 @@ public class ClassEmitter implements Emitter {
* @return method emitter to use for weaving this method
*/
MethodEmitter method(final EnumSet<Flag> methodFlags, final String methodName, final String descriptor) {
+ methodCount++;
+ methodNames.add(methodName);
return new MethodEmitter(this, cw.visitMethod(Flag.getValue(methodFlags), methodName, descriptor, null, null));
}
@@ -481,6 +542,8 @@ public class ClassEmitter implements Emitter {
* @return method emitter to use for weaving this method
*/
MethodEmitter method(final FunctionNode functionNode) {
+ methodCount++;
+ methodNames.add(functionNode.getName());
final FunctionSignature signature = new FunctionSignature(functionNode);
final MethodVisitor mv = cw.visitMethod(
ACC_PUBLIC | ACC_STATIC | (functionNode.isVarArg() ? ACC_VARARGS : 0),
@@ -499,6 +562,8 @@ public class ClassEmitter implements Emitter {
* @return method emitter to use for weaving this method
*/
MethodEmitter restOfMethod(final FunctionNode functionNode) {
+ methodCount++;
+ methodNames.add(functionNode.getName());
final MethodVisitor mv = cw.visitMethod(
ACC_PUBLIC | ACC_STATIC,
functionNode.getName(),
@@ -516,6 +581,7 @@ public class ClassEmitter implements Emitter {
* @return method emitter to use for weaving <clinit>
*/
MethodEmitter clinit() {
+ clinitCount++;
return method(EnumSet.of(Flag.STATIC), CLINIT.symbolName(), void.class);
}
@@ -525,6 +591,7 @@ public class ClassEmitter implements Emitter {
* @return method emitter to use for weaving <init>()V
*/
MethodEmitter init() {
+ initCount++;
return method(INIT.symbolName(), void.class);
}
@@ -535,6 +602,7 @@ public class ClassEmitter implements Emitter {
* @return method emitter to use for weaving <init>()V
*/
MethodEmitter init(final Class<?>... ptypes) {
+ initCount++;
return method(INIT.symbolName(), void.class, ptypes);
}
@@ -547,6 +615,7 @@ public class ClassEmitter implements Emitter {
* @return method emitter to use for weaving <init>(...)V
*/
MethodEmitter init(final EnumSet<Flag> flags, final Class<?>... ptypes) {
+ initCount++;
return method(flags, INIT.symbolName(), void.class, ptypes);
}
@@ -561,6 +630,7 @@ public class ClassEmitter implements Emitter {
* @see ClassEmitter.Flag
*/
final void field(final EnumSet<Flag> fieldFlags, final String fieldName, final Class<?> fieldType, final Object value) {
+ fieldCount++;
cw.visitField(Flag.getValue(fieldFlags), fieldName, typeDescriptor(fieldType), null, value).visitEnd();
}