private void emitCFG(DebugInformationEmitter emitter, Program program) { Map<TextLocation, TextLocation[]> cfg = ProgramUtils.getLocationCFG(program); for (Map.Entry<TextLocation, TextLocation[]> entry : cfg.entrySet()) { SourceLocation location = map(entry.getKey()); SourceLocation[] successors = new SourceLocation[entry.getValue().length]; for (int i = 0; i < entry.getValue().length; ++i) { successors[i] = map(entry.getValue()[i]); } emitter.addSuccessors(location, successors); } }
@Override public void visit(ThrowStatement statement) { try { debugEmitter.emitStatementStart(); if (statement.getLocation() != null) { pushLocation(statement.getLocation()); } writer.appendFunction("$rt_throw").append("("); prevCallSite = debugEmitter.emitCallSite(); precedence = Precedence.min(); statement.getException().acceptVisitor(this); writer.append(");").softNewLine(); debugEmitter.emitCallSite(); if (statement.getLocation() != null) { popLocation(); } } catch (IOException e) { throw new RenderingException("IO error occurred", e); } }
private void renderMethodBodies(ClassNode cls) throws RenderingException { debugEmitter.emitClass(cls.getName()); try { MethodReader clinit = classSource.get(cls.getName()).getMethod( new MethodDescriptor("<clinit>", ValueType.VOID)); if (clinit != null) { renderCallClinit(clinit, cls); } if (!cls.getModifiers().contains(ElementModifier.INTERFACE)) { for (MethodNode method : cls.getMethods()) { if (!method.getModifiers().contains(ElementModifier.STATIC)) { if (method.getReference().getName().equals("<init>")) { renderInitializer(cls.getName(), method); } } } } for (MethodNode method : cls.getMethods()) { renderBody(cls.getName(), method); } } catch (IOException e) { throw new RenderingException("IO error occurred", e); } debugEmitter.emitClass(null); }
private void renderDeclaration(ClassNode cls) throws RenderingException { String jsName = naming.getNameFor(cls.getName()); debugEmitter.addClass(jsName, cls.getName(), cls.getParentName()); try { writer.append("function " + jsName + "()").ws().append("{") writer.append(thisAliased ? "a" : "this").append(".").appendField(fieldRef).ws() .append("=").ws().append(context.constantToString(value)).append(";").softNewLine(); debugEmitter.addField(field.getName(), naming.getNameFor(fieldRef));
@Override public void visit(BreakStatement statement) { try { debugEmitter.emitStatementStart(); if (statement.getLocation() != null) { pushLocation(statement.getLocation()); } writer.append("break"); if (statement.getTarget() != null) { writer.append(' ').append(mapBlockId(statement.getTarget().getId())); } writer.append(";").softNewLine(); if (statement.getLocation() != null) { popLocation(); } } catch (IOException e) { throw new RenderingException("IO error occurred", e); } }
private void renderVirtualDeclarations(Collection<MethodReference> methods) throws IOException { if (methods.stream().noneMatch(this::isVirtual)) { writer.append('0'); return; } writer.append("["); boolean first = true; for (MethodReference method : methods) { if (!isVirtual(method)) { continue; } debugEmitter.emitMethod(method.getDescriptor()); if (!first) { writer.append(",").ws(); } first = false; emitVirtualDeclaration(method); debugEmitter.emitMethod(null); } writer.append("]"); }
public void popLocation() { LocationStackEntry prevEntry = locationStack.pop(); LocationStackEntry entry = locationStack.peek(); if (entry != null) { if (!entry.location.equals(prevEntry.location)) { debugEmitter.emitLocation(entry.location.getFileName(), entry.location.getLine()); } } else { debugEmitter.emitLocation(null, -1); } }
MethodReference ref = method.getReference(); for (int i = 0; i < method.getVariables().size(); ++i) { debugEmitter.emitVariable(new String[] { method.getVariables().get(i).getName() }, statementRenderer.variableName(i));
renderer.getDebugEmitter().setLocationProvider(sourceWriter); for (Map.Entry<MethodReference, Injector> entry : methodInjectors.entrySet()) { renderingContext.addInjector(entry.getKey(), entry.getValue());
case STATIC: writer.appendMethodBody(method).append("("); prevCallSite = debugEmitter.emitCallSite(); for (int i = 0; i < expr.getArguments().size(); ++i) { if (i > 0) { case SPECIAL: writer.appendMethodBody(method).append("("); prevCallSite = debugEmitter.emitCallSite(); precedence = Precedence.min(); expr.getArguments().get(0).acceptVisitor(this); case DYNAMIC: writer.append(".").append(name).append("("); prevCallSite = debugEmitter.emitCallSite(); for (int i = 1; i < expr.getArguments().size(); ++i) { if (i > 1) { case CONSTRUCTOR: writer.appendInit(expr.getMethod()).append("("); prevCallSite = debugEmitter.emitCallSite(); for (int i = 0; i < expr.getArguments().size(); ++i) { if (i > 0) {
private void renderDeclaration(ClassNode cls) throws RenderingException { debugEmitter.addClass(cls.getName(), cls.getParentName()); try { writer.append("function ").appendClass(cls.getName()).append("()").ws().append("{") writer.append(thisAliased ? "a" : "this").append(".").appendField(fieldRef).ws() .append("=").ws().append(context.constantToString(value)).append(";").softNewLine(); debugEmitter.addField(field.getName(), naming.getNameFor(fieldRef));
@Override public void visit(ContinueStatement statement) { try { debugEmitter.emitStatementStart(); if (statement.getLocation() != null) { pushLocation(statement.getLocation()); } writer.append("continue"); if (statement.getTarget() != null) { writer.append(' ').append(mapBlockId(statement.getTarget().getId())); } writer.append(";").softNewLine(); if (statement.getLocation() != null) { popLocation(); } } catch (IOException e) { throw new RenderingException("IO error occurred", e); } }
private void renderInitializer(String className, MethodNode method) throws IOException { MethodReference ref = method.getReference(); debugEmitter.emitMethod(ref.getDescriptor()); renderFunctionDeclaration(className, naming.getNameForInit(ref)); writer.append("("); for (int i = 0; i < ref.parameterCount(); ++i) { if (i > 0) { writer.append(",").ws(); } writer.append(variableNameForInitializer(i)); } writer.append(")").ws().append("{").softNewLine().indent(); String instanceName = variableNameForInitializer(ref.parameterCount()); writer.append("var " + instanceName).ws().append("=").ws().append("new ").appendClass( ref.getClassName()).append("();").softNewLine(); writer.appendMethodBody(ref).append("(" + instanceName); for (int i = 0; i < ref.parameterCount(); ++i) { writer.append(",").ws(); writer.append(variableNameForInitializer(i)); } writer.append(");").softNewLine(); writer.append("return " + instanceName + ";").softNewLine(); writer.outdent().append("}"); if (classScoped) { writer.append(";"); } writer.newLine(); debugEmitter.emitMethod(null); }
public void pushLocation(TextLocation location) { LocationStackEntry prevEntry = locationStack.peek(); if (location != null) { if (prevEntry == null || !location.equals(prevEntry.location)) { debugEmitter.emitLocation(location.getFileName(), location.getLine()); } } else { if (prevEntry != null) { debugEmitter.emitLocation(null, -1); } } locationStack.push(new LocationStackEntry(location)); }
MethodReference ref = methodNode.getReference(); for (int i = 0; i < methodNode.getVariables().size(); ++i) { debugEmitter.emitVariable(new String[] { methodNode.getVariables().get(i).getName() }, statementRenderer.variableName(i));
renderer.getDebugEmitter().setLocationProvider(sourceWriter); for (Map.Entry<MethodReference, Injector> entry : methodInjectors.entrySet()) { renderingContext.addInjector(entry.getKey(), entry.getValue());
case STATIC: writer.append(naming.getFullNameFor(method)).append("("); prevCallSite = debugEmitter.emitCallSite(); for (int i = 0; i < expr.getArguments().size(); ++i) { if (i > 0) { case SPECIAL: writer.append(naming.getFullNameFor(method)).append("("); prevCallSite = debugEmitter.emitCallSite(); precedence = Precedence.min(); expr.getArguments().get(0).acceptVisitor(this); case DYNAMIC: writer.append(".").append(name).append("("); prevCallSite = debugEmitter.emitCallSite(); for (int i = 1; i < expr.getArguments().size(); ++i) { if (i > 1) { case CONSTRUCTOR: writer.append(naming.getNameForInit(expr.getMethod())).append("("); prevCallSite = debugEmitter.emitCallSite(); for (int i = 0; i < expr.getArguments().size(); ++i) { if (i > 0) {
@Override public void visit(ReturnStatement statement) { try { debugEmitter.emitStatementStart(); if (statement.getLocation() != null) { pushLocation(statement.getLocation()); } writer.append("return"); if (statement.getResult() != null) { writer.append(' '); prevCallSite = debugEmitter.emitCallSite(); precedence = Precedence.min(); statement.getResult().acceptVisitor(this); debugEmitter.emitCallSite(); } writer.append(";").softNewLine(); if (statement.getLocation() != null) { popLocation(); } } catch (IOException e) { throw new RenderingException("IO error occurred", e); } }
@Override public void visit(InitClassStatement statement) { ClassReader cls = classSource.get(statement.getClassName()); if (cls == null) { return; } MethodReader method = cls.getMethod(new MethodDescriptor("<clinit>", void.class)); if (method == null) { return; } try { debugEmitter.emitStatementStart(); if (statement.getLocation() != null) { pushLocation(statement.getLocation()); } writer.appendClassInit(statement.getClassName()).append("();").softNewLine(); if (statement.isAsync()) { emitSuspendChecker(); } if (statement.getLocation() != null) { popLocation(); } } catch (IOException e) { throw new RenderingException("IO error occurred", e); } }
private void renderBody(String className, MethodNode method) throws IOException { StatementRenderer statementRenderer = new StatementRenderer(context, writer); statementRenderer.setCurrentMethod(method); MethodReference ref = method.getReference(); debugEmitter.emitMethod(ref.getDescriptor()); String name = naming.getFullNameFor(ref); renderFunctionDeclaration(className, name); writer.append("("); int startParam = 0; if (method.getModifiers().contains(ElementModifier.STATIC)) { startParam = 1; } for (int i = startParam; i <= ref.parameterCount(); ++i) { if (i > startParam) { writer.append(",").ws(); } writer.append(statementRenderer.variableName(i)); } writer.append(")").ws().append("{").softNewLine().indent(); method.acceptVisitor(new MethodBodyRenderer(statementRenderer)); writer.outdent().append("}"); if (classScoped) { writer.append(";"); } writer.newLine(); debugEmitter.emitMethod(null); longLibraryUsed |= statementRenderer.isLongLibraryUsed(); }