Fixes bugs in debug information generator and writer

This commit is contained in:
Alexey Andreev 2014-07-27 23:39:56 +04:00
parent 94b9b001cd
commit 62281f696c
8 changed files with 28 additions and 7 deletions

View File

@ -39,6 +39,7 @@ public class DebugInformationBuilder implements DebugInformationEmitter {
return locationProvider; return locationProvider;
} }
@Override
public void setLocationProvider(LocationProvider locationProvider) { public void setLocationProvider(LocationProvider locationProvider) {
this.locationProvider = locationProvider; this.locationProvider = locationProvider;
} }
@ -114,8 +115,9 @@ public class DebugInformationBuilder implements DebugInformationEmitter {
fileDesc.methodMap = fileDescProto.methodMap.toArray(new MethodReference[0]); fileDesc.methodMap = fileDescProto.methodMap.toArray(new MethodReference[0]);
fileDesc.generatedLocations = new GeneratedLocation[fileDescProto.generatedLocations.size()][]; fileDesc.generatedLocations = new GeneratedLocation[fileDescProto.generatedLocations.size()][];
for (int i = 0; i < fileDescProto.generatedLocations.size(); ++i) { for (int i = 0; i < fileDescProto.generatedLocations.size(); ++i) {
fileDesc.generatedLocations[i] = fileDescProto.generatedLocations.get(index) List<GeneratedLocation> locations = fileDescProto.generatedLocations.get(index);
.toArray(new GeneratedLocation[0]); fileDesc.generatedLocations[i] = locations != null ?
locations.toArray(new GeneratedLocation[0]) : null;
} }
} }
} }
@ -132,6 +134,10 @@ public class DebugInformationBuilder implements DebugInformationEmitter {
line - generatedLocations.size() + 1, null)); line - generatedLocations.size() + 1, null));
} }
List<GeneratedLocation> existingLocations = generatedLocations.get(line); List<GeneratedLocation> existingLocations = generatedLocations.get(line);
if (existingLocations == null) {
existingLocations = new ArrayList<>();
generatedLocations.set(line, existingLocations);
}
existingLocations.add(location); existingLocations.add(location);
} }

View File

@ -15,6 +15,7 @@
*/ */
package org.teavm.debugging; package org.teavm.debugging;
import org.teavm.codegen.LocationProvider;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**
@ -22,6 +23,8 @@ import org.teavm.model.MethodReference;
* @author Alexey Andreev * @author Alexey Andreev
*/ */
public interface DebugInformationEmitter { public interface DebugInformationEmitter {
void setLocationProvider(LocationProvider locationProvider);
void emitLocation(String fileName, int line); void emitLocation(String fileName, int line);
void emitMethod(MethodReference method); void emitMethod(MethodReference method);

View File

@ -110,7 +110,11 @@ class DebugInformationWriter {
private void writeNumber(int number) throws IOException { private void writeNumber(int number) throws IOException {
do { do {
number = (number << 1) | (number >>> 31); if (number < 0) {
number = (-number << 1) | 1;
} else {
number = number << 1;
}
byte b = (byte)(number & 0x7F); byte b = (byte)(number & 0x7F);
if ((number & 0xFFFFFF80) != 0) { if ((number & 0xFFFFFF80) != 0) {
b |= 0x80; b |= 0x80;

View File

@ -15,6 +15,7 @@
*/ */
package org.teavm.debugging; package org.teavm.debugging;
import org.teavm.codegen.LocationProvider;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
@ -30,4 +31,8 @@ public class DummyDebugInformationEmitter implements DebugInformationEmitter {
@Override @Override
public void emitMethod(MethodReference method) { public void emitMethod(MethodReference method) {
} }
@Override
public void setLocationProvider(LocationProvider locationProvider) {
}
} }

View File

@ -232,7 +232,7 @@ public class Decompiler {
InstructionLocation lastLocation = null; InstructionLocation lastLocation = null;
NodeLocation nodeLocation = null; NodeLocation nodeLocation = null;
for (Instruction insn : generator.currentBlock.getInstructions()) { for (Instruction insn : generator.currentBlock.getInstructions()) {
if (lastLocation != insn.getLocation()) { if (insn.getLocation() != null && lastLocation != insn.getLocation()) {
lastLocation = insn.getLocation(); lastLocation = insn.getLocation();
nodeLocation = new NodeLocation(lastLocation.getFileName(), lastLocation.getLine()); nodeLocation = new NodeLocation(lastLocation.getFileName(), lastLocation.getLine());
} }

View File

@ -172,7 +172,11 @@ public class BasicBlock implements BasicBlockReader {
@Override @Override
public void readInstruction(int index, InstructionReader reader) { public void readInstruction(int index, InstructionReader reader) {
instructions.get(index).acceptVisitor(new InstructionReadVisitor(reader)); Instruction insn = instructions.get(index);
if (insn.getLocation() != null) {
reader.location(insn.getLocation());
}
insn.acceptVisitor(new InstructionReadVisitor(reader));
} }
@Override @Override

View File

@ -37,8 +37,6 @@ public class InstructionStringifier implements InstructionReader {
if (location != null) { if (location != null) {
sb.append("at " + (location.getFileName() != null ? location.getFileName() : "<unknown>") + ":" + sb.append("at " + (location.getFileName() != null ? location.getFileName() : "<unknown>") + ":" +
(location.getLine() >= 0 ? String.valueOf(location.getLine()) : "<unknown>")); (location.getLine() >= 0 ? String.valueOf(location.getLine()) : "<unknown>"));
} else {
sb.append("<unkwnown>");
} }
this.location = location; this.location = location;
} }

View File

@ -351,6 +351,7 @@ public class TeaVM implements TeaVMHost, ServiceRepository {
if (debugEmitter != null) { if (debugEmitter != null) {
renderer.setDebugEmitter(debugEmitter); renderer.setDebugEmitter(debugEmitter);
} }
debugEmitter.setLocationProvider(sourceWriter);
for (Map.Entry<MethodReference, Injector> entry : methodInjectors.entrySet()) { for (Map.Entry<MethodReference, Injector> entry : methodInjectors.entrySet()) {
renderer.addInjector(entry.getKey(), entry.getValue()); renderer.addInjector(entry.getKey(), entry.getValue());
} }