wasm gc: fix support of cast/instanceof for JS types; fix accessing top-level declarations

This commit is contained in:
Alexey Andreev 2024-10-02 14:54:40 +02:00
parent a291eb3026
commit 551f0505c7
2 changed files with 8 additions and 3 deletions

View File

@ -156,8 +156,8 @@ TeaVM.wasm = function() {
appendToArray: (array, e) => array.push(e), appendToArray: (array, e) => array.push(e),
unwrapBoolean: value => value ? 1 : 0, unwrapBoolean: value => value ? 1 : 0,
wrapBoolean: value => !!value, wrapBoolean: value => !!value,
getProperty: (obj, prop) => obj[prop], getProperty: (obj, prop) => obj !== null ? obj[prop] : getGlobalName(prop),
getPropertyPure: (obj, prop) => obj[prop], getPropertyPure: (obj, prop) => obj !== null ? obj[prop] : getGlobalName(prop),
setProperty: (obj, prop, value) => obj[prop] = value, setProperty: (obj, prop, value) => obj[prop] = value,
setPropertyPure: (obj, prop) => obj[prop] = value, setPropertyPure: (obj, prop) => obj[prop] = value,
global: getGlobalName, global: getGlobalName,
@ -265,6 +265,8 @@ TeaVM.wasm = function() {
} }
}, },
isPrimitive: (value, type) => typeof value === type, isPrimitive: (value, type) => typeof value === type,
instanceOf: (value, type) => value instanceof type,
instanceOfOrNull: (value, type) => value === null || value instanceof type,
sameRef: (a, b) => a === b, sameRef: (a, b) => a === b,
hashCode: (obj) => { hashCode: (obj) => {
if (typeof obj === "object" || typeof obj === "function" || typeof obj === "symbol") { if (typeof obj === "object" || typeof obj === "function" || typeof obj === "symbol") {
@ -293,7 +295,8 @@ TeaVM.wasm = function() {
for (let i = 0; i < 32; ++i) { for (let i = 0; i < 32; ++i) {
imports.teavmJso["createFunction" + i] = (...args) => new Function(...args); imports.teavmJso["createFunction" + i] = (...args) => new Function(...args);
imports.teavmJso["callFunction" + i] = (fn, ...args) => fn(...args); imports.teavmJso["callFunction" + i] = (fn, ...args) => fn(...args);
imports.teavmJso["callMethod" + i] = (instance, method, ...args) => instance[method](...args); imports.teavmJso["callMethod" + i] = (instance, method, ...args) =>
instance !== null ? instance[method](...args) : getGlobalName(method)(...args);
imports.teavmJso["construct" + i] = (constructor, ...args) => new constructor(...args); imports.teavmJso["construct" + i] = (constructor, ...args) => new constructor(...args);
} }
} }

View File

@ -756,10 +756,12 @@ public final class JS {
@InjectedBy(JSNativeInjector.class) @InjectedBy(JSNativeInjector.class)
@NoSideEffects @NoSideEffects
@Import(name = "instanceOf", module = "teavmJso")
public static native boolean instanceOf(JSObject obj, JSObject cls); public static native boolean instanceOf(JSObject obj, JSObject cls);
@InjectedBy(JSNativeInjector.class) @InjectedBy(JSNativeInjector.class)
@NoSideEffects @NoSideEffects
@Import(name = "instanceOfOrNull", module = "teavmJso")
public static native boolean instanceOfOrNull(JSObject obj, JSObject cls); public static native boolean instanceOfOrNull(JSObject obj, JSObject cls);
@InjectedBy(JSNativeInjector.class) @InjectedBy(JSNativeInjector.class)