diff --git a/teavm-classlib/src/main/java/org/teavm/classlib/java/lang/TOutOfMemoryError.java b/teavm-classlib/src/main/java/org/teavm/classlib/java/lang/TOutOfMemoryError.java new file mode 100644 index 000000000..ffdf97f56 --- /dev/null +++ b/teavm-classlib/src/main/java/org/teavm/classlib/java/lang/TOutOfMemoryError.java @@ -0,0 +1,32 @@ +/* + * Copyright 2015 Alexey Andreev. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.teavm.classlib.java.lang; + +/** + * + * @author Alexey Andreev + */ +public class TOutOfMemoryError extends TVirtualMachineError { + private static final long serialVersionUID = -1891949851728458692L; + + public TOutOfMemoryError() { + super(); + } + + public TOutOfMemoryError(TString message) { + super(message); + } +} diff --git a/teavm-classlib/src/main/java/org/teavm/classlib/java/lang/TVirtualMachineError.java b/teavm-classlib/src/main/java/org/teavm/classlib/java/lang/TVirtualMachineError.java new file mode 100644 index 000000000..33deeae40 --- /dev/null +++ b/teavm-classlib/src/main/java/org/teavm/classlib/java/lang/TVirtualMachineError.java @@ -0,0 +1,32 @@ +/* + * Copyright 2015 Alexey Andreev. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.teavm.classlib.java.lang; + +/** + * + * @author Alexey Andreev + */ +public class TVirtualMachineError extends TError { + private static final long serialVersionUID = -4246822614122675559L; + + public TVirtualMachineError() { + super(); + } + + public TVirtualMachineError(TString message) { + super(message); + } +} diff --git a/teavm-core/src/main/java/org/teavm/debugging/information/DebugInformation.java b/teavm-core/src/main/java/org/teavm/debugging/information/DebugInformation.java index 91cd5dada..12fd1e235 100644 --- a/teavm-core/src/main/java/org/teavm/debugging/information/DebugInformation.java +++ b/teavm-core/src/main/java/org/teavm/debugging/information/DebugInformation.java @@ -386,7 +386,7 @@ public class DebugInformation { } private int indexByKey(RecordArray mapping, GeneratedLocation location) { - int index = Collections.binarySearch(new LocationList(mapping), location); + int index = binarySearchLocation(mapping, location.getLine(), location.getColumn()); return index >= 0 ? index : -index - 2; } @@ -598,7 +598,33 @@ public class DebugInformation { return new GeneratedLocation(record.get(0), record.get(1)); } - static class LocationList extends AbstractList { + private int binarySearchLocation(RecordArray array, int row, int column) { + int l = 0; + int u = array.size() - 1; + while (true) { + int i = (l + u) / 2; + RecordArray.Record e = array.get(i); + int cmp = Integer.compare(row, e.get(0)); + if (cmp == 0) { + cmp = Integer.compare(column, e.get(1)); + } + if (cmp == 0) { + return i; + } else if (cmp < 0) { + u = i - 1; + if (u < l) { + return -i - 1; + } + } else { + l = i + 1; + if (l > u) { + return -i - 2; + } + } + } + } + + static class LocationList extends AbstractList implements RandomAccess { private RecordArray recordArray; public LocationList(RecordArray recordArray) { diff --git a/teavm-core/src/main/java/org/teavm/model/util/MissingItemsProcessor.java b/teavm-core/src/main/java/org/teavm/model/util/MissingItemsProcessor.java index e9beafe5c..6d09daf75 100644 --- a/teavm-core/src/main/java/org/teavm/model/util/MissingItemsProcessor.java +++ b/teavm-core/src/main/java/org/teavm/model/util/MissingItemsProcessor.java @@ -61,15 +61,22 @@ public class MissingItemsProcessor { for (int i = 0; i < program.basicBlockCount(); ++i) { BasicBlock block = program.basicBlockAt(i); instructionsToAdd.clear(); + boolean missing = false; for (int j = 0; j < block.getInstructions().size(); ++j) { Instruction insn = block.getInstructions().get(j); insn.acceptVisitor(instructionProcessor); if (!instructionsToAdd.isEmpty()) { wasModified = true; truncateBlock(block, j); + missing = true; break; } } + if (!missing) { + for (TryCatchBlock tryCatch : block.getTryCatchBlocks()) { + checkClass(null, tryCatch.getExceptionType()); + } + } } if (wasModified) { new UnreachableBasicBlockEliminator().optimize(program);