Produce less names in top level scope in dev server mode in order to improve debugging performance in Chrome

This commit is contained in:
Alexey Andreev 2019-01-23 13:27:40 +03:00
parent 48227b24a0
commit 1dd379551c
11 changed files with 106 additions and 42 deletions

View File

@ -292,7 +292,7 @@ public class ClassGenerator implements Generator, Injector, DependencyPlugin {
private void initClass(SourceWriter writer, MemberReader member) throws IOException { private void initClass(SourceWriter writer, MemberReader member) throws IOException {
if (member.hasModifier(ElementModifier.STATIC)) { if (member.hasModifier(ElementModifier.STATIC)) {
writer.append(writer.getNaming().getNameForClassInit(member.getOwnerName())).append("();").softNewLine(); writer.appendClassInit(member.getOwnerName()).append("();").softNewLine();
} }
} }

View File

@ -94,7 +94,7 @@ public class ArrayNativeGenerator implements Generator, DependencyPlugin {
writer.append("if (" + array + " === null || " + array + ".constructor.$meta.item === undefined) {") writer.append("if (" + array + " === null || " + array + ".constructor.$meta.item === undefined) {")
.softNewLine().indent(); .softNewLine().indent();
MethodReference cons = new MethodReference("java.lang.IllegalArgumentException", "<init>", ValueType.VOID); MethodReference cons = new MethodReference("java.lang.IllegalArgumentException", "<init>", ValueType.VOID);
writer.append("$rt_throw(").append(writer.getNaming().getNameForInit(cons)).append("());").softNewLine(); writer.append("$rt_throw(").appendInit(cons).append("());").softNewLine();
writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine();
writer.append("return " + array + ".data.length;").softNewLine(); writer.append("return " + array + ".data.length;").softNewLine();
} }

View File

@ -112,6 +112,7 @@ public class JavaScriptTarget implements TeaVMTarget, TeaVMJavaScriptHost {
private final Set<MethodReference> asyncFamilyMethods = new HashSet<>(); private final Set<MethodReference> asyncFamilyMethods = new HashSet<>();
private ClassInitializerInsertionTransformer clinitInsertionTransformer; private ClassInitializerInsertionTransformer clinitInsertionTransformer;
private List<VirtualMethodContributor> customVirtualMethods = new ArrayList<>(); private List<VirtualMethodContributor> customVirtualMethods = new ArrayList<>();
private boolean classScoped;
@Override @Override
public List<ClassHolderTransformer> getTransformers() { public List<ClassHolderTransformer> getTransformers() {
@ -190,6 +191,10 @@ public class JavaScriptTarget implements TeaVMTarget, TeaVMJavaScriptHost {
this.debugEmitter = debugEmitter; this.debugEmitter = debugEmitter;
} }
public void setClassScoped(boolean classScoped) {
this.classScoped = classScoped;
}
@Override @Override
public boolean requiresRegisterAllocation() { public boolean requiresRegisterAllocation() {
return true; return true;
@ -306,6 +311,7 @@ public class JavaScriptTarget implements TeaVMTarget, TeaVMJavaScriptHost {
DefaultNamingStrategy naming = new DefaultNamingStrategy(aliasProvider, controller.getUnprocessedClassSource()); DefaultNamingStrategy naming = new DefaultNamingStrategy(aliasProvider, controller.getUnprocessedClassSource());
SourceWriterBuilder builder = new SourceWriterBuilder(naming); SourceWriterBuilder builder = new SourceWriterBuilder(naming);
builder.setMinified(minifying); builder.setMinified(minifying);
builder.setClassScoped(classScoped);
SourceWriter sourceWriter = builder.build(writer); SourceWriter sourceWriter = builder.build(writer);
DebugInformationEmitter debugEmitterToUse = debugEmitter; DebugInformationEmitter debugEmitterToUse = debugEmitter;
@ -320,7 +326,7 @@ public class JavaScriptTarget implements TeaVMTarget, TeaVMJavaScriptHost {
controller.getDependencyInfo(), m -> isVirtual(virtualMethodContributorContext, m)); controller.getDependencyInfo(), m -> isVirtual(virtualMethodContributorContext, m));
renderingContext.setMinifying(minifying); renderingContext.setMinifying(minifying);
Renderer renderer = new Renderer(sourceWriter, asyncMethods, asyncFamilyMethods, Renderer renderer = new Renderer(sourceWriter, asyncMethods, asyncFamilyMethods,
controller.getDiagnostics(), renderingContext); controller.getDiagnostics(), renderingContext, classScoped);
RuntimeRenderer runtimeRenderer = new RuntimeRenderer(classes, naming, sourceWriter); RuntimeRenderer runtimeRenderer = new RuntimeRenderer(classes, naming, sourceWriter);
renderer.setProperties(controller.getProperties()); renderer.setProperties(controller.getProperties());
renderer.setMinifying(minifying); renderer.setMinifying(minifying);
@ -373,7 +379,7 @@ public class JavaScriptTarget implements TeaVMTarget, TeaVMJavaScriptHost {
: controller.getEntryPoints().entrySet()) { : controller.getEntryPoints().entrySet()) {
sourceWriter.append("").append(entry.getKey()).ws().append("=").ws(); sourceWriter.append("").append(entry.getKey()).ws().append("=").ws();
MethodReference ref = entry.getValue().getMethod(); MethodReference ref = entry.getValue().getMethod();
sourceWriter.append("$rt_mainStarter(").append(naming.getFullNameFor(ref)); sourceWriter.append("$rt_mainStarter(").appendMethodBody(ref);
sourceWriter.append(");").newLine(); sourceWriter.append(");").newLine();
} }

View File

@ -31,11 +31,13 @@ public class SourceWriter implements Appendable, LocationProvider {
private int column; private int column;
private int line; private int line;
private int offset; private int offset;
private boolean classScoped;
SourceWriter(NamingStrategy naming, Appendable innerWriter, int lineWidth) { SourceWriter(NamingStrategy naming, Appendable innerWriter, int lineWidth, boolean classScoped) {
this.naming = naming; this.naming = naming;
this.innerWriter = innerWriter; this.innerWriter = innerWriter;
this.lineWidth = lineWidth; this.lineWidth = lineWidth;
this.classScoped = classScoped;
} }
void setMinified(boolean minified) { void setMinified(boolean minified) {
@ -111,6 +113,7 @@ public class SourceWriter implements Appendable, LocationProvider {
} }
public SourceWriter appendStaticField(FieldReference field) throws IOException { public SourceWriter appendStaticField(FieldReference field) throws IOException {
appendClassScopeIfNecessary(field.getClassName());
return append(naming.getFullNameFor(field)); return append(naming.getFullNameFor(field));
} }
@ -123,21 +126,38 @@ public class SourceWriter implements Appendable, LocationProvider {
} }
public SourceWriter appendMethodBody(MethodReference method) throws IOException { public SourceWriter appendMethodBody(MethodReference method) throws IOException {
appendClassScopeIfNecessary(method.getClassName());
return append(naming.getFullNameFor(method)); return append(naming.getFullNameFor(method));
} }
public SourceWriter appendMethodBody(String className, String name, ValueType... params) throws IOException { public SourceWriter appendMethodBody(String className, String name, ValueType... params) throws IOException {
return append(naming.getFullNameFor(new MethodReference(className, new MethodDescriptor(name, params)))); return appendMethodBody(new MethodReference(className, new MethodDescriptor(name, params)));
} }
public SourceWriter appendMethodBody(Class<?> cls, String name, Class<?>... params) throws IOException { public SourceWriter appendMethodBody(Class<?> cls, String name, Class<?>... params) throws IOException {
return append(naming.getFullNameFor(new MethodReference(cls, name, params))); return appendMethodBody(new MethodReference(cls, name, params));
} }
public SourceWriter appendFunction(String name) throws IOException { public SourceWriter appendFunction(String name) throws IOException {
return append(naming.getNameForFunction(name)); return append(naming.getNameForFunction(name));
} }
public SourceWriter appendInit(MethodReference method) throws IOException {
appendClassScopeIfNecessary(method.getClassName());
return append(naming.getNameForInit(method));
}
public SourceWriter appendClassInit(String className) throws IOException {
appendClassScopeIfNecessary(className);
return append(naming.getNameForClassInit(className));
}
private void appendClassScopeIfNecessary(String className) throws IOException {
if (classScoped) {
append(naming.getNameFor(className)).append(".");
}
}
private void appendIndent() throws IOException { private void appendIndent() throws IOException {
if (minified) { if (minified) {
return; return;

View File

@ -18,6 +18,7 @@ package org.teavm.backend.javascript.codegen;
public class SourceWriterBuilder { public class SourceWriterBuilder {
private NamingStrategy naming; private NamingStrategy naming;
private boolean minified; private boolean minified;
private boolean classScoped;
private int lineWidth = 512; private int lineWidth = 512;
public SourceWriterBuilder(NamingStrategy naming) { public SourceWriterBuilder(NamingStrategy naming) {
@ -36,8 +37,12 @@ public class SourceWriterBuilder {
this.lineWidth = lineWidth; this.lineWidth = lineWidth;
} }
public void setClassScoped(boolean classScoped) {
this.classScoped = classScoped;
}
public SourceWriter build(Appendable innerWriter) { public SourceWriter build(Appendable innerWriter) {
SourceWriter writer = new SourceWriter(naming, innerWriter, lineWidth); SourceWriter writer = new SourceWriter(naming, innerWriter, lineWidth, classScoped);
writer.setMinified(minified); writer.setMinified(minified);
return writer; return writer;
} }

View File

@ -419,7 +419,7 @@ public class AstWriter {
} }
writer.outdent(); writer.outdent();
} }
writer.append('}'); writer.outdent().append('}');
} }
private void print(TryStatement node) throws IOException { private void print(TryStatement node) throws IOException {

View File

@ -65,6 +65,7 @@ public class Renderer implements RenderingManager {
private final ListableClassReaderSource classSource; private final ListableClassReaderSource classSource;
private final ClassLoader classLoader; private final ClassLoader classLoader;
private boolean minifying; private boolean minifying;
private boolean classScoped;
private final Properties properties = new Properties(); private final Properties properties = new Properties();
private final ServiceRepository services; private final ServiceRepository services;
private DebugInformationEmitter debugEmitter = new DummyDebugInformationEmitter(); private DebugInformationEmitter debugEmitter = new DummyDebugInformationEmitter();
@ -83,7 +84,7 @@ public class Renderer implements RenderingManager {
private boolean threadLibraryUsed; private boolean threadLibraryUsed;
public Renderer(SourceWriter writer, Set<MethodReference> asyncMethods, Set<MethodReference> asyncFamilyMethods, public Renderer(SourceWriter writer, Set<MethodReference> asyncMethods, Set<MethodReference> asyncFamilyMethods,
Diagnostics diagnostics, RenderingContext context) { Diagnostics diagnostics, RenderingContext context, boolean classScoped) {
this.naming = context.getNaming(); this.naming = context.getNaming();
this.writer = writer; this.writer = writer;
this.classSource = context.getClassSource(); this.classSource = context.getClassSource();
@ -93,6 +94,7 @@ public class Renderer implements RenderingManager {
this.asyncFamilyMethods = new HashSet<>(asyncFamilyMethods); this.asyncFamilyMethods = new HashSet<>(asyncFamilyMethods);
this.diagnostics = diagnostics; this.diagnostics = diagnostics;
this.context = context; this.context = context;
this.classScoped = classScoped;
} }
public boolean isLongLibraryUsed() { public boolean isLongLibraryUsed() {
@ -294,7 +296,7 @@ public class Renderer implements RenderingManager {
} }
private void renderDeclaration(ClassNode cls) throws RenderingException { private void renderDeclaration(ClassNode cls) throws RenderingException {
String jsName = writer.getNaming().getNameFor(cls.getName()); String jsName = naming.getNameFor(cls.getName());
debugEmitter.addClass(jsName, cls.getName(), cls.getParentName()); debugEmitter.addClass(jsName, cls.getName(), cls.getParentName());
try { try {
writer.append("function " + jsName + "()").ws().append("{") writer.append("function " + jsName + "()").ws().append("{")
@ -345,7 +347,12 @@ public class Renderer implements RenderingManager {
postponedFieldInitializers.add(new PostponedFieldInitializer(fieldRef, (String) value)); postponedFieldInitializers.add(new PostponedFieldInitializer(fieldRef, (String) value));
value = null; value = null;
} }
writer.append("var ").appendStaticField(fieldRef).ws().append("=").ws() if (classScoped) {
writer.append(jsName).append(".");
} else {
writer.append("var ");
}
writer.append(naming.getFullNameFor(fieldRef)).ws().append("=").ws()
.append(context.constantToString(value)).append(";").softNewLine(); .append(context.constantToString(value)).append(";").softNewLine();
} }
} catch (IOException e) { } catch (IOException e) {
@ -366,14 +373,14 @@ public class Renderer implements RenderingManager {
for (MethodNode method : cls.getMethods()) { for (MethodNode method : cls.getMethods()) {
if (!method.getModifiers().contains(ElementModifier.STATIC)) { if (!method.getModifiers().contains(ElementModifier.STATIC)) {
if (method.getReference().getName().equals("<init>")) { if (method.getReference().getName().equals("<init>")) {
renderInitializer(method); renderInitializer(cls.getName(), method);
} }
} }
} }
} }
for (MethodNode method : cls.getMethods()) { for (MethodNode method : cls.getMethods()) {
renderBody(method); renderBody(cls.getName(), method);
} }
} catch (IOException e) { } catch (IOException e) {
throw new RenderingException("IO error occurred", e); throw new RenderingException("IO error occurred", e);
@ -390,7 +397,8 @@ public class Renderer implements RenderingManager {
.append("false;").softNewLine(); .append("false;").softNewLine();
} }
writer.append("function ").append(naming.getNameForClassInit(cls.getName())).append("()").ws() renderFunctionDeclaration(cls.getName(), naming.getNameForClassInit(cls.getName()));
writer.append("()").ws()
.append("{").softNewLine().indent(); .append("{").softNewLine().indent();
if (isAsync) { if (isAsync) {
@ -435,11 +443,15 @@ public class Renderer implements RenderingManager {
writer.appendFunction("$rt_nativeThread").append("().push(" + context.pointerName() + ");").softNewLine(); writer.appendFunction("$rt_nativeThread").append("().push(" + context.pointerName() + ");").softNewLine();
} }
writer.outdent().append("}").newLine(); writer.outdent().append("}");
if (classScoped) {
writer.append(";");
}
writer.newLine();
} }
private void renderEraseClinit(ClassNode cls) throws IOException { private void renderEraseClinit(ClassNode cls) throws IOException {
writer.append(naming.getNameForClassInit(cls.getName())).ws().append("=").ws() writer.appendClassInit(cls.getName()).ws().append("=").ws()
.appendFunction("$rt_eraseClinit").append("(") .appendFunction("$rt_eraseClinit").append("(")
.appendClass(cls.getName()).append(");").softNewLine(); .appendClass(cls.getName()).append(");").softNewLine();
} }
@ -514,7 +526,7 @@ public class Renderer implements RenderingManager {
MethodReader clinit = classSource.get(cls.getName()).getMethod( MethodReader clinit = classSource.get(cls.getName()).getMethod(
new MethodDescriptor("<clinit>", ValueType.VOID)); new MethodDescriptor("<clinit>", ValueType.VOID));
if (clinit != null) { if (clinit != null) {
writer.append(naming.getNameForClassInit(cls.getName())); writer.appendClassInit(cls.getName());
} else { } else {
writer.append('0'); writer.append('0');
} }
@ -676,10 +688,11 @@ public class Renderer implements RenderingManager {
return null; return null;
} }
private void renderInitializer(MethodNode method) throws IOException { private void renderInitializer(String className, MethodNode method) throws IOException {
MethodReference ref = method.getReference(); MethodReference ref = method.getReference();
debugEmitter.emitMethod(ref.getDescriptor()); debugEmitter.emitMethod(ref.getDescriptor());
writer.append("function ").append(naming.getNameForInit(ref)).append("("); renderFunctionDeclaration(className, naming.getNameForInit(ref));
writer.append("(");
for (int i = 0; i < ref.parameterCount(); ++i) { for (int i = 0; i < ref.parameterCount(); ++i) {
if (i > 0) { if (i > 0) {
writer.append(",").ws(); writer.append(",").ws();
@ -691,14 +704,18 @@ public class Renderer implements RenderingManager {
String instanceName = variableNameForInitializer(ref.parameterCount()); String instanceName = variableNameForInitializer(ref.parameterCount());
writer.append("var " + instanceName).ws().append("=").ws().append("new ").appendClass( writer.append("var " + instanceName).ws().append("=").ws().append("new ").appendClass(
ref.getClassName()).append("();").softNewLine(); ref.getClassName()).append("();").softNewLine();
writer.append(naming.getFullNameFor(ref)).append("(" + instanceName); writer.appendMethodBody(ref).append("(" + instanceName);
for (int i = 0; i < ref.parameterCount(); ++i) { for (int i = 0; i < ref.parameterCount(); ++i) {
writer.append(",").ws(); writer.append(",").ws();
writer.append(variableNameForInitializer(i)); writer.append(variableNameForInitializer(i));
} }
writer.append(");").softNewLine(); writer.append(");").softNewLine();
writer.append("return " + instanceName + ";").softNewLine(); writer.append("return " + instanceName + ";").softNewLine();
writer.outdent().append("}").newLine(); writer.outdent().append("}");
if (classScoped) {
writer.append(";");
}
writer.newLine();
debugEmitter.emitMethod(null); debugEmitter.emitMethod(null);
} }
@ -755,7 +772,7 @@ public class Renderer implements RenderingManager {
writer.append(");").ws().append("}"); writer.append(");").ws().append("}");
} }
private void renderBody(MethodNode method) throws IOException { private void renderBody(String className, MethodNode method) throws IOException {
StatementRenderer statementRenderer = new StatementRenderer(context, writer); StatementRenderer statementRenderer = new StatementRenderer(context, writer);
statementRenderer.setCurrentMethod(method); statementRenderer.setCurrentMethod(method);
@ -763,7 +780,8 @@ public class Renderer implements RenderingManager {
debugEmitter.emitMethod(ref.getDescriptor()); debugEmitter.emitMethod(ref.getDescriptor());
String name = naming.getFullNameFor(ref); String name = naming.getFullNameFor(ref);
writer.append("function ").append(name).append("("); renderFunctionDeclaration(className, name);
writer.append("(");
int startParam = 0; int startParam = 0;
if (method.getModifiers().contains(ElementModifier.STATIC)) { if (method.getModifiers().contains(ElementModifier.STATIC)) {
startParam = 1; startParam = 1;
@ -778,6 +796,9 @@ public class Renderer implements RenderingManager {
method.acceptVisitor(new MethodBodyRenderer(statementRenderer)); method.acceptVisitor(new MethodBodyRenderer(statementRenderer));
writer.outdent().append("}"); writer.outdent().append("}");
if (classScoped) {
writer.append(";");
}
writer.newLine(); writer.newLine();
debugEmitter.emitMethod(null); debugEmitter.emitMethod(null);
@ -785,6 +806,16 @@ public class Renderer implements RenderingManager {
longLibraryUsed |= statementRenderer.isLongLibraryUsed(); longLibraryUsed |= statementRenderer.isLongLibraryUsed();
} }
private void renderFunctionDeclaration(String className, String name) throws IOException {
if (classScoped) {
writer.appendClass(className).append(".").append(name).ws().append("=").ws();
}
writer.append("function");
if (!classScoped) {
writer.append(" ").append(name);
}
}
private void renderAsyncPrologue() throws IOException { private void renderAsyncPrologue() throws IOException {
writer.append(context.mainLoopName()).append(":").ws().append("while").ws().append("(true)") writer.append(context.mainLoopName()).append(":").ws().append("while").ws().append("(true)")
.ws().append("{").ws(); .ws().append("{").ws();

View File

@ -124,7 +124,7 @@ public class RuntimeRenderer {
writer.append("for (var i = 0; i < str.length; i = (i + 1) | 0) {").indent().softNewLine(); writer.append("for (var i = 0; i < str.length; i = (i + 1) | 0) {").indent().softNewLine();
writer.append("charsBuffer[i] = str.charCodeAt(i) & 0xFFFF;").softNewLine(); writer.append("charsBuffer[i] = str.charCodeAt(i) & 0xFFFF;").softNewLine();
writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine();
writer.append("return ").append(naming.getNameForInit(stringCons)).append("(characters);").softNewLine(); writer.append("return ").appendInit(stringCons).append("(characters);").softNewLine();
writer.outdent().append("}").newLine(); writer.outdent().append("}").newLine();
} }
@ -147,7 +147,7 @@ public class RuntimeRenderer {
private void renderRuntimeNullCheck() throws IOException { private void renderRuntimeNullCheck() throws IOException {
writer.append("function $rt_nullCheck(val) {").indent().softNewLine(); writer.append("function $rt_nullCheck(val) {").indent().softNewLine();
writer.append("if (val === null) {").indent().softNewLine(); writer.append("if (val === null) {").indent().softNewLine();
writer.append("$rt_throw(").append(naming.getNameForInit(NPE_INIT_METHOD)).append("());").softNewLine(); writer.append("$rt_throw(").appendInit(NPE_INIT_METHOD).append("());").softNewLine();
writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine();
writer.append("return val;").softNewLine(); writer.append("return val;").softNewLine();
writer.outdent().append("}").newLine(); writer.outdent().append("}").newLine();
@ -194,8 +194,7 @@ public class RuntimeRenderer {
private void renderRuntimeCreateException() throws IOException { private void renderRuntimeCreateException() throws IOException {
writer.append("function $rt_createException(message)").ws().append("{").indent().softNewLine(); writer.append("function $rt_createException(message)").ws().append("{").indent().softNewLine();
writer.append("return "); writer.append("return ");
writer.append(writer.getNaming().getNameForInit(new MethodReference(RuntimeException.class, writer.appendInit(new MethodReference(RuntimeException.class, "<init>", String.class, void.class));
"<init>", String.class, void.class)));
writer.append("(message);").softNewLine(); writer.append("(message);").softNewLine();
writer.outdent().append("}").newLine(); writer.outdent().append("}").newLine();
} }
@ -211,7 +210,7 @@ public class RuntimeRenderer {
.append("lineNumber)").ws().append("{").indent().softNewLine(); .append("lineNumber)").ws().append("{").indent().softNewLine();
writer.append("return "); writer.append("return ");
if (supported) { if (supported) {
writer.append(writer.getNaming().getNameForInit(STACK_TRACE_ELEM_INIT)); writer.appendInit(STACK_TRACE_ELEM_INIT);
writer.append("(className,").ws() writer.append("(className,").ws()
.append("methodName,").ws() .append("methodName,").ws()
.append("fileName,").ws() .append("fileName,").ws()

View File

@ -442,7 +442,7 @@ public class StatementRenderer implements ExprVisitor, StatementVisitor {
if (statement.getLocation() != null) { if (statement.getLocation() != null) {
pushLocation(statement.getLocation()); pushLocation(statement.getLocation());
} }
writer.append(naming.getNameForClassInit(statement.getClassName())).append("();").softNewLine(); writer.appendClassInit(statement.getClassName()).append("();").softNewLine();
if (statement.isAsync()) { if (statement.isAsync()) {
emitSuspendChecker(); emitSuspendChecker();
} }
@ -1095,7 +1095,7 @@ public class StatementRenderer implements ExprVisitor, StatementVisitor {
boolean virtual = false; boolean virtual = false;
switch (expr.getType()) { switch (expr.getType()) {
case STATIC: case STATIC:
writer.append(naming.getFullNameFor(method)).append("("); writer.appendMethodBody(method).append("(");
prevCallSite = debugEmitter.emitCallSite(); prevCallSite = debugEmitter.emitCallSite();
for (int i = 0; i < expr.getArguments().size(); ++i) { for (int i = 0; i < expr.getArguments().size(); ++i) {
if (i > 0) { if (i > 0) {
@ -1106,7 +1106,7 @@ public class StatementRenderer implements ExprVisitor, StatementVisitor {
} }
break; break;
case SPECIAL: case SPECIAL:
writer.append(naming.getFullNameFor(method)).append("("); writer.appendMethodBody(method).append("(");
prevCallSite = debugEmitter.emitCallSite(); prevCallSite = debugEmitter.emitCallSite();
precedence = Precedence.min(); precedence = Precedence.min();
expr.getArguments().get(0).acceptVisitor(this); expr.getArguments().get(0).acceptVisitor(this);
@ -1129,7 +1129,7 @@ public class StatementRenderer implements ExprVisitor, StatementVisitor {
virtual = true; virtual = true;
break; break;
case CONSTRUCTOR: case CONSTRUCTOR:
writer.append(naming.getNameForInit(expr.getMethod())).append("("); writer.appendInit(expr.getMethod()).append("(");
prevCallSite = debugEmitter.emitCallSite(); prevCallSite = debugEmitter.emitCallSite();
for (int i = 0; i < expr.getArguments().size(); ++i) { for (int i = 0; i < expr.getArguments().size(); ++i) {
if (i > 0) { if (i > 0) {

View File

@ -197,9 +197,10 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
} }
} }
String selfName = writer.getNaming().getFullNameFor(new MethodReference(Platform.class, "getEnumConstants", MethodReference selfRef = new MethodReference(Platform.class, "getEnumConstants",
PlatformClass.class, Enum[].class)); PlatformClass.class, Enum[].class);
writer.append(selfName).ws().append("=").ws().append("function(cls)").ws().append("{").softNewLine().indent(); writer.appendMethodBody(selfRef).ws().append("=").ws().append("function(cls)").ws().append("{").softNewLine()
.indent();
writer.append("if").ws().append("(!cls.hasOwnProperty(c))").ws().append("{").indent().softNewLine(); writer.append("if").ws().append("(!cls.hasOwnProperty(c))").ws().append("{").indent().softNewLine();
writer.append("return null;").softNewLine(); writer.append("return null;").softNewLine();
writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine();
@ -210,7 +211,7 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
writer.append("return cls[c];").softNewLine(); writer.append("return cls[c];").softNewLine();
writer.outdent().append("};").softNewLine(); writer.outdent().append("};").softNewLine();
writer.append("return ").append(selfName).append("(").append(context.getParameterName(1)) writer.append("return ").appendMethodBody(selfRef).append("(").append(context.getParameterName(1))
.append(");").softNewLine(); .append(");").softNewLine();
} }
@ -221,21 +222,22 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
if (annotCls != null) { if (annotCls != null) {
writer.appendClass(clsName).append("[c]").ws().append("=").ws(); writer.appendClass(clsName).append("[c]").ws().append("=").ws();
MethodReference ctor = new MethodReference(annotCls.getName(), "<init>", ValueType.VOID); MethodReference ctor = new MethodReference(annotCls.getName(), "<init>", ValueType.VOID);
writer.append(writer.getNaming().getNameForInit(ctor)); writer.appendInit(ctor);
writer.append("();").softNewLine(); writer.append("();").softNewLine();
} }
} }
String selfName = writer.getNaming().getFullNameFor(new MethodReference(Platform.class, "getAnnotations", MethodReference selfRef = new MethodReference(Platform.class, "getAnnotations", PlatformClass.class,
PlatformClass.class, Annotation[].class)); Annotation[].class);
writer.append(selfName).ws().append("=").ws().append("function(cls)").ws().append("{").softNewLine().indent(); writer.appendMethodBody(selfRef).ws().append("=").ws().append("function(cls)").ws().append("{").softNewLine()
.indent();
writer.append("if").ws().append("(!cls.hasOwnProperty(c))").ws().append("{").indent().softNewLine(); writer.append("if").ws().append("(!cls.hasOwnProperty(c))").ws().append("{").indent().softNewLine();
writer.append("return null;").softNewLine(); writer.append("return null;").softNewLine();
writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine();
writer.append("return cls[c].").appendMethod("getAnnotations", Annotation[].class).append("();").softNewLine(); writer.append("return cls[c].").appendMethod("getAnnotations", Annotation[].class).append("();").softNewLine();
writer.outdent().append("};").softNewLine(); writer.outdent().append("};").softNewLine();
writer.append("return ").append(selfName).append("(").append(context.getParameterName(1)) writer.append("return ").appendMethodBody(selfRef).append("(").append(context.getParameterName(1))
.append(");").softNewLine(); .append(");").softNewLine();
} }
} }

View File

@ -724,6 +724,7 @@ public class CodeServlet extends HttpServlet {
jsTarget.setMinifying(false); jsTarget.setMinifying(false);
jsTarget.setAstCache(astCache); jsTarget.setAstCache(astCache);
jsTarget.setDebugEmitter(debugInformationBuilder); jsTarget.setDebugEmitter(debugInformationBuilder);
jsTarget.setClassScoped(true);
vm.setOptimizationLevel(TeaVMOptimizationLevel.SIMPLE); vm.setOptimizationLevel(TeaVMOptimizationLevel.SIMPLE);
vm.setCacheStatus(classSource); vm.setCacheStatus(classSource);
vm.addVirtualMethods(m -> true); vm.addVirtualMethods(m -> true);