Skip to content

Commit 382448e

Browse files
committed
getPropNames passing
1 parent 0cd9531 commit 382448e

File tree

89 files changed

+1370
-1243
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+1370
-1243
lines changed

c/interface.c

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -591,19 +591,73 @@ void QTS_DefineProp(JSContext *ctx, JSValueConst *this_val, JSValueConst *prop_n
591591
JS_FreeAtom(ctx, prop_atom);
592592
}
593593

594-
MaybeAsync(JSValue *) QTS_GetOwnPropertyNames(JSContext *ctx, JSValue **out_ptrs, uint32_t *out_len, JSValueConst *obj, int flags) {
594+
#define JS_ATOM_TAG_INT (1U << 31)
595+
static inline BOOL __JS_AtomIsTaggedInt(JSAtom v) {
596+
return (v & JS_ATOM_TAG_INT) != 0;
597+
}
598+
599+
static inline uint32_t __JS_AtomToUInt32(JSAtom atom) {
600+
return atom & ~JS_ATOM_TAG_INT;
601+
}
602+
603+
/* include numbers. when only this is set, we filter out strings */
604+
#define QTS_GPN_NUMBER_MASK (1 << 6)
605+
/* Treat numbers as strings */
606+
#define QTS_STANDARD_COMPLIANT_NUMBER (1 << 7)
607+
608+
MaybeAsync(JSValue *) QTS_GetOwnPropertyNames(JSContext *ctx, JSValue ***out_ptrs, uint32_t *out_len, JSValueConst *obj, int flags) {
595609
JSPropertyEnum *tab = NULL;
610+
uint32_t total_props = 0;
611+
uint32_t out_props = 0;
612+
613+
BOOL qts_standard_compliant_number = (flags & QTS_STANDARD_COMPLIANT_NUMBER) != 0;
614+
BOOL qts_include_string = (flags & JS_GPN_STRING_MASK) != 0;
615+
BOOL qts_include_number = qts_standard_compliant_number ? 0 : (flags & QTS_GPN_NUMBER_MASK) != 0;
616+
if (qts_include_number) {
617+
// if we want numbers, we must include strings in call down
618+
flags = flags | JS_GPN_STRING_MASK;
619+
}
620+
596621
int status = 0;
597-
status = JS_GetOwnPropertyNames(ctx, &tab, out_len, *obj, flags);
622+
status = JS_GetOwnPropertyNames(ctx, &tab, &total_props, *obj, flags);
598623
if (status < 0) {
624+
if (tab != NULL) {
625+
js_free(ctx, tab);
626+
}
599627
return jsvalue_to_heap(JS_GetException(ctx));
600628
}
601629
*out_ptrs = malloc(sizeof(JSValue) * *out_len);
602-
for (int i = 0; i < *out_len; i++) {
603-
out_ptrs[i] = jsvalue_to_heap(JS_AtomToValue(ctx, tab[i].atom));
604-
JS_FreeAtom(ctx, tab[i].atom);
630+
for (int i = 0; i < total_props; i++) {
631+
JSAtom atom = tab[i].atom;
632+
633+
if (__JS_AtomIsTaggedInt(atom)) {
634+
if (qts_include_number) {
635+
uint32_t v = __JS_AtomToUInt32(atom);
636+
(*out_ptrs)[out_props++] = jsvalue_to_heap(JS_NewUint32(ctx, v));
637+
} else if (qts_include_string && qts_standard_compliant_number) {
638+
(*out_ptrs)[out_props++] = jsvalue_to_heap(JS_AtomToValue(ctx, tab[i].atom));
639+
}
640+
JS_FreeAtom(ctx, atom);
641+
continue;
642+
}
643+
644+
JSValue atom_value = JS_AtomToValue(ctx, atom);
645+
JS_FreeAtom(ctx, atom);
646+
647+
if (JS_IsString(atom_value)) {
648+
if (qts_include_string) {
649+
(*out_ptrs)[out_props++] = jsvalue_to_heap(atom_value);
650+
} else {
651+
JS_FreeValue(ctx, atom_value);
652+
}
653+
} else { // Symbol
654+
// We must have set the includeSymbol or includePrivate flags
655+
// if it's present
656+
(*out_ptrs)[out_props++] = jsvalue_to_heap(atom_value);
657+
}
605658
}
606659
js_free(ctx, tab);
660+
*out_len = out_props;
607661
return NULL;
608662
}
609663

@@ -1152,4 +1206,4 @@ JSValue *QTS_bjson_decode(JSContext *ctx, JSValueConst *data) {
11521206

11531207
JSValue value = JS_ReadObject(ctx, buffer, length, 0);
11541208
return jsvalue_to_heap(value);
1155-
}
1209+
}

doc/@jitl/quickjs-ffi-types/exports.md

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
- [JSValueConstPointerPointer](exports.md#jsvalueconstpointerpointer)
2424
- [JSValuePointer](exports.md#jsvaluepointer)
2525
- [JSValuePointerPointer](exports.md#jsvaluepointerpointer)
26+
- [JSValuePointerPointerPointer](exports.md#jsvaluepointerpointerpointer)
2627
- [JSVoidPointer](exports.md#jsvoidpointer)
2728
- [OwnedHeapCharPointer](exports.md#ownedheapcharpointer)
2829
- [QTS\_C\_To\_HostCallbackFuncPointer](exports.md#qts-c-to-hostcallbackfuncpointer)
@@ -63,7 +64,7 @@ for the Emscripten stack.
6364

6465
#### Source
6566

66-
[packages/quickjs-ffi-types/src/ffi-types.ts:77](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L77)
67+
[packages/quickjs-ffi-types/src/ffi-types.ts:82](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L82)
6768

6869
***
6970

@@ -96,7 +97,7 @@ for the Emscripten stack.
9697

9798
#### Source
9899

99-
[packages/quickjs-ffi-types/src/ffi-types.ts:89](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L89)
100+
[packages/quickjs-ffi-types/src/ffi-types.ts:94](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L94)
100101

101102
***
102103

@@ -144,7 +145,7 @@ State of a promise.
144145

145146
#### Source
146147

147-
[packages/quickjs-ffi-types/src/ffi-types.ts:126](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L126)
148+
[packages/quickjs-ffi-types/src/ffi-types.ts:131](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L131)
148149

149150
***
150151

@@ -181,7 +182,7 @@ Used internally for Javascript-to-C function calls.
181182

182183
#### Source
183184

184-
[packages/quickjs-ffi-types/src/ffi-types.ts:51](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L51)
185+
[packages/quickjs-ffi-types/src/ffi-types.ts:56](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L56)
185186

186187
***
187188

@@ -210,6 +211,18 @@ Used internally for Javascript-to-C function calls.
210211

211212
***
212213

214+
### JSValuePointerPointerPointer
215+
216+
> **JSValuePointerPointerPointer**: `Pointer`\<`"*JSValue[]"`\>
217+
218+
Used internally for Javascript-to-C function calls.
219+
220+
#### Source
221+
222+
[packages/quickjs-ffi-types/src/ffi-types.ts:51](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L51)
223+
224+
***
225+
213226
### JSVoidPointer
214227

215228
> **JSVoidPointer**: `Pointer`\<`any`\>
@@ -218,7 +231,7 @@ Opaque pointer that was allocated by js_malloc.
218231

219232
#### Source
220233

221-
[packages/quickjs-ffi-types/src/ffi-types.ts:94](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L94)
234+
[packages/quickjs-ffi-types/src/ffi-types.ts:99](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L99)
222235

223236
***
224237

@@ -231,7 +244,7 @@ for the Emscripten stack.
231244

232245
#### Source
233246

234-
[packages/quickjs-ffi-types/src/ffi-types.ts:83](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L83)
247+
[packages/quickjs-ffi-types/src/ffi-types.ts:88](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L88)
235248

236249
***
237250

@@ -243,7 +256,7 @@ Used internally for C-to-Javascript function calls.
243256

244257
#### Source
245258

246-
[packages/quickjs-ffi-types/src/ffi-types.ts:61](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L61)
259+
[packages/quickjs-ffi-types/src/ffi-types.ts:66](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L66)
247260

248261
***
249262

@@ -255,7 +268,7 @@ Used internally for C-to-Javascript interrupt handlers.
255268

256269
#### Source
257270

258-
[packages/quickjs-ffi-types/src/ffi-types.ts:66](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L66)
271+
[packages/quickjs-ffi-types/src/ffi-types.ts:71](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L71)
259272

260273
***
261274

@@ -267,7 +280,7 @@ Used internally for C-to-Javascript module loading.
267280

268281
#### Source
269282

270-
[packages/quickjs-ffi-types/src/ffi-types.ts:71](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L71)
283+
[packages/quickjs-ffi-types/src/ffi-types.ts:76](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L76)
271284

272285
***
273286

@@ -287,7 +300,7 @@ Used internally for C-to-Javascript module loading.
287300
288301
#### Source
289302

290-
[packages/quickjs-ffi-types/src/ffi-types.ts:96](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L96)
303+
[packages/quickjs-ffi-types/src/ffi-types.ts:101](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L101)
291304

292305
## Variables
293306

@@ -355,7 +368,7 @@ module code
355368

356369
#### Source
357370

358-
[packages/quickjs-ffi-types/src/ffi-types.ts:101](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L101)
371+
[packages/quickjs-ffi-types/src/ffi-types.ts:106](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L106)
359372

360373
***
361374

@@ -387,9 +400,17 @@ Bitfield options for QTS_GetOwnPropertyNames
387400

388401
> **JS\_GPN\_SYMBOL\_MASK**: `number`
389402
403+
##### QTS\_GPN\_NUMBER\_MASK
404+
405+
> **QTS\_GPN\_NUMBER\_MASK**: `number`
406+
407+
##### QTS\_STANDARD\_COMPLIANT\_NUMBER
408+
409+
> **QTS\_STANDARD\_COMPLIANT\_NUMBER**: `number`
410+
390411
#### Source
391412

392-
[packages/quickjs-ffi-types/src/ffi-types.ts:116](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L116)
413+
[packages/quickjs-ffi-types/src/ffi-types.ts:121](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L121)
393414

394415
***
395416

@@ -467,7 +488,7 @@ Bitfield options for QTS_NewContext intrinsics
467488
468489
#### Source
469490

470-
[packages/quickjs-ffi-types/src/ffi-types.ts:106](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L106)
491+
[packages/quickjs-ffi-types/src/ffi-types.ts:111](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L111)
471492

472493
***
473494

@@ -491,7 +512,7 @@ Bitfield options for QTS_NewContext intrinsics
491512
492513
#### Source
493514

494-
[packages/quickjs-ffi-types/src/ffi-types.ts:121](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L121)
515+
[packages/quickjs-ffi-types/src/ffi-types.ts:126](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L126)
495516

496517
***
497518

@@ -515,7 +536,7 @@ Bitfield options for QTS_NewContext intrinsics
515536
516537
#### Source
517538

518-
[packages/quickjs-ffi-types/src/ffi-types.ts:126](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L126)
539+
[packages/quickjs-ffi-types/src/ffi-types.ts:131](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L131)
519540

520541
## Functions
521542

@@ -548,7 +569,7 @@ Bitfield options for QTS_NewContext intrinsics
548569
549570
#### Source
550571

551-
[packages/quickjs-ffi-types/src/ffi-types.ts:131](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L131)
572+
[packages/quickjs-ffi-types/src/ffi-types.ts:136](https://github.com/justjake/quickjs-emscripten/blob/main/packages/quickjs-ffi-types/src/ffi-types.ts#L136)
552573

553574
***
554575

0 commit comments

Comments
 (0)