Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
.PHONY: build build-debug clean

CMAKE ?= cmake
WASI_SDK_DIR ?= /opt/wasi-sdk
WASI_TOOLCHAIN_FILE ?= $(WASI_SDK_DIR)/share/cmake/wasi-sdk.cmake

build:
@echo "Configuring and building qjs..."
cd qjswasm/quickjs && \
rm -rf build && \
cmake -B build \
$(CMAKE) -B build \
-DQJS_BUILD_LIBC=ON \
-DQJS_BUILD_CLI_WITH_MIMALLOC=OFF \
-DCMAKE_TOOLCHAIN_FILE=/opt/wasi-sdk/share/cmake/wasi-sdk.cmake \
-DCMAKE_TOOLCHAIN_FILE=$(WASI_TOOLCHAIN_FILE) \
-DCMAKE_PROJECT_INCLUDE=../qjswasm.cmake
@echo "Building qjs target..."
make -C qjswasm/quickjs/build qjswasm -j$(nproc)
Expand All @@ -20,11 +24,11 @@ build-debug:
@echo "Configuring and building qjs with runtime address debug..."
cd qjswasm/quickjs && \
rm -rf build && \
cmake -B build \
$(CMAKE) -B build \
-DQJS_BUILD_LIBC=ON \
-DQJS_BUILD_CLI_WITH_MIMALLOC=OFF \
-DQJS_DEBUG_RUNTIME_ADDRESS=ON \
-DCMAKE_TOOLCHAIN_FILE=/opt/wasi-sdk/share/cmake/wasi-sdk.cmake \
-DCMAKE_TOOLCHAIN_FILE=$(WASI_TOOLCHAIN_FILE) \
-DCMAKE_PROJECT_INCLUDE=../qjswasm.cmake
@echo "Building qjs target..."
make -C qjswasm/quickjs/build qjswasm -j$(nproc)
Expand Down
23 changes: 1 addition & 22 deletions common.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,21 +59,6 @@ var (
reflect.Float32: {-math.MaxFloat32, math.MaxFloat32},
reflect.Float64: {-math.MaxFloat64, math.MaxFloat64},
}

// TypedArray types for validation.
typedArrayTypes = []string{
"Uint8Array",
"Int8Array",
"Uint16Array",
"Int16Array",
"Uint32Array",
"Int32Array",
"Float32Array",
"Float64Array",
"BigInt64Array",
"BigUint64Array",
"DataView",
}
)

// ObjectOrMap interface for unified object/map handling.
Expand Down Expand Up @@ -554,13 +539,7 @@ func NumericBoundsCheck(floatVal float64, targetKind reflect.Kind) error {

// IsTypedArray returns true if the input is TypedArray or DataView.
func IsTypedArray(input *Value) bool {
for _, typeName := range typedArrayTypes {
if input.IsGlobalInstanceOf(typeName) {
return true
}
}

return false
return input != nil && input.IntrinsicKind().IsTypedArray()
}

// processTempValue validates if temp is a valid result for the given T type.
Expand Down
4 changes: 2 additions & 2 deletions jstogo.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,13 @@ func toGoValue[T any](
return v, err
}

if input.IsGlobalInstanceOf("Date") {
if input.IsDate() {
temp, err = JsTimeToGo(input)

return v, err
}

if input.IsGlobalInstanceOf("RegExp") {
if input.IsRegExp() {
temp = input.String()

return v, err
Expand Down
Binary file modified qjs.wasm
Binary file not shown.
125 changes: 123 additions & 2 deletions qjswasm/helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,7 @@ uint64_t *QJS_AtomToCString(JSContext *ctx, JSAtom atom)
}

// returns a packed uint64_t value containing both the string's memory address (high 32 bits) and length (low 32 bits).
uint64_t *QJS_GetOwnPropertyNames(JSContext *ctx, JSValue v)
uint64_t *QJS_GetOwnPropertyNames(JSContext *ctx, JSValue v, uint32_t flags)
{
JSPropertyEnum *ptr;
uint32_t size;
Expand All @@ -527,7 +527,7 @@ uint64_t *QJS_GetOwnPropertyNames(JSContext *ctx, JSValue v)
&ptr,
&size,
v,
JS_GPN_STRING_MASK | JS_GPN_SYMBOL_MASK | JS_GPN_PRIVATE_MASK);
flags);

if (result < 0)
{
Expand All @@ -547,6 +547,127 @@ uint64_t *QJS_GetOwnPropertyNames(JSContext *ctx, JSValue v)
return packed_result;
}

uint64_t QJS_GetOwnPropertyFlags(JSContext *ctx, JSValue obj, JSAtom prop)
{
JSPropertyDescriptor desc = {
.flags = 0,
.value = JS_UNDEFINED,
.getter = JS_UNDEFINED,
.setter = JS_UNDEFINED,
};
int result = JS_GetOwnProperty(ctx, &desc, obj, prop);
uint32_t status;
uint32_t flags = 0;

if (result < 0)
{
status = UINT32_MAX;
}
else if (result == 0)
{
status = 0;
}
else
{
status = 1;
flags = (uint32_t)(desc.flags & (JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE | JS_PROP_ENUMERABLE | JS_PROP_TMASK));
flags |= JS_PROP_HAS_CONFIGURABLE | JS_PROP_HAS_ENUMERABLE;

if ((desc.flags & JS_PROP_TMASK) == JS_PROP_GETSET)
{
if (!JS_IsUndefined(desc.getter))
{
flags |= JS_PROP_HAS_GET;
}
if (!JS_IsUndefined(desc.setter))
{
flags |= JS_PROP_HAS_SET;
}
}
else
{
flags |= JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE;
}

JS_FreeValue(ctx, desc.value);
JS_FreeValue(ctx, desc.getter);
JS_FreeValue(ctx, desc.setter);
}

return ((uint64_t)status << 32) | flags;
}

uint32_t QJS_GetIntrinsicKind(JSContext *ctx, JSValue obj)
{
if (!JS_IsObject(obj))
{
return 0;
}

if (JS_IsArray(obj))
{
return 2;
}
if (JS_IsDate(obj))
{
return 3;
}
if (JS_IsRegExp(obj))
{
return 4;
}
if (JS_IsMap(obj))
{
return 5;
}
if (JS_IsSet(obj))
{
return 6;
}
if (JS_IsArrayBuffer(obj))
{
return 7;
}
if (JS_IsDataView(obj))
{
return 8;
}
if (QJS_IsError(ctx, obj))
{
return 21;
}

switch (JS_GetTypedArrayType(obj))
{
case JS_TYPED_ARRAY_UINT8:
return 9;
case JS_TYPED_ARRAY_UINT8C:
return 10;
case JS_TYPED_ARRAY_INT8:
return 11;
case JS_TYPED_ARRAY_UINT16:
return 12;
case JS_TYPED_ARRAY_INT16:
return 13;
case JS_TYPED_ARRAY_UINT32:
return 14;
case JS_TYPED_ARRAY_INT32:
return 15;
case JS_TYPED_ARRAY_BIG_INT64:
return 16;
case JS_TYPED_ARRAY_BIG_UINT64:
return 17;
case JS_TYPED_ARRAY_FLOAT32:
return 18;
case JS_TYPED_ARRAY_FLOAT64:
return 19;
case JS_TYPED_ARRAY_FLOAT16:
return 20;
default:
return 1;
}
}

JSValue QJS_ParseJSON(JSContext *ctx, const char *buf)
{
size_t len = strlen(buf);
Expand Down
4 changes: 3 additions & 1 deletion qjswasm/qjs.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,9 @@ JSValue QJS_NewBigUint64(JSContext *ctx, uint64_t val);
JSValue QJS_NewFloat64(JSContext *ctx, uint64_t bits);
uint64_t *QJS_AtomToCString(JSContext *ctx, JSAtom atom);

uint64_t *QJS_GetOwnPropertyNames(JSContext *ctx, JSValue v);
uint64_t *QJS_GetOwnPropertyNames(JSContext *ctx, JSValue v, uint32_t flags);
uint64_t QJS_GetOwnPropertyFlags(JSContext *ctx, JSValue obj, JSAtom prop);
uint32_t QJS_GetIntrinsicKind(JSContext *ctx, JSValue obj);
JSValue QJS_ParseJSON(JSContext *ctx, const char *buf);
JSValue QJS_NewBool(JSContext *ctx, int val);
uint64_t *QJS_GetArrayBuffer(JSContext *ctx, JSValue obj);
Expand Down
2 changes: 2 additions & 0 deletions qjswasm/qjswasm.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ target_link_options(qjswasm PRIVATE
"LINKER:--export=QJS_IsConstructor"
"LINKER:--export=QJS_IsInstanceOf"
"LINKER:--export=QJS_GetOwnPropertyNames"
"LINKER:--export=QJS_GetOwnPropertyFlags"
"LINKER:--export=QJS_GetIntrinsicKind"
"LINKER:--export=QJS_ParseJSON"
"LINKER:--export=QJS_NewBool"
"LINKER:--export=QJS_NewBigInt64"
Expand Down
Loading