Skip to content

Commit 6ddc3d3

Browse files
committed
Add Set.prototype.isSubsetOf
1 parent 12940d7 commit 6ddc3d3

File tree

2 files changed

+55
-42
lines changed

2 files changed

+55
-42
lines changed

quickjs.c

+55
Original file line numberDiff line numberDiff line change
@@ -46362,6 +46362,60 @@ static JSValue js_set_isDisjointFrom(JSContext *ctx, JSValue this_val,
4636246362
return rval;
4636346363
}
4636446364

46365+
static JSValue js_set_isSubsetOf(JSContext *ctx, JSValue this_val,
46366+
int argc, JSValue *argv)
46367+
{
46368+
JSValue item, iter, keys, has, next, rv, rval;
46369+
BOOL done, found;
46370+
JSMapState *s;
46371+
int64_t size;
46372+
int ok;
46373+
46374+
has = JS_UNDEFINED;
46375+
iter = JS_UNDEFINED;
46376+
keys = JS_UNDEFINED;
46377+
next = JS_UNDEFINED;
46378+
rval = JS_EXCEPTION;
46379+
s = JS_GetOpaque2(ctx, this_val, JS_CLASS_SET);
46380+
if (!s)
46381+
goto exception;
46382+
// order matters!
46383+
if (js_setlike_get_size(ctx, argv[0], &size) < 0)
46384+
goto exception;
46385+
if (js_setlike_get_has(ctx, argv[0], &has) < 0)
46386+
goto exception;
46387+
if (js_setlike_get_keys(ctx, argv[0], &keys) < 0)
46388+
goto exception;
46389+
found = FALSE;
46390+
if (s->record_count > size)
46391+
goto fini;
46392+
iter = js_create_map_iterator(ctx, this_val, 0, NULL, MAGIC_SET);
46393+
if (JS_IsException(iter))
46394+
goto exception;
46395+
found = TRUE;
46396+
do {
46397+
item = js_map_iterator_next(ctx, iter, 0, NULL, &done, MAGIC_SET);
46398+
if (JS_IsException(item))
46399+
goto exception;
46400+
if (done) // item is JS_UNDEFINED
46401+
break;
46402+
rv = JS_Call(ctx, has, argv[0], 1, &item);
46403+
JS_FreeValue(ctx, item);
46404+
ok = JS_ToBoolFree(ctx, rv); // returns -1 if rv is JS_EXCEPTION
46405+
if (ok < 0)
46406+
goto exception;
46407+
found = (ok > 0);
46408+
} while (found);
46409+
fini:
46410+
rval = found ? JS_TRUE : JS_FALSE;
46411+
exception:
46412+
JS_FreeValue(ctx, has);
46413+
JS_FreeValue(ctx, keys);
46414+
JS_FreeValue(ctx, iter);
46415+
JS_FreeValue(ctx, next);
46416+
return rval;
46417+
}
46418+
4636546419
static JSValue js_set_intersection(JSContext *ctx, JSValue this_val,
4636646420
int argc, JSValue *argv)
4636746421
{
@@ -46739,6 +46793,7 @@ static const JSCFunctionListEntry js_set_proto_funcs[] = {
4673946793
JS_CGETSET_MAGIC_DEF("size", js_map_get_size, NULL, MAGIC_SET ),
4674046794
JS_CFUNC_MAGIC_DEF("forEach", 1, js_map_forEach, MAGIC_SET ),
4674146795
JS_CFUNC_DEF("isDisjointFrom", 1, js_set_isDisjointFrom ),
46796+
JS_CFUNC_DEF("isSubsetOf", 1, js_set_isSubsetOf ),
4674246797
JS_CFUNC_DEF("intersection", 1, js_set_intersection ),
4674346798
JS_CFUNC_DEF("difference", 1, js_set_difference ),
4674446799
JS_CFUNC_DEF("symmetricDifference", 1, js_set_symmetricDifference ),

test262_errors.txt

-42
Original file line numberDiff line numberDiff line change
@@ -72,42 +72,6 @@ test262/test/built-ins/RegExp/property-escapes/generated/XID_Start.js:16: Test26
7272
test262/test/built-ins/RegExp/property-escapes/generated/XID_Start.js:16: strict mode: Test262Error: `\p{XID_Start}` should match U+02EBF0 (`𮯰`)
7373
test262/test/built-ins/RegExp/unicode_full_case_folding.js:20: Test262Error: \u0390 does not match \u1fd3
7474
test262/test/built-ins/RegExp/unicode_full_case_folding.js:20: strict mode: Test262Error: \u0390 does not match \u1fd3
75-
test262/test/built-ins/Set/prototype/isSubsetOf/allows-set-like-class.js:31: TypeError: not a function
76-
test262/test/built-ins/Set/prototype/isSubsetOf/allows-set-like-class.js:31: strict mode: TypeError: not a function
77-
test262/test/built-ins/Set/prototype/isSubsetOf/allows-set-like-object.js:29: TypeError: not a function
78-
test262/test/built-ins/Set/prototype/isSubsetOf/allows-set-like-object.js:29: strict mode: TypeError: not a function
79-
test262/test/built-ins/Set/prototype/isSubsetOf/builtins.js:9: Test262Error: Built-in objects must be extensible. Expected SameValue(«false», «true») to be true
80-
test262/test/built-ins/Set/prototype/isSubsetOf/builtins.js:9: strict mode: Test262Error: Built-in objects must be extensible. Expected SameValue(«false», «true») to be true
81-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-Map.js:15: TypeError: not a function
82-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-Map.js:15: strict mode: TypeError: not a function
83-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-empty-sets.js:12: TypeError: not a function
84-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-empty-sets.js:12: strict mode: TypeError: not a function
85-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-itself.js:11: TypeError: not a function
86-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-itself.js:11: strict mode: TypeError: not a function
87-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-same-sets.js:12: TypeError: not a function
88-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-same-sets.js:12: strict mode: TypeError: not a function
89-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-sets.js:12: TypeError: not a function
90-
test262/test/built-ins/Set/prototype/isSubsetOf/compares-sets.js:12: strict mode: TypeError: not a function
91-
test262/test/built-ins/Set/prototype/isSubsetOf/isSubsetOf.js:10: Test262Error: `typeof Set.prototype.isSubsetOf` is `'function'` Expected SameValue(«undefined», «function») to be true
92-
test262/test/built-ins/Set/prototype/isSubsetOf/isSubsetOf.js:10: strict mode: Test262Error: `typeof Set.prototype.isSubsetOf` is `'function'` Expected SameValue(«undefined», «function») to be true
93-
test262/test/built-ins/Set/prototype/isSubsetOf/length.js:11: Test262Error: Expected SameValue(«undefined», «function») to be true
94-
test262/test/built-ins/Set/prototype/isSubsetOf/length.js:11: strict mode: Test262Error: Expected SameValue(«undefined», «function») to be true
95-
test262/test/built-ins/Set/prototype/isSubsetOf/name.js:11: Test262Error: Expected SameValue(«undefined», «function») to be true
96-
test262/test/built-ins/Set/prototype/isSubsetOf/name.js:11: strict mode: Test262Error: Expected SameValue(«undefined», «function») to be true
97-
test262/test/built-ins/Set/prototype/isSubsetOf/not-a-constructor.js:17: Test262Error: isConstructor invoked with a non-function value
98-
test262/test/built-ins/Set/prototype/isSubsetOf/not-a-constructor.js:17: strict mode: Test262Error: isConstructor invoked with a non-function value
99-
test262/test/built-ins/Set/prototype/isSubsetOf/require-internal-slot.js:17: Test262Error: Expected SameValue(«undefined», «function») to be true
100-
test262/test/built-ins/Set/prototype/isSubsetOf/require-internal-slot.js:17: strict mode: Test262Error: Expected SameValue(«undefined», «function») to be true
101-
test262/test/built-ins/Set/prototype/isSubsetOf/set-like-array.js:21: TypeError: not a function
102-
test262/test/built-ins/Set/prototype/isSubsetOf/set-like-array.js:21: strict mode: TypeError: not a function
103-
test262/test/built-ins/Set/prototype/isSubsetOf/set-like-class-mutation.js:25: TypeError: not a function
104-
test262/test/built-ins/Set/prototype/isSubsetOf/set-like-class-mutation.js:25: strict mode: TypeError: not a function
105-
test262/test/built-ins/Set/prototype/isSubsetOf/set-like-class-order.js:43: TypeError: not a function
106-
test262/test/built-ins/Set/prototype/isSubsetOf/set-like-class-order.js:43: strict mode: TypeError: not a function
107-
test262/test/built-ins/Set/prototype/isSubsetOf/size-is-a-number.js:24: Test262Error: GetSetRecord coerces size Expected SameValue(«0», «1») to be true
108-
test262/test/built-ins/Set/prototype/isSubsetOf/size-is-a-number.js:24: strict mode: Test262Error: GetSetRecord coerces size Expected SameValue(«0», «1») to be true
109-
test262/test/built-ins/Set/prototype/isSubsetOf/subclass-receiver-methods.js:32: TypeError: not a function
110-
test262/test/built-ins/Set/prototype/isSubsetOf/subclass-receiver-methods.js:32: strict mode: TypeError: not a function
11175
test262/test/built-ins/Set/prototype/isSupersetOf/allows-set-like-class.js:29: TypeError: not a function
11276
test262/test/built-ins/Set/prototype/isSupersetOf/allows-set-like-class.js:29: strict mode: TypeError: not a function
11377
test262/test/built-ins/Set/prototype/isSupersetOf/allows-set-like-object.js:27: TypeError: not a function
@@ -173,10 +137,4 @@ test262/test/language/expressions/member-expression/computed-reference-null-or-u
173137
test262/test/language/expressions/optional-chaining/optional-call-preserves-this.js:21: TypeError: cannot read property 'c' of undefined
174138
test262/test/language/expressions/optional-chaining/optional-call-preserves-this.js:16: strict mode: TypeError: cannot read property '_b' of undefined
175139
test262/test/language/module-code/top-level-await/async-module-does-not-block-sibling-modules.js:13: SyntaxError: Could not find export 'check' in module 'test262/test/language/module-code/top-level-await/async-module-sync_FIXTURE.js'
176-
test262/test/staging/set-is-subset-on-set-like.js:24: TypeError: not a function
177-
test262/test/staging/set-is-subset-on-set-like.js:24: strict mode: TypeError: not a function
178-
test262/test/staging/set-is-subset-table-receiver-cleared.js:25: TypeError: not a function
179-
test262/test/staging/set-is-subset-table-receiver-cleared.js:25: strict mode: TypeError: not a function
180-
test262/test/staging/set-is-subset-table-transition.js:28: TypeError: not a function
181-
test262/test/staging/set-is-subset-table-transition.js:28: strict mode: TypeError: not a function
182140
test262/test/staging/top-level-await/tla-hang-entry.js:10: TypeError: $DONE() not called

0 commit comments

Comments
 (0)