Merge branch 'master' into diagnostics

This commit is contained in:
Alexey Andreev 2015-01-14 17:54:08 +04:00
commit bdf4f7dbae
21 changed files with 91 additions and 56 deletions

View File

@ -29,6 +29,10 @@
<name>TeaVM Java class library</name> <name>TeaVM Java class library</name>
<description>TeaVM Java class library emulation</description> <description>TeaVM Java class library emulation</description>
<properties>
<teavm.classlib.test.incremental>false</teavm.classlib.test.incremental>
</properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
@ -93,6 +97,7 @@
<properties> <properties>
<java.util.Locale.available>en, en_US, en_GB, ru, ru_RU</java.util.Locale.available> <java.util.Locale.available>en, en_US, en_GB, ru, ru_RU</java.util.Locale.available>
</properties> </properties>
<incremental>${teavm.classlib.test.incremental}</incremental>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>

View File

@ -64,7 +64,7 @@ public class TBufferedInputStream extends TFilterInputStream {
if (result > 0) { if (result > 0) {
markpos = -1; markpos = -1;
pos = 0; pos = 0;
count = result == -1 ? 0 : result; count = result;
} }
return result; return result;
} }

View File

@ -38,7 +38,7 @@ public class TFilterOutputStream extends TOutputStream {
} catch (TIOException e) { } catch (TIOException e) {
// do nothing // do nothing
} }
close(); out.close();
} }
@Override @Override

View File

@ -15,6 +15,8 @@
*/ */
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.javascript.ni.Rename;
/** /**
* *
* @author Alexey Andreev * @author Alexey Andreev
@ -26,5 +28,6 @@ public interface TCharSequence {
TCharSequence subSequence(int start, int end); TCharSequence subSequence(int start, int end);
@Rename("toString")
TString toString0(); TString toString0();
} }

View File

@ -25,6 +25,7 @@ import org.teavm.javascript.ni.InjectedBy;
*/ */
public class TClass<T> extends TObject { public class TClass<T> extends TObject {
TString name; TString name;
TString binaryName;
boolean primitive; boolean primitive;
boolean array; boolean array;
boolean isEnum; boolean isEnum;
@ -42,7 +43,7 @@ public class TClass<T> extends TObject {
public native boolean isAssignableFrom(TClass<?> obj); public native boolean isAssignableFrom(TClass<?> obj);
public TString getName() { public TString getName() {
return new TString(name); return name;
} }
public boolean isPrimitive() { public boolean isPrimitive() {

View File

@ -51,7 +51,7 @@ public class TObject {
@Rename("toString") @Rename("toString")
public TString toString0() { public TString toString0() {
return TString.wrap(getClass().getName() + "@" + identity()); return TString.wrap(getClass().getName() + "@" + TInteger.toHexString(identity()));
} }
@GeneratedBy(ObjectNativeGenerator.class) @GeneratedBy(ObjectNativeGenerator.class)

View File

@ -200,7 +200,7 @@ public class TStringBuffer extends TAbstractStringBuilder implements TAppendable
@Override @Override
public TStringBuffer deleteCharAt(int index) { public TStringBuffer deleteCharAt(int index) {
deleteCharAt(index); super.deleteCharAt(index);
return this; return this;
} }

View File

@ -200,7 +200,7 @@ public class TStringBuilder extends TAbstractStringBuilder implements TAppendabl
@Override @Override
public TStringBuilder deleteCharAt(int index) { public TStringBuilder deleteCharAt(int index) {
deleteCharAt(index); super.deleteCharAt(index);
return this; return this;
} }

View File

@ -109,7 +109,7 @@ public class TDateFormatSymbols implements TSerializable, TCloneable {
return false; return false;
} }
for (int j = 0; j < element.length; j++) { for (int j = 0; j < element.length; j++) {
if (element[j] != element[j] && !(element[j].equals(element[j]))) { if (!(element[j].equals(element[j]))) {
return false; return false;
} }
} }

View File

@ -54,19 +54,21 @@ public class TBitSet extends TObject implements TCloneable, TSerializable {
int[] ints = new int[(bytes.length + 3) / 4]; int[] ints = new int[(bytes.length + 3) / 4];
int fullInts = bytes.length / 4; int fullInts = bytes.length / 4;
for (int i = 0; i < fullInts; ++i) { for (int i = 0; i < fullInts; ++i) {
ints[i] = bytes[i * 4] | (bytes[i * 4 + 1] << 8) | (bytes[i * 4 + 2] << 16) | (bytes[i * 4 + 3] << 24); ints[i] = (bytes[i * 4] & 0xFF) | ((bytes[i * 4 + 1] & 0xFF) << 8) | ((bytes[i * 4 + 2] & 0xFF) << 16) |
((bytes[i * 4 + 3] & 0xFF) << 24);
} }
int lastInt = ints.length - 1; int lastInt = ints.length - 1;
int lastByte = bytes[lastInt * 4]; int lastByte = lastInt * 4;
switch (bytes.length % 4) { switch (bytes.length % 4) {
case 3: case 3:
ints[lastInt] = bytes[lastByte] | (bytes[lastByte + 1] << 8) | (bytes[lastByte + 2] << 16); ints[lastInt] = (bytes[lastByte] & 0xFF) | ((bytes[lastByte + 1] & 0xFF) << 8) |
((bytes[lastByte + 2] & 0xFF) << 16);
break; break;
case 2: case 2:
ints[lastInt] = bytes[lastByte] | (bytes[lastByte + 1] << 8); ints[lastInt] = (bytes[lastByte] & 0xFF) | ((bytes[lastByte + 1] & 0xFF) << 8);
break; break;
case 1: case 1:
ints[lastInt] = bytes[lastByte]; ints[lastInt] = bytes[lastByte] & 0xFF;
break; break;
} }
return new TBitSet(ints); return new TBitSet(ints);
@ -105,9 +107,9 @@ public class TBitSet extends TObject implements TCloneable, TSerializable {
int fullLongs = length / 64; int fullLongs = length / 64;
int i = 0; int i = 0;
for (; i < fullLongs; ++i) { for (; i < fullLongs; ++i) {
longs[i] = data[i * 2] | (data[i * 2 + 1] << 32); longs[i] = data[i * 2] | ((long)data[i * 2 + 1] << 32);
} }
if (((31 + length) / 32) % 2 == 1) { if ((((31 + length) / 32) & 1) == 1) {
longs[i] = data[i * 2]; longs[i] = data[i * 2];
} }
return longs; return longs;

View File

@ -39,7 +39,7 @@ public class TRandom extends TObject implements TSerializable {
} }
public void nextBytes(byte[] bytes) { public void nextBytes(byte[] bytes) {
for (int i = 0; i < bytes.length; ) { for (int i = 0; i < bytes.length; ++i) {
bytes[i] = (byte)next(8); bytes[i] = (byte)next(8);
} }
} }

View File

@ -26,6 +26,9 @@ public class ClassTest {
@Test @Test
public void classNameEvaluated() { public void classNameEvaluated() {
assertEquals("java.lang.Object", Object.class.getName()); assertEquals("java.lang.Object", Object.class.getName());
assertEquals("[Ljava.lang.Object;", Object[].class.getName());
assertEquals("int", int.class.getName());
assertEquals("[I", int[].class.getName());
} }
@Test @Test

View File

@ -60,4 +60,11 @@ public class ObjectTest {
public void properInstanceDetected() { public void properInstanceDetected() {
assertTrue(Object.class.isInstance(new Object())); assertTrue(Object.class.isInstance(new Object()));
} }
@Test
public void toStringWorks() {
assertTrue(new Object().toString().startsWith("java.lang.Object@"));
assertTrue(new Object[2].toString().startsWith("[Ljava.lang.Object;@"));
assertTrue(new byte[3].toString().startsWith("[B@"));
}
} }

View File

@ -32,11 +32,11 @@
package org.teavm.classlib.java.util; package org.teavm.classlib.java.util;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.BitSet; import java.util.BitSet;
import org.junit.Test; import org.junit.Test;
public class BitSetTest { public class BitSetTest {
BitSet eightbs; BitSet eightbs;
public BitSetTest() { public BitSetTest() {
@ -58,6 +58,23 @@ public class BitSetTest {
assertEquals("New BitSet had invalid string representation: " + bs, "{}", bs.toString()); assertEquals("New BitSet had invalid string representation: " + bs, "{}", bs.toString());
} }
@Test
public void constructFromBytes() {
for (int i = 4; i < 8; ++i) {
byte[] bytes = new byte[i];
Arrays.fill(bytes, (byte)0x80);
BitSet bs = BitSet.valueOf(bytes);
assertEquals("Wrong length of BitSet", i * 8, bs.length());
for (int j = 0; j < bs.length(); ++j) {
if (j % 8 == 7) {
assertTrue("Expected that " + j + "th bit is to be set", bs.get(j));
} else {
assertFalse("Expected that " + j + "th bit is not to be set", bs.get(j));
}
}
}
}
@Test @Test
public void clonePerformed() { public void clonePerformed() {
BitSet bs; BitSet bs;
@ -76,12 +93,9 @@ public class BitSetTest {
bs = (BitSet) eightbs.clone(); bs = (BitSet) eightbs.clone();
bs.set(128); bs.set(128);
assertFalse("Different sized BitSet with higher bit set returned true", assertFalse("Different sized BitSet with higher bit set returned true", eightbs.equals(bs));
eightbs.equals(bs));
bs.clear(128); bs.clear(128);
assertTrue( assertTrue("Different sized BitSet with higher bits not set returned false", eightbs.equals(bs));
"Different sized BitSet with higher bits not set returned false",
eightbs.equals(bs));
} }
@Test @Test

View File

@ -53,8 +53,10 @@ public class AstIO {
output.writeShort(method.getParameterDebugNames().size()); output.writeShort(method.getParameterDebugNames().size());
for (Set<String> debugNames : method.getParameterDebugNames()) { for (Set<String> debugNames : method.getParameterDebugNames()) {
output.writeShort(debugNames != null ? debugNames.size() : 0); output.writeShort(debugNames != null ? debugNames.size() : 0);
for (String debugName : debugNames) { if (debugNames != null) {
output.writeUTF(debugName); for (String debugName : debugNames) {
output.writeUTF(debugName);
}
} }
} }
output.writeBoolean(method.isOriginalNamePreserved()); output.writeBoolean(method.isOriginalNamePreserved());

View File

@ -224,7 +224,7 @@ public class Debugger {
} }
public Breakpoint createBreakpoint(SourceLocation location) { public Breakpoint createBreakpoint(SourceLocation location) {
synchronized (breakpoints) { synchronized (breakpointMap) {
Breakpoint breakpoint = new Breakpoint(this, location); Breakpoint breakpoint = new Breakpoint(this, location);
breakpoints.put(breakpoint, dummyObject); breakpoints.put(breakpoint, dummyObject);
updateInternalBreakpoints(breakpoint); updateInternalBreakpoints(breakpoint);
@ -366,7 +366,7 @@ public class Debugger {
breakpointMap.remove(jsBreakpoint); breakpointMap.remove(jsBreakpoint);
} }
breakpoint.jsBreakpoints = new ArrayList<>(); breakpoint.jsBreakpoints = new ArrayList<>();
breakpoints.remove(this); breakpoints.remove(breakpoint);
} }
private void fireResumed() { private void fireResumed() {

View File

@ -178,6 +178,12 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
.append("clsProto.$meta.name").ws().append("!==").ws().append("undefined").ws().append("?").ws() .append("clsProto.$meta.name").ws().append("!==").ws().append("undefined").ws().append("?").ws()
.append("$rt_str(clsProto.$meta.name)").ws().append(":").ws().append("null;").softNewLine(); .append("$rt_str(clsProto.$meta.name)").ws().append(":").ws().append("null;").softNewLine();
} }
if (classSource.get(classClass).getField("name") != null) {
writer.append("cls.").appendField(new FieldReference(classClass, "binaryName")).ws().append("=").ws()
.append("clsProto.$meta.binaryName").ws().append("!==").ws().append("undefined").ws()
.append("?").ws()
.append("$rt_str(clsProto.$meta.binaryName)").ws().append(":").ws().append("null;").softNewLine();
}
if (classSource.get(classClass).getField("primitive") != null) { if (classSource.get(classClass).getField("primitive") != null) {
writer.append("cls.").appendField(new FieldReference(classClass, "primitive")) writer.append("cls.").appendField(new FieldReference(classClass, "primitive"))
.append(" = clsProto.$meta.primitive ? 1 : 0;").newLine(); .append(" = clsProto.$meta.primitive ? 1 : 0;").newLine();

View File

@ -60,7 +60,7 @@ class InterferenceGraphBuilder {
} }
for (TryCatchBlock tryCatch : block.getTryCatchBlocks()) { for (TryCatchBlock tryCatch : block.getTryCatchBlocks()) {
if (tryCatch.getExceptionVariable() != null) { if (tryCatch.getExceptionVariable() != null) {
live.remove(tryCatch.getExceptionVariable()); live.remove(nodes.get(tryCatch.getExceptionVariable().getIndex()));
} }
} }
for (int j = block.getInstructions().size() - 1; j >= 0; --j) { for (int j = block.getInstructions().size() - 1; j >= 0; --j) {

View File

@ -128,7 +128,9 @@ function $rt_arraycls(cls) {
str += "]"; str += "]";
return str; return str;
} }
arraycls.$meta = { item : cls, supertypes : [$rt_objcls()], primitive : false, superclass : $rt_objcls() }; var name = "[" + cls.$meta.binaryName;
arraycls.$meta = { item : cls, supertypes : [$rt_objcls()], primitive : false, superclass : $rt_objcls(),
name : name, binaryName : name };
cls.$array = arraycls; cls.$array = arraycls;
} }
return cls.$array; return cls.$array;
@ -140,84 +142,73 @@ function $rt_createcls() {
} }
}; };
} }
function $rt_createPrimitiveCls(name, binaryName) {
var cls = $rt_createcls();
cls.$meta.primitive = true;
cls.$meta.name = name;
cls.$meta.binaryName = binaryName;
return cls;
}
var $rt_booleanclsCache = null; var $rt_booleanclsCache = null;
function $rt_booleancls() { function $rt_booleancls() {
if ($rt_booleanclsCache === null) { if ($rt_booleanclsCache === null) {
$rt_booleanclsCache = $rt_createcls(); $rt_booleanclsCache = $rt_createPrimitiveCls("boolean", "Z");
$rt_booleanclsCache.primitive = true;
$rt_booleanclsCache.name = "boolean";
} }
return $rt_booleanclsCache; return $rt_booleanclsCache;
} }
var $rt_charclsCache = null; var $rt_charclsCache = null;
function $rt_charcls() { function $rt_charcls() {
if ($rt_charclsCache === null) { if ($rt_charclsCache === null) {
$rt_charclsCache = $rt_createcls(); $rt_charclsCache = $rt_createPrimitiveCls("char", "C");
$rt_charclsCache.primitive = true;
$rt_charclsCache.name = "char";
} }
return $rt_charclsCache; return $rt_charclsCache;
} }
var $rt_byteclsCache = null; var $rt_byteclsCache = null;
function $rt_bytecls() { function $rt_bytecls() {
if ($rt_byteclsCache === null) { if ($rt_byteclsCache === null) {
$rt_byteclsCache = $rt_createcls(); $rt_byteclsCache = $rt_createPrimitiveCls("byte", "B");
$rt_byteclsCache.primitive = true;
$rt_byteclsCache.name = "byte";
} }
return $rt_byteclsCache; return $rt_byteclsCache;
} }
var $rt_shortclsCache = null; var $rt_shortclsCache = null;
function $rt_shortcls() { function $rt_shortcls() {
if ($rt_shortclsCache === null) { if ($rt_shortclsCache === null) {
$rt_shortclsCache = $rt_createcls(); $rt_shortclsCache = $rt_createPrimitiveCls("short", "S");
$rt_shortclsCache.primitive = true;
$rt_shortclsCache.name = "short";
} }
return $rt_shortclsCache; return $rt_shortclsCache;
} }
var $rt_intclsCache = null; var $rt_intclsCache = null;
function $rt_intcls() { function $rt_intcls() {
if ($rt_intclsCache === null) { if ($rt_intclsCache === null) {
$rt_intclsCache = $rt_createcls(); $rt_intclsCache = $rt_createPrimitiveCls("int", "I");
$rt_intclsCache.primitive = true;
$rt_intclsCache.name = "int";
} }
return $rt_intclsCache; return $rt_intclsCache;
} }
var $rt_longclsCache = null; var $rt_longclsCache = null;
function $rt_longcls() { function $rt_longcls() {
if ($rt_longclsCache === null) { if ($rt_longclsCache === null) {
$rt_longclsCache = $rt_createcls(); $rt_longclsCache = $rt_createPrimitiveCls("long", "J");
$rt_longclsCache.primitive = true;
$rt_longclsCache.name = "long";
} }
return $rt_longclsCache; return $rt_longclsCache;
} }
var $rt_floatclsCache = null; var $rt_floatclsCache = null;
function $rt_floatcls() { function $rt_floatcls() {
if ($rt_floatclsCache === null) { if ($rt_floatclsCache === null) {
$rt_floatclsCache = $rt_createcls(); $rt_floatclsCache = $rt_createPrimitiveCls("float", "F");
$rt_floatclsCache.primitive = true;
$rt_floatclsCache.name = "float";
} }
return $rt_floatclsCache; return $rt_floatclsCache;
} }
var $rt_doubleclsCache = null; var $rt_doubleclsCache = null;
function $rt_doublecls() { function $rt_doublecls() {
if ($rt_doubleclsCache === null) { if ($rt_doubleclsCache === null) {
$rt_doubleclsCache = $rt_createcls(); $rt_doubleclsCache = $rt_createPrimitiveCls("double", "D");
$rt_doubleclsCache.primitive = true;
$rt_doubleclsCache.name = "double";
} }
return $rt_doubleclsCache; return $rt_doubleclsCache;
} }
var $rt_voidclsCache = null; var $rt_voidclsCache = null;
function $rt_voidcls() { function $rt_voidcls() {
if ($rt_voidclsCache === null) { if ($rt_voidclsCache === null) {
$rt_voidclsCache = $rt_createcls(); $rt_voidclsCache = $rt_createPrimitiveCls("void", "V");
$rt_voidclsCache.primitive = true;
$rt_voidclsCache.name = "void";
} }
return $rt_voidclsCache; return $rt_voidclsCache;
} }
@ -383,6 +374,7 @@ function $rt_declClass(cls, data) {
cls.prototype = new Object(); cls.prototype = new Object();
} }
cls.$meta.name = data.name; cls.$meta.name = data.name;
cls.$meta.binaryName = "L" + data.name + ";";
cls.$meta.enum = data.enum; cls.$meta.enum = data.enum;
cls.prototype.constructor = cls; cls.prototype.constructor = cls;
cls.$clinit = data.clinit; cls.$clinit = data.clinit;

View File

@ -63,7 +63,7 @@ public interface XMLHttpRequest extends JSObject {
Document getResponseXML(); Document getResponseXML();
@JSProperty @JSProperty
Integer getStatus(); int getStatus();
@JSProperty @JSProperty
String getStatusText(); String getStatusText();

View File

@ -6,7 +6,7 @@ Bundle-Version: 0.3.0.qualifer
Bundle-Vendor: Alexey Andreev <konsoletyper@gmail.com> Bundle-Vendor: Alexey Andreev <konsoletyper@gmail.com>
Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ClassPath: ., Bundle-ClassPath: .,
lib/asm-debug-all-4.0.3.jar, lib/asm-debug-all-5.0.3.jar,
lib/cdi-api-1.2.jar, lib/cdi-api-1.2.jar,
lib/commons-io-2.4.jar, lib/commons-io-2.4.jar,
lib/jackson-core-asl-1.9.13.jar, lib/jackson-core-asl-1.9.13.jar,