use of com.github.anba.es6draft.compiler.assembler.Code.ClassCode in project es6draft by anba.
the class Compiler method defineAndLoad.
private <T> T defineAndLoad(Code code, String clazzName) {
boolean printCode = isEnabled(Option.PrintCode);
boolean printSimple = printCode && !isEnabled(Option.PrintFullCode);
boolean debugInfo = isEnabled(Option.DebugInfo);
CodeLoader loader = new CodeLoader();
for (ClassCode classCode : code.getClasses()) {
String className = Type.className(classCode.className);
if (debugInfo) {
classCode.addField(Modifier.PRIVATE | Modifier.STATIC, "classBytes", Type.of(byte[].class), null);
}
byte[] bytes = classCode.toByteArray();
if (printCode) {
System.out.println(Code.toByteCode(bytes, printSimple));
}
// System.out.printf("define class '%s'%n", className);
Class<?> c = loader.defineClass(className, bytes);
if (debugInfo) {
try {
Field classBytes = c.getDeclaredField("classBytes");
classBytes.setAccessible(true);
classBytes.set(null, bytes);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
}
try {
Class<?> c = loader.loadClass(Type.className(clazzName));
@SuppressWarnings("unchecked") T instance = (T) c.newInstance();
return instance;
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
use of com.github.anba.es6draft.compiler.assembler.Code.ClassCode in project es6draft by anba.
the class Compiler method defineAndLoad.
private <T> T defineAndLoad(Program program, Code code, AnonymousCodeLoader loader) {
assert code.getClasses().size() == 1;
Source source = program.getSource();
ClassCode classCode = code.getClasses().get(0);
boolean printCode = isEnabled(Option.PrintCode);
boolean printSimple = printCode && !isEnabled(Option.PrintFullCode);
boolean debugInfo = isEnabled(Option.DebugInfo);
String className = Type.className(classCode.className);
if (debugInfo) {
addClassBytesField(classCode);
}
byte[] bytes = classCode.toByteArray();
if (printCode) {
System.out.println(Code.toByteCode(bytes, printSimple));
}
// System.out.printf("define class '%s'%n", className);
Class<?> c = loader.defineClass(className, bytes);
if (debugInfo) {
initializeClassBytes(c, bytes);
}
if (COUNT_CLASSES) {
STATISTICS.anonymousClasses.increment();
}
try {
@SuppressWarnings("unchecked") T instance = (T) c.getDeclaredConstructor(Source.class).newInstance(source);
return instance;
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
use of com.github.anba.es6draft.compiler.assembler.Code.ClassCode in project es6draft by anba.
the class Compiler method defineAndLoad.
private <T> T defineAndLoad(Program program, Code code, String mainClassName) {
Source source = program.getSource();
boolean printCode = isEnabled(Option.PrintCode);
boolean printSimple = printCode && !isEnabled(Option.PrintFullCode);
boolean debugInfo = isEnabled(Option.DebugInfo);
CodeLoader loader = new CodeLoader();
for (ClassCode classCode : code.getClasses()) {
String className = Type.className(classCode.className);
if (debugInfo) {
addClassBytesField(classCode);
}
byte[] bytes = classCode.toByteArray();
if (printCode) {
System.out.println(Code.toByteCode(bytes, printSimple));
}
// System.out.printf("define class '%s'%n", className);
Class<?> c = loader.defineClass(className, bytes);
if (debugInfo) {
initializeClassBytes(c, bytes);
}
}
if (COUNT_CLASSES) {
STATISTICS.defaultClasses.increment();
}
try {
Class<?> c = loader.loadClass(Type.className(mainClassName));
@SuppressWarnings("unchecked") T instance = (T) c.getDeclaredConstructor(Source.class).newInstance(source);
return instance;
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
if (cause instanceof StackOverflowError) {
throw (StackOverflowError) cause;
}
throw new RuntimeException(e);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
Aggregations