ReactOS 0.4.17-dev-281-g9de2895
set.c
Go to the documentation of this file.
1/*
2 * Copyright 2021 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#ifdef __REACTOS__
20#include <wine/config.h>
21#include <wine/port.h>
22#endif
23
24#include <assert.h>
25#include <math.h>
26
27#include "jscript.h"
28
29#include "wine/rbtree.h"
30#include "wine/debug.h"
31
33
34typedef struct {
37 struct list entries;
38 size_t size;
40
45
46 /*
47 * We need to maintain a list as well to support traversal in forEach.
48 * If the entry is removed while being processed by forEach, it's
49 * still kept in the list and released later, when it's safe.
50 */
52 unsigned int ref;
54};
55
56static int jsval_map_compare(const void *k, const struct wine_rb_entry *e)
57{
58 const struct jsval_map_entry *entry = WINE_RB_ENTRY_VALUE(e, const struct jsval_map_entry, entry);
59 const jsval_t *key = k;
60 union {
61 double d;
62 INT64 n;
63 } bits1, bits2;
64
65 if(jsval_type(entry->key) != jsval_type(*key))
66 return (int)jsval_type(entry->key) - (int)jsval_type(*key);
67
68 switch(jsval_type(*key)) {
69 case JSV_UNDEFINED:
70 case JSV_NULL:
71 return 0;
72 case JSV_OBJECT:
73 if(get_object(*key) == get_object(entry->key)) return 0;
74 return get_object(*key) < get_object(entry->key) ? -1 : 1;
75 case JSV_STRING:
76 return jsstr_cmp(get_string(*key), get_string(entry->key));
77 case JSV_NUMBER:
78 if(isnan(get_number(*key))) return isnan(get_number(entry->key)) ? 0 : -1;
79 if(isnan(get_number(entry->key))) return 1;
80
81 /* native treats -0 differently than 0, so need to compare bitwise */
82 bits1.d = get_number(*key);
83 bits2.d = get_number(entry->key);
84 return (bits1.n == bits2.n) ? 0 : (bits1.n < bits2.n ? -1 : 1);
85 case JSV_BOOL:
86 if(get_bool(*key) == get_bool(entry->key)) return 0;
87 return get_bool(*key) ? 1 : -1;
88 default:
89 assert(0);
90 return 0;
91 }
92}
93
95{
96 jsdisp_t *jsdisp;
97
98 if(!is_object_instance(vthis))
100 if(!(jsdisp = to_jsdisp(get_object(vthis))) || !is_class(jsdisp, JSCLASS_MAP)) {
101 WARN("not a Map object passed as 'this'\n");
102 return throw_error(ctx, JS_E_WRONG_THIS, L"Map");
103 }
104
105 *ret = CONTAINING_RECORD(jsdisp, MapInstance, dispex);
106 return S_OK;
107}
108
110{
111 jsdisp_t *jsdisp;
112
113 if(!is_object_instance(vthis))
115 if(!(jsdisp = to_jsdisp(get_object(vthis))) || !is_class(jsdisp, JSCLASS_SET)) {
116 WARN("not a Set object passed as 'this'\n");
117 return throw_error(ctx, JS_E_WRONG_THIS, L"Set");
118 }
119
120 *ret = CONTAINING_RECORD(jsdisp, MapInstance, dispex);
121 return S_OK;
122}
123
125{
126 struct wine_rb_entry *entry;
127 if(!(entry = wine_rb_get(&map->map, &key))) return NULL;
129}
130
132{
133 entry->ref++;
134}
135
137{
138 if(--entry->ref) return;
139 jsval_release(entry->key);
140 jsval_release(entry->value);
141 list_remove(&entry->list_entry);
142 free(entry);
143}
144
146{
147 map->size--;
148 wine_rb_remove(&map->map, &entry->entry);
149 entry->deleted = TRUE;
151}
152
154{
155 struct jsval_map_entry *entry;
157
158 if((entry = get_map_entry(map, key))) {
159 jsval_t val;
161 if(FAILED(hres))
162 return hres;
163
164 jsval_release(entry->value);
165 entry->value = val;
166 }else {
167 if(!(entry = calloc(1, sizeof(*entry)))) return E_OUTOFMEMORY;
168
169 hres = jsval_copy(key, &entry->key);
170 if(SUCCEEDED(hres)) {
171 hres = jsval_copy(value, &entry->value);
172 if(FAILED(hres))
173 jsval_release(entry->key);
174 }
175 if(FAILED(hres)) {
176 free(entry);
177 return hres;
178 }
180 wine_rb_put(&map->map, &entry->key, &entry->entry);
181 list_add_tail(&map->entries, &entry->list_entry);
182 map->size++;
183 }
184
185 if(r) *r = jsval_undefined();
186 return S_OK;
187}
188
190{
191 struct list *iter = list_head(&map->entries);
192 jsval_t context_this = jsval_undefined();
194
195 if(!argc || !is_object_instance(argv[0])) {
196 FIXME("invalid callback %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined()));
197 return E_FAIL;
198 }
199
200 if(argc > 1)
201 context_this = argv[1];
202
203 while(iter) {
205 jsval_t args[3], v;
206
207 if(entry->deleted) {
208 iter = list_next(&map->entries, iter);
209 continue;
210 }
211
212 args[0] = entry->value;
213 args[1] = entry->key;
214 args[2] = jsval_obj(&map->dispex);
217 iter = list_next(&map->entries, iter);
219 if(FAILED(hres))
220 return hres;
222 }
223
224 if(r) *r = jsval_undefined();
225 return S_OK;
226}
227
229 jsval_t *r)
230{
231 struct jsval_map_entry *entry, *entry2;
234
235 hres = get_map_this(ctx, vthis, &map);
236 if(FAILED(hres))
237 return hres;
238
239 TRACE("%p\n", map);
240
241 LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &map->entries, struct jsval_map_entry, list_entry)
243
244 if(r) *r = jsval_undefined();
245 return S_OK;
246}
247
249 jsval_t *r)
250{
251 jsval_t key = argc >= 1 ? argv[0] : jsval_undefined();
252 struct jsval_map_entry *entry;
255
256 hres = get_map_this(ctx, vthis, &map);
257 if(FAILED(hres))
258 return hres;
259
260 TRACE("%p (%s)\n", map, debugstr_jsval(key));
261
263 if(r) *r = jsval_bool(!!entry);
264 return S_OK;
265}
266
268 jsval_t *r)
269{
272
273 hres = get_map_this(ctx, vthis, &map);
274 if(FAILED(hres))
275 return hres;
276
277 TRACE("%p (%s)\n", map, debugstr_jsval(argc >= 1 ? argv[0] : jsval_undefined()));
278
279 return iterate_map(map, ctx, argc, argv, r);
280}
281
283 jsval_t *r)
284{
285 jsval_t key = argc >= 1 ? argv[0] : jsval_undefined();
286 struct jsval_map_entry *entry;
289
290 hres = get_map_this(ctx, vthis, &map);
291 if(FAILED(hres))
292 return hres;
293
294 TRACE("%p (%s)\n", map, debugstr_jsval(key));
295
296 if(!(entry = get_map_entry(map, key))) {
297 if(r) *r = jsval_undefined();
298 return S_OK;
299 }
300
301 return r ? jsval_copy(entry->value, r) : S_OK;
302}
303
305 jsval_t *r)
306{
307 jsval_t key = argc >= 1 ? argv[0] : jsval_undefined();
308 jsval_t value = argc >= 2 ? argv[1] : jsval_undefined();
311
312 hres = get_map_this(ctx, vthis, &map);
313 if(FAILED(hres))
314 return hres;
315
316 TRACE("%p (%s %s)\n", map, debugstr_jsval(key), debugstr_jsval(value));
317
318 return set_map_entry(map, key, value, r);
319}
320
322 jsval_t *r)
323{
324 jsval_t key = argc >= 1 ? argv[0] : jsval_undefined();
325 struct jsval_map_entry *entry;
328
329 hres = get_map_this(ctx, vthis, &map);
330 if(FAILED(hres))
331 return hres;
332
333 TRACE("%p (%s)\n", map, debugstr_jsval(key));
334
336 if(r) *r = jsval_bool(!!entry);
337 return S_OK;
338}
339
341{
342 MapInstance *map = (MapInstance*)jsthis;
343
344 TRACE("%p\n", map);
345
346 *r = jsval_number(map->size);
347 return S_OK;
348}
349
351 jsval_t *r)
352{
353 FIXME("\n");
354 return E_NOTIMPL;
355}
356
357static void Map_destructor(jsdisp_t *dispex)
358{
359 MapInstance *map = (MapInstance*)dispex;
360
361 while(!list_empty(&map->entries)) {
362 struct jsval_map_entry *entry = LIST_ENTRY(list_head(&map->entries),
364 assert(!entry->deleted);
366 }
367}
368
370{
371 MapInstance *map = (MapInstance*)dispex;
372 struct jsval_map_entry *entry, *entry2;
374
375 if(op == GC_TRAVERSE_UNLINK) {
376 LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &map->entries, struct jsval_map_entry, list_entry)
379 return S_OK;
380 }
381
383 hres = gc_process_linked_val(gc_ctx, op, dispex, &entry->key);
384 if(FAILED(hres))
385 return hres;
386 hres = gc_process_linked_val(gc_ctx, op, dispex, &entry->value);
387 if(FAILED(hres))
388 return hres;
389 }
390 return S_OK;
391}
392
394 {L"clear", Map_clear, PROPF_METHOD},
395 {L"delete" , Map_delete, PROPF_METHOD|1},
396 {L"forEach", Map_forEach, PROPF_METHOD|1},
397 {L"get", Map_get, PROPF_METHOD|1},
398 {L"has", Map_has, PROPF_METHOD|1},
399 {L"set", Map_set, PROPF_METHOD|2},
400};
401
402static const builtin_prop_t Map_props[] = {
404};
405
408 .call = Map_value,
409 .props_cnt = ARRAY_SIZE(Map_prototype_props),
410 .props = Map_prototype_props,
411};
412
413static const builtin_info_t Map_info = {
415 .call = Map_value,
416 .props_cnt = ARRAY_SIZE(Map_props),
417 .props = Map_props,
418 .destructor = Map_destructor,
419 .gc_traverse = Map_gc_traverse,
420};
421
423 jsval_t *r)
424{
427
428 switch(flags) {
429 case DISPATCH_CONSTRUCT:
430 TRACE("\n");
431
432 if(!r)
433 return S_OK;
434 if(!(map = calloc(1, sizeof(*map))))
435 return E_OUTOFMEMORY;
436
437 hres = init_dispex(&map->dispex, ctx, &Map_info, ctx->map_prototype);
438 if(FAILED(hres))
439 return hres;
440
442 list_init(&map->entries);
443 *r = jsval_obj(&map->dispex);
444 return S_OK;
445
446 case DISPATCH_METHOD:
447 return throw_error(ctx, JS_E_WRONG_THIS, L"Map");
448
449 default:
450 FIXME("unimplemented flags %x\n", flags);
451 return E_NOTIMPL;
452 }
453}
454
456 jsval_t *r)
457{
461
462 hres = get_set_this(ctx, vthis, &set);
463 if(FAILED(hres))
464 return hres;
465
466 TRACE("%p (%s)\n", set, debugstr_jsval(key));
467
468 return set_map_entry(set, key, key, r);
469}
470
472 jsval_t *r)
473{
474 struct jsval_map_entry *entry, *entry2;
477
478 hres = get_set_this(ctx, vthis, &set);
479 if(FAILED(hres))
480 return hres;
481
482 TRACE("%p\n", set);
483
484 LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &set->entries, struct jsval_map_entry, list_entry)
486
487 if(r) *r = jsval_undefined();
488 return S_OK;
489}
490
492 jsval_t *r)
493{
495 struct jsval_map_entry *entry;
498
499 hres = get_set_this(ctx, vthis, &set);
500 if(FAILED(hres))
501 return hres;
502
503 TRACE("%p (%s)\n", set, debugstr_jsval(key));
504
506 if(r) *r = jsval_bool(!!entry);
507 return S_OK;
508}
509
511 jsval_t *r)
512{
515
516 hres = get_set_this(ctx, vthis, &set);
517 if(FAILED(hres))
518 return hres;
519
520 TRACE("%p (%s)\n", set, debugstr_jsval(argc ? argv[0] : jsval_undefined()));
521
522 return iterate_map(set, ctx, argc, argv, r);
523}
524
526 jsval_t *r)
527{
529 struct jsval_map_entry *entry;
532
533 hres = get_set_this(ctx, vthis, &set);
534 if(FAILED(hres))
535 return hres;
536
537 TRACE("%p (%s)\n", set, debugstr_jsval(key));
538
540 if(r) *r = jsval_bool(!!entry);
541 return S_OK;
542}
543
545 jsval_t *r)
546{
547 FIXME("\n");
548 return E_NOTIMPL;
549}
550
552 {L"add", Set_add, PROPF_METHOD|1},
553 {L"clear", Set_clear, PROPF_METHOD},
554 {L"delete" , Set_delete, PROPF_METHOD|1},
555 {L"forEach", Set_forEach, PROPF_METHOD|1},
556 {L"has", Set_has, PROPF_METHOD|1},
557};
558
561 .call = Set_value,
562 .props_cnt = ARRAY_SIZE(Set_prototype_props),
563 .props = Set_prototype_props,
564};
565
566static const builtin_info_t Set_info = {
568 .call = Set_value,
569 .props_cnt = ARRAY_SIZE(Map_props),
570 .props = Map_props,
571 .destructor = Map_destructor,
572 .gc_traverse = Map_gc_traverse,
573};
574
576 jsval_t *r)
577{
580
581 switch(flags) {
582 case DISPATCH_CONSTRUCT:
583 TRACE("\n");
584
585 if(!r)
586 return S_OK;
587 if(!(set = calloc(1, sizeof(*set))))
588 return E_OUTOFMEMORY;
589
590 hres = init_dispex(&set->dispex, ctx, &Set_info, ctx->set_prototype);
591 if(FAILED(hres))
592 return hres;
593
595 list_init(&set->entries);
596 *r = jsval_obj(&set->dispex);
597 return S_OK;
598
599 case DISPATCH_METHOD:
600 return throw_error(ctx, JS_E_WRONG_THIS, L"Set");
601
602 default:
603 FIXME("unimplemented flags %x\n", flags);
604 return E_NOTIMPL;
605 }
606}
607
608typedef struct {
610 struct rb_tree map;
612
613static int weakmap_compare(const void *k, const struct rb_entry *e)
614{
615 ULONG_PTR a = (ULONG_PTR)k, b = (ULONG_PTR)RB_ENTRY_VALUE(e, const struct weakmap_entry, entry)->key;
616 return (a > b) - (a < b);
617}
618
620{
621 jsdisp_t *jsdisp;
622
623 if(!is_object_instance(vthis))
625 if(!(jsdisp = to_jsdisp(get_object(vthis))) || !is_class(jsdisp, JSCLASS_WEAKMAP)) {
626 WARN("not a WeakMap object passed as 'this'\n");
627 throw_error(ctx, JS_E_WRONG_THIS, L"WeakMap");
628 return DISP_E_EXCEPTION;
629 }
630
631 *ret = CONTAINING_RECORD(jsdisp, WeakMapInstance, dispex);
632 return S_OK;
633}
634
636{
637 struct rb_entry *entry;
638 if(!(entry = rb_get(&weakmap->map, key))) return NULL;
640}
641
643{
644 WeakMapInstance *weakmap = (WeakMapInstance*)entry->weakmap;
645 struct list *next = entry->weak_refs_entry.next;
646
647 if(next->next != &entry->weak_refs_entry)
648 list_remove(&entry->weak_refs_entry);
649 else {
651 entry->key->has_weak_refs = FALSE;
652 rb_remove(&entry->key->ctx->thread_data->weak_refs, &weak_refs_entry->entry);
654 }
655 rb_remove(&weakmap->map, &entry->entry);
656 jsval_release(entry->value);
657 free(entry);
658}
659
661 jsval_t *r)
662{
663 WeakMapInstance *weakmap;
665
666 hres = get_weakmap_this(ctx, vthis, &weakmap);
667 if(FAILED(hres))
668 return hres;
669
670 TRACE("%p\n", weakmap);
671
672 while(weakmap->map.root)
674
675 if(r) *r = jsval_undefined();
676 return S_OK;
677}
678
680 jsval_t *r)
681{
683 struct weakmap_entry *entry;
686
687 hres = get_weakmap_this(ctx, vthis, &weakmap);
688 if(FAILED(hres))
689 return hres;
690
691 TRACE("%p (%p)\n", weakmap, key);
692
695 if(r) *r = jsval_bool(!!entry);
696 return S_OK;
697}
698
700 jsval_t *r)
701{
703 struct weakmap_entry *entry;
706
707 hres = get_weakmap_this(ctx, vthis, &weakmap);
708 if(FAILED(hres))
709 return hres;
710
711 TRACE("%p (%p)\n", weakmap, key);
712
714 if(r) *r = jsval_undefined();
715 return S_OK;
716 }
717
718 return r ? jsval_copy(entry->value, r) : S_OK;
719}
720
722 jsval_t *r)
723{
725 jsval_t value = argc >= 2 ? argv[1] : jsval_undefined();
726 struct weakmap_entry *entry;
729
730 hres = get_weakmap_this(ctx, vthis, &weakmap);
731 if(FAILED(hres))
732 return hres;
733
734 TRACE("%p (%p %s)\n", weakmap, key, debugstr_jsval(value));
735
736 if(!key)
737 return JS_E_KEY_NOT_OBJECT;
738
740 jsval_t val;
742 if(FAILED(hres))
743 return hres;
744
745 jsval_release(entry->value);
746 entry->value = val;
747 }else {
749
750 if(!(entry = malloc(sizeof(*entry))))
751 return E_OUTOFMEMORY;
752
753 hres = jsval_copy(value, &entry->value);
754 if(FAILED(hres)) {
755 free(entry);
756 return hres;
757 }
758
759 if(key->has_weak_refs)
760 weak_refs_entry = RB_ENTRY_VALUE(rb_get(&ctx->thread_data->weak_refs, key), struct weak_refs_entry, entry);
761 else {
762 if(!(weak_refs_entry = malloc(sizeof(*weak_refs_entry)))) {
763 jsval_release(entry->value);
764 free(entry);
765 return E_OUTOFMEMORY;
766 }
767 rb_put(&ctx->thread_data->weak_refs, key, &weak_refs_entry->entry);
769 key->has_weak_refs = TRUE;
770 }
771 list_add_tail(&weak_refs_entry->list, &entry->weak_refs_entry);
772
773 entry->key = key;
774 entry->weakmap = &weakmap->dispex;
775 rb_put(&weakmap->map, key, &entry->entry);
776 }
777
778 if(r) *r = jsval_undefined();
779 return S_OK;
780}
781
783 jsval_t *r)
784{
786 WeakMapInstance *weakmap;
788
789 hres = get_weakmap_this(ctx, vthis, &weakmap);
790 if(FAILED(hres))
791 return hres;
792
793 TRACE("%p (%p)\n", weakmap, key);
794
795 if(r) *r = jsval_bool(!!get_weakmap_entry(weakmap, key));
796 return S_OK;
797}
798
800 jsval_t *r)
801{
802 FIXME("\n");
803 return E_NOTIMPL;
804}
805
806static void WeakMap_destructor(jsdisp_t *dispex)
807{
808 WeakMapInstance *weakmap = (WeakMapInstance*)dispex;
809
810 while(weakmap->map.root)
812}
813
815{
816 WeakMapInstance *weakmap = (WeakMapInstance*)dispex;
817 struct weakmap_entry *entry;
819
820 if(op == GC_TRAVERSE_UNLINK) {
821 while(weakmap->map.root)
823 return S_OK;
824 }
825
827 /* Only traverse the values if the key turned out to be alive, which means it might not have traversed
828 the associated values with it from this WeakMap yet (because it wasn't considered alive back then).
829 We need both the key and the WeakMap for the entry to actually be accessible (and thus traversed). */
830 if(op == GC_TRAVERSE && entry->key->gc_marked)
831 continue;
832
833 hres = gc_process_linked_val(gc_ctx, op, dispex, &entry->value);
834 if(FAILED(hres))
835 return hres;
836 }
837 return S_OK;
838}
839
841 {L"clear", WeakMap_clear, PROPF_METHOD},
842 {L"delete", WeakMap_delete, PROPF_METHOD|1},
843 {L"get", WeakMap_get, PROPF_METHOD|1},
844 {L"has", WeakMap_has, PROPF_METHOD|1},
845 {L"set", WeakMap_set, PROPF_METHOD|2},
846};
847
850 .call = WeakMap_value,
853};
854
857 .call = WeakMap_value,
858 .destructor = WeakMap_destructor,
859 .gc_traverse = WeakMap_gc_traverse,
860};
861
863 jsval_t *r)
864{
867
868 switch(flags) {
869 case DISPATCH_CONSTRUCT:
870 TRACE("\n");
871
872 if(!r)
873 return S_OK;
874 if(!(weakmap = calloc(1, sizeof(*weakmap))))
875 return E_OUTOFMEMORY;
876
877 hres = init_dispex(&weakmap->dispex, ctx, &WeakMap_info, ctx->weakmap_prototype);
878 if(FAILED(hres))
879 return hres;
880
882 *r = jsval_obj(&weakmap->dispex);
883 return S_OK;
884
885 case DISPATCH_METHOD:
886 return throw_error(ctx, JS_E_WRONG_THIS, L"WeakMap");
887
888 default:
889 FIXME("unimplemented flags %x\n", flags);
890 return E_NOTIMPL;
891 }
892}
893
895{
896 jsdisp_t *constructor;
898
899 if(ctx->version < SCRIPTLANGUAGEVERSION_ES6)
900 return S_OK;
901
902 hres = create_dispex(ctx, &Set_prototype_info, ctx->object_prototype, &ctx->set_prototype);
903 if(FAILED(hres))
904 return hres;
905
907 PROPF_CONSTR, ctx->set_prototype, &constructor);
908 if(FAILED(hres))
909 return hres;
910
912 jsval_obj(constructor));
913 jsdisp_release(constructor);
914 if(FAILED(hres))
915 return hres;
916
917 hres = create_dispex(ctx, &Map_prototype_info, ctx->object_prototype, &ctx->map_prototype);
918 if(FAILED(hres))
919 return hres;
920
922 PROPF_CONSTR, ctx->map_prototype, &constructor);
923 if(FAILED(hres))
924 return hres;
925
927 jsval_obj(constructor));
928 jsdisp_release(constructor);
929 if(FAILED(hres))
930 return hres;
931
932 hres = create_dispex(ctx, &WeakMap_prototype_info, ctx->object_prototype, &ctx->weakmap_prototype);
933 if(FAILED(hres))
934 return hres;
935
937 PROPF_CONSTR, ctx->weakmap_prototype, &constructor);
938 if(FAILED(hres))
939 return hres;
940
942 jsval_obj(constructor));
943 jsdisp_release(constructor);
944 return hres;
945}
COMPILER_DEPENDENT_INT64 INT64
Definition: actypes.h:132
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
Definition: list.h:37
Definition: _map.h:48
map()
Definition: _map.h:99
size_type size() const
Definition: _map.h:172
Definition: _set.h:50
static BOOL get_bool(D3DXPARAMETER_TYPE type, const void *data)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT op
Definition: effect.c:236
HRESULT throw_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
Definition: error.c:398
HRESULT create_builtin_constructor(script_ctx_t *ctx, builtin_invoke_t value_proc, const WCHAR *name, const builtin_info_t *builtin_info, DWORD flags, jsdisp_t *prototype, jsdisp_t **ret)
Definition: function.c:809
HRESULT init_set_constructor(script_ctx_t *ctx)
Definition: set.c:894
static HRESULT Map_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:228
static const builtin_info_t WeakMap_info
Definition: set.c:855
static const builtin_prop_t Set_prototype_props[]
Definition: set.c:551
static HRESULT Set_constructor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:575
static const builtin_prop_t WeakMap_prototype_props[]
Definition: set.c:840
static HRESULT Map_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *dispex)
Definition: set.c:369
static HRESULT WeakMap_constructor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:862
static void grab_map_entry(struct jsval_map_entry *entry)
Definition: set.c:131
static HRESULT set_map_entry(MapInstance *map, jsval_t key, jsval_t value, jsval_t *r)
Definition: set.c:153
static struct weakmap_entry * get_weakmap_entry(WeakMapInstance *weakmap, jsdisp_t *key)
Definition: set.c:635
static HRESULT WeakMap_set(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:721
static HRESULT Set_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:544
static HRESULT WeakMap_get(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:699
static HRESULT WeakMap_delete(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:679
static void Map_destructor(jsdisp_t *dispex)
Definition: set.c:357
static HRESULT Set_delete(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:491
static int weakmap_compare(const void *k, const struct rb_entry *e)
Definition: set.c:613
static HRESULT WeakMap_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:799
static const builtin_info_t Set_prototype_info
Definition: set.c:559
void remove_weakmap_entry(struct weakmap_entry *entry)
Definition: set.c:642
static const builtin_info_t Map_prototype_info
Definition: set.c:406
static const builtin_prop_t Map_prototype_props[]
Definition: set.c:393
static void WeakMap_destructor(jsdisp_t *dispex)
Definition: set.c:806
static HRESULT Map_has(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:321
static HRESULT WeakMap_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:660
static struct jsval_map_entry * get_map_entry(MapInstance *map, jsval_t key)
Definition: set.c:124
static HRESULT Set_has(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:525
static void release_map_entry(struct jsval_map_entry *entry)
Definition: set.c:136
static HRESULT Map_get(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:282
static HRESULT Map_set(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:304
static const builtin_info_t Map_info
Definition: set.c:413
static const builtin_info_t Set_info
Definition: set.c:566
static void delete_map_entry(MapInstance *map, struct jsval_map_entry *entry)
Definition: set.c:145
static HRESULT WeakMap_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *dispex)
Definition: set.c:814
static HRESULT get_map_this(script_ctx_t *ctx, jsval_t vthis, MapInstance **ret)
Definition: set.c:94
static HRESULT Map_constructor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:422
static HRESULT Map_forEach(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:267
static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:189
static HRESULT Set_add(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:455
static HRESULT Map_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:350
static int jsval_map_compare(const void *k, const struct wine_rb_entry *e)
Definition: set.c:56
static const builtin_info_t WeakMap_prototype_info
Definition: set.c:848
static HRESULT Map_get_size(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: set.c:340
static HRESULT Set_forEach(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:510
static HRESULT Set_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:471
static HRESULT WeakMap_has(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:782
static HRESULT get_set_this(script_ctx_t *ctx, jsval_t vthis, MapInstance **ret)
Definition: set.c:109
static HRESULT Map_delete(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: set.c:248
static HRESULT get_weakmap_this(script_ctx_t *ctx, jsval_t vthis, WeakMapInstance **ret)
Definition: set.c:619
static const builtin_prop_t Map_props[]
Definition: set.c:402
MonoAssembly int argc
Definition: metahost.c:107
#define assert(_expr)
Definition: assert.h:32
#define isnan(x)
Definition: math.h:360
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
#define ULONG_PTR
Definition: config.h:101
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
const GLdouble * v
Definition: gl.h:2040
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLdouble n
Definition: glext.h:7729
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLbitfield flags
Definition: glext.h:7161
GLuint GLfloat * val
Definition: glext.h:7180
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
HRESULT jsdisp_define_data_property(jsdisp_t *obj, const WCHAR *name, unsigned flags, jsval_t value)
Definition: dispex.c:3349
HRESULT gc_process_linked_val(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *obj, jsval_t *link)
Definition: dispex.c:1139
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
HRESULT create_dispex(script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype, jsdisp_t **dispex)
Definition: dispex.c:2493
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:2454
HRESULT builtin_set_const(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value)
Definition: dispex.c:741
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
#define JS_E_OBJECT_EXPECTED
Definition: jscript.h:555
#define SCRIPTLANGUAGEVERSION_ES6
Definition: jscript.h:54
static HRESULT disp_call_value(script_ctx_t *ctx, IDispatch *disp, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: jscript.h:518
#define JS_E_KEY_NOT_OBJECT
Definition: jscript.h:583
const char * debugstr_jsval(const jsval_t)
Definition: jsutils.c:35
@ JSCLASS_MAP
Definition: jscript.h:121
@ JSCLASS_WEAKMAP
Definition: jscript.h:123
@ JSCLASS_SET
Definition: jscript.h:122
@ JSCLASS_OBJECT
Definition: jscript.h:113
gc_traverse_op
Definition: jscript.h:161
@ GC_TRAVERSE
Definition: jscript.h:164
@ GC_TRAVERSE_UNLINK
Definition: jscript.h:162
#define JS_E_WRONG_THIS
Definition: jscript.h:582
static BOOL is_class(jsdisp_t *jsdisp, jsclass_t class)
Definition: jscript.h:503
const unsigned int PROPF_WRITABLE
Definition: jsdisp.idl:37
const unsigned int PROPF_CONFIGURABLE
Definition: jsdisp.idl:38
const unsigned int PROPF_METHOD
Definition: jsdisp.idl:33
const unsigned int PROPF_CONSTR
Definition: jsdisp.idl:34
int jsstr_cmp(jsstr_t *str1, jsstr_t *str2)
Definition: jsstr.c:192
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225
void jsval_release(jsval_t val)
Definition: jsutils.c:186
@ JSV_STRING
Definition: jsval.h:48
@ JSV_NUMBER
Definition: jsval.h:49
@ JSV_OBJECT
Definition: jsval.h:47
@ JSV_NULL
Definition: jsval.h:46
@ JSV_UNDEFINED
Definition: jsval.h:45
@ JSV_BOOL
Definition: jsval.h:50
static jsval_t jsval_undefined(void)
Definition: jsval.h:146
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
static jsval_t jsval_bool(BOOL b)
Definition: jsval.h:101
static jsval_type_t jsval_type(jsval_t v)
Definition: jsval.h:219
static jsstr_t * get_string(jsval_t v)
Definition: jsval.h:238
static double get_number(jsval_t v)
Definition: jsval.h:233
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
static jsval_t jsval_number(double n)
Definition: jsval.h:153
#define d
Definition: ke_i.h:81
#define e
Definition: ke_i.h:82
#define b
Definition: ke_i.h:79
HRESULT hres
Definition: protocol.c:465
int k
Definition: mpi.c:3369
#define argv
Definition: mplay32.c:18
#define DISPATCH_METHOD
Definition: oleauto.h:1006
static unsigned __int64 next
Definition: rand_nt.c:6
#define calloc
Definition: rosglue.h:14
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
__WINE_SERVER_LIST_INLINE struct list * list_next(const struct list *list, const struct list *elem)
Definition: list.h:115
#define RB_ENTRY_VALUE(element, type, field)
Definition: rbtree.h:26
#define wine_rb_entry
Definition: rbtree.h:404
#define WINE_RB_ENTRY_VALUE
Definition: rbtree.h:414
#define wine_rb_put
Definition: rbtree.h:410
static int rb_put(struct rb_tree *tree, const void *key, struct rb_entry *entry)
Definition: rbtree.h:204
static struct rb_entry * rb_get(const struct rb_tree *tree, const void *key)
Definition: rbtree.h:192
#define wine_rb_tree
Definition: rbtree.h:405
#define RB_FOR_EACH_ENTRY(elem, tree, type, field)
Definition: rbtree.h:148
#define wine_rb_init
Definition: rbtree.h:406
#define wine_rb_destroy
Definition: rbtree.h:408
static void rb_remove(struct rb_tree *tree, struct rb_entry *entry)
Definition: rbtree.h:272
#define wine_rb_get
Definition: rbtree.h:409
#define wine_rb_remove
Definition: rbtree.h:411
static void rb_init(struct rb_tree *tree, rb_compare_func_t compare)
Definition: rbtree.h:173
#define TRACE(s)
Definition: solgame.cpp:4
size_t size
Definition: set.c:38
jsdisp_t dispex
Definition: set.c:35
jsdisp_t dispex
Definition: set.c:609
struct rb_tree map
Definition: set.c:610
Definition: jsval.h:54
Definition: match.c:390
jsclass_t class
Definition: jscript.h:183
Definition: dispex.c:889
Definition: set.c:41
jsval_t key
Definition: set.c:43
unsigned int ref
Definition: set.c:52
struct wine_rb_entry entry
Definition: set.c:42
jsval_t value
Definition: set.c:44
BOOL deleted
Definition: set.c:53
Definition: copy.c:22
Definition: list.h:27
Definition: list.h:15
Definition: rbtree.h:30
Definition: rbtree.h:40
Definition: jscript.h:378
struct rb_entry entry
Definition: jscript.h:379
struct list list
Definition: jscript.h:380
Definition: jscript.h:446
jsdisp_t * weakmap
Definition: jscript.h:450
#define LIST_ENTRY(type)
Definition: queue.h:175
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
Definition: pdh_main.c:96
#define DISP_E_EXCEPTION
Definition: winerror.h:3621