mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
JSO: fix wrapping undefined value
This commit is contained in:
parent
9093ad2f8a
commit
a9af6e4f33
|
@ -35,6 +35,7 @@ public final class JSWrapper {
|
||||||
? JSMap.create() : null;
|
? JSMap.create() : null;
|
||||||
private static final JSMap<JSNumber, JSWeakRef<JSObject>> numberWrappers = JSWeakRef.isSupported()
|
private static final JSMap<JSNumber, JSWeakRef<JSObject>> numberWrappers = JSWeakRef.isSupported()
|
||||||
? JSMap.create() : null;
|
? JSMap.create() : null;
|
||||||
|
private static JSWeakRef<JSObject> undefinedWrapper;
|
||||||
private static final JSFinalizationRegistry stringFinalizationRegistry;
|
private static final JSFinalizationRegistry stringFinalizationRegistry;
|
||||||
private static final JSFinalizationRegistry numberFinalizationRegistry;
|
private static final JSFinalizationRegistry numberFinalizationRegistry;
|
||||||
private static int hashCodeGen;
|
private static int hashCodeGen;
|
||||||
|
@ -59,12 +60,13 @@ public final class JSWrapper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var js = directJavaToJs(o);
|
var js = directJavaToJs(o);
|
||||||
if (isJSImplementation(o)) {
|
var type = JSObjects.typeOf(js);
|
||||||
|
var isObject = type.equals("object") || type.equals("function");
|
||||||
|
if (isObject && isJSImplementation(o)) {
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
if (wrappers != null) {
|
if (wrappers != null) {
|
||||||
var type = JSObjects.typeOf(js);
|
if (isObject) {
|
||||||
if (type.equals("object") || type.equals("function")) {
|
|
||||||
var existingRef = get(wrappers, js);
|
var existingRef = get(wrappers, js);
|
||||||
var existing = !JSObjects.isUndefined(existingRef) ? deref(existingRef) : JSObjects.undefined();
|
var existing = !JSObjects.isUndefined(existingRef) ? deref(existingRef) : JSObjects.undefined();
|
||||||
if (JSObjects.isUndefined(existing)) {
|
if (JSObjects.isUndefined(existing)) {
|
||||||
|
@ -100,6 +102,17 @@ public final class JSWrapper {
|
||||||
} else {
|
} else {
|
||||||
return jsToWrapper(existing);
|
return jsToWrapper(existing);
|
||||||
}
|
}
|
||||||
|
} else if (type.equals("undefined")) {
|
||||||
|
var existingRef = undefinedWrapper;
|
||||||
|
var existing = existingRef != null ? deref(existingRef) : JSObjects.undefined();
|
||||||
|
if (JSObjects.isUndefined(existing)) {
|
||||||
|
var wrapper = new JSWrapper(js);
|
||||||
|
var wrapperAsJs = wrapperToJs(wrapper);
|
||||||
|
undefinedWrapper = createWeakRef(wrapperAsJs);
|
||||||
|
return wrapper;
|
||||||
|
} else {
|
||||||
|
return jsToWrapper(existing);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new JSWrapper(js);
|
return new JSWrapper(js);
|
||||||
|
|
|
@ -311,6 +311,16 @@ public class JSWrapperTest {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void wrapUndefined() {
|
||||||
|
field1 = JSObjects.undefined();
|
||||||
|
assertEquals("undefined", field1.toString());
|
||||||
|
assertEquals(JSObjects.undefined(), field1);
|
||||||
|
assertSame(JSObjects.undefined(), field1);
|
||||||
|
assertTrue(field1 instanceof JSObject);
|
||||||
|
assertTrue(JSObjects.isUndefined(field1));
|
||||||
|
}
|
||||||
|
|
||||||
private void callSetProperty(Object instance, Object o) {
|
private void callSetProperty(Object instance, Object o) {
|
||||||
setProperty(instance, "foo", o);
|
setProperty(instance, "foo", o);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user