private CompileResult compileToJs(Method method, TeaVMTestConfiguration<JavaScriptTarget> configuration, File path) { boolean decodeStack = Boolean.parseBoolean(System.getProperty(JS_DECODE_STACK, "true")); DebugInformationBuilder debugEmitter = new DebugInformationBuilder(); Supplier<JavaScriptTarget> targetSupplier = () -> { JavaScriptTarget target = new JavaScriptTarget(); if (decodeStack) { postBuild = (vm, file) -> { DebugInformation debugInfo = debugEmitter.getDebugInformation(); File sourceMapsFile = new File(file.getPath() + ".map"); File debugFile = new File(file.getPath() + ".teavmdbg");
@Override public DeferredCallSite emitCallSite() { final RecordArrayBuilder.Record record = add(callSiteMapping, DebuggerCallSite.NONE); return new DeferredCallSite() { @Override
debugInformation.fileMapping = compress(fileMapping).build(); debugInformation.lineMapping = compress(lineMapping).build(); debugInformation.classMapping = compress(classMapping).build(); debugInformation.methodMapping = compress(methodMapping).build(); debugInformation.callSiteMapping = callSiteMapping.build(); debugInformation.variableMappings = new RecordArray[variableNames.list.size()]; for (int var : variableMappings.keySet()) { RecordArrayBuilder mapping = variableMappings.get(var); compressAndSortArrays(mapping); debugInformation.variableMappings[var] = mapping.build();
private TeaVMTarget prepareJavaScriptTarget() { javaScriptTarget = new JavaScriptTarget(); javaScriptTarget.setMinifying(minifying); debugEmitter = debugInformationGenerated || sourceMapsFileGenerated ? new DebugInformationBuilder() : null; javaScriptTarget.setDebugEmitter(debugEmitter); return javaScriptTarget; }
private void generateDebug(DebugInformationBuilder debugInformationBuilder) { try { DebugInformation debugInformation = debugInformationBuilder.getDebugInformation(); String sourceMapName = fileName + ".map"; try (Writer writer = new OutputStreamWriter(buildTarget.appendToResource(fileName), StandardCharsets.UTF_8)) { writer.append("\n//# sourceMappingURL=" + sourceMapName); } try (Writer writer = new OutputStreamWriter(buildTarget.createResource(sourceMapName), StandardCharsets.UTF_8)) { debugInformation.writeAsSourceMaps(writer, "src", fileName); } debugInformation.write(buildTarget.createResource(fileName + ".teavmdbg")); } catch (IOException e) { throw new RuntimeException("IO error occurred writing debug information", e); } }
reportProgress(0); DebugInformationBuilder debugInformationBuilder = new DebugInformationBuilder(); ClassLoader classLoader = initClassLoader(); classSource.setUnderlyingSource(new PreOptimizingClassHolderSource(
private void additionalJavaScriptOutput(Writer writer) throws IOException { if (debugInformationGenerated) { assert debugEmitter != null; DebugInformation debugInfo = debugEmitter.getDebugInformation(); File debugSymbolFile = new File(targetDirectory, getResolvedTargetFileName() + ".teavmdbg"); try (OutputStream debugInfoOut = new BufferedOutputStream(new FileOutputStream(debugSymbolFile))) { debugInfo.write(debugInfoOut); } generatedFiles.add(debugSymbolFile); log.info("Debug information successfully written"); } if (sourceMapsFileGenerated) { assert debugEmitter != null; DebugInformation debugInfo = debugEmitter.getDebugInformation(); String sourceMapsFileName = getResolvedTargetFileName() + ".map"; writer.append("\n//# sourceMappingURL=").append(sourceMapsFileName); File sourceMapsFile = new File(targetDirectory, sourceMapsFileName); try (Writer sourceMapsOut = new OutputStreamWriter(new FileOutputStream(sourceMapsFile), StandardCharsets.UTF_8)) { debugInfo.writeAsSourceMaps(sourceMapsOut, "src", getResolvedTargetFileName()); } generatedFiles.add(sourceMapsFile); log.info("Source maps successfully written"); } if (sourceFilesCopied) { copySourceFiles(); log.info("Source files successfully written"); } }
private TeaVMTarget prepareJavaScriptTarget() { javaScriptTarget = new JavaScriptTarget(); javaScriptTarget.setMinifying(minifying); debugEmitter = debugInformationGenerated || sourceMapsFileGenerated ? new DebugInformationBuilder() : null; javaScriptTarget.setDebugEmitter(debugEmitter); if (incremental) { javaScriptTarget.setAstCache(astCache); } return javaScriptTarget; }
DebugInformation debugInfo = debugEmitter.getDebugInformation(); File debugSymbolFile = new File(targetDirectory, getResolvedTargetFileName() + ".teavmdbg"); try (OutputStream debugInfoOut = new BufferedOutputStream(new FileOutputStream(debugSymbolFile))) { DebugInformation debugInfo = debugEmitter.getDebugInformation(); String sourceMapsFileName = getResolvedTargetFileName() + ".map"; writer.append("\n//# sourceMappingURL=").append(sourceMapsFileName);
@Override public void emitLocation(String fileName, int line) { debugInformation = null; int fileIndex = files.index(fileName); if (!Objects.equals(currentFileName, fileName)) { add(fileMapping, fileIndex); currentFileName = fileName; } if (currentLine != line) { add(lineMapping, line); currentLine = line; } }
debugInformation.fileMapping = compress(fileMapping).build(); debugInformation.lineMapping = compress(lineMapping).build(); debugInformation.classMapping = compress(classMapping).build(); debugInformation.methodMapping = compress(methodMapping).build(); debugInformation.callSiteMapping = callSiteMapping.build(); debugInformation.variableMappings = new RecordArray[variableNames.list.size()]; for (int var : variableMappings.keySet()) { RecordArrayBuilder mapping = variableMappings.get(var); compressAndSortArrays(mapping); debugInformation.variableMappings[var] = mapping.build();
private RecordArrayBuilder.Record add(RecordArrayBuilder builder, int value) { RecordArrayBuilder.Record record = add(builder); record.set(2, value); return record; }
@Override public void emitClass(String className) { debugInformation = null; int classIndex = classes.index(className); if (!Objects.equals(className, currentClass)) { add(classMapping, classIndex); currentClass = className; } }
@Override public void emitMethod(MethodDescriptor method) { debugInformation = null; int methodIndex = methods.index(method != null ? method.toString() : null); if (!Objects.equals(method, currentMethod)) { add(methodMapping, methodIndex); currentMethod = method; } if (currentClass != null) { int classIndex = classes.index(currentClass); long fullIndex = ((long) classIndex << 32) | methodIndex; if (!exactMethodMap.containsKey(fullIndex)) { exactMethodMap.put(fullIndex, exactMethods.size()); exactMethods.add(fullIndex); } } }
@Override public void emitVariable(String[] sourceNames, String generatedName) { int[] sourceIndexes = new int[sourceNames.length]; for (int i = 0; i < sourceIndexes.length; ++i) { sourceIndexes[i] = variableNames.index(sourceNames[i]); } Arrays.sort(sourceIndexes); int generatedIndex = variableNames.index(generatedName); RecordArrayBuilder mapping = variableMappings.computeIfAbsent(generatedIndex, k -> new RecordArrayBuilder(2, 1)); RecordArrayBuilder.Record record = add(mapping); RecordArrayBuilder.SubArray array = record.getArray(0); for (int sourceIndex : sourceIndexes) { array.add(sourceIndex); } }
@Override public DeferredCallSite emitCallSite() { final RecordArrayBuilder.Record record = add(callSiteMapping, DebuggerCallSite.NONE); return new DeferredCallSite() { @Override
@Override public void emitLocation(String fileName, int line) { debugInformation = null; int fileIndex = files.index(fileName); if (!Objects.equals(currentFileName, fileName)) { add(fileMapping, fileIndex); currentFileName = fileName; } if (currentLine != line) { add(lineMapping, line); currentLine = line; } }
@Override public void emitClass(String className) { debugInformation = null; int classIndex = classes.index(className); if (!Objects.equals(className, currentClass)) { add(classMapping, classIndex); currentClass = className; } }
private RecordArrayBuilder.Record add(RecordArrayBuilder builder, int value) { RecordArrayBuilder.Record record = add(builder); record.set(2, value); return record; }
@Override public void emitMethod(MethodDescriptor method) { debugInformation = null; int methodIndex = methods.index(method != null ? method.toString() : null); if (!Objects.equals(method, currentMethod)) { add(methodMapping, methodIndex); currentMethod = method; } if (currentClass != null) { int classIndex = classes.index(currentClass); long fullIndex = ((long) classIndex << 32) | methodIndex; if (!exactMethodMap.containsKey(fullIndex)) { exactMethodMap.put(fullIndex, exactMethods.size()); exactMethods.add(fullIndex); } } }