ReactOS 0.4.17-dev-357-ga8f14ff
object.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 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#include <assert.h>
20
21#include "jscript.h"
22
23#include "wine/debug.h"
24
26
28 jsval_t *r)
29{
30 const WCHAR *str = NULL;
31 jsstr_t *ret = NULL;
32 jsdisp_t *jsdisp;
33 IDispatch *disp;
35
36 /* Keep in sync with jsclass_t enum */
37 static const WCHAR *names[] = {
38 NULL,
39 L"[object Array]",
40 L"[object Boolean]",
41 L"[object Date]",
42 L"[object Object]",
43 L"[object Error]",
44 L"[object Function]",
45 NULL,
46 L"[object Math]",
47 L"[object Number]",
48 L"[object Object]",
49 L"[object RegExp]",
50 L"[object String]",
51 L"[object Object]",
52 L"[object Object]",
53 L"[object Object]",
54 L"[object ArrayBuffer]",
55 L"[object Object]",
56 L"[object Object]",
57 L"[object Object]",
58 L"[object Object]",
59 NULL
60 };
61
62 TRACE("\n");
63
64 if(is_undefined(vthis) || is_null(vthis)) {
65 if(ctx->version < SCRIPTLANGUAGEVERSION_ES5)
66 str = L"[object Object]";
67 else
68 str = is_null(vthis) ? L"[object Null]" : L"[object Undefined]";
69 goto set_output;
70 }
71
72 hres = to_object(ctx, vthis, &disp);
73 if(FAILED(hres))
74 return hres;
75
76 jsdisp = to_jsdisp(disp);
77 if(!jsdisp) {
78 str = L"[object Object]";
79 }else if(jsdisp->builtin_info->to_string) {
80 hres = jsdisp->builtin_info->to_string(jsdisp, &ret);
81 }else if(names[jsdisp->builtin_info->class]) {
82 str = names[jsdisp->builtin_info->class];
83 }else {
85 FIXME("jsdisp->builtin_info->class = %d\n", jsdisp->builtin_info->class);
86 hres = E_FAIL;
87 }
88 IDispatch_Release(disp);
89 if(FAILED(hres))
90 return hres;
91
92set_output:
93 if(r) {
94 if(!ret) {
96 if(!ret)
97 return E_OUTOFMEMORY;
98 }
99 *r = jsval_string(ret);
100 }else if(ret) {
102 }
103
104 return S_OK;
105}
106
108 jsval_t *r)
109{
110 jsdisp_t *jsdisp;
111 IDispatch *disp;
113
114 TRACE("\n");
115
116 hres = to_object(ctx, vthis, &disp);
117 if(FAILED(hres))
118 return hres;
119
120 if(!(jsdisp = to_jsdisp(disp))) {
121 FIXME("Host object this\n");
122 hres = E_FAIL;
123 goto done;
124 }
125
126 hres = jsdisp_call_name(jsdisp, L"toString", DISPATCH_METHOD, 0, NULL, r);
127done:
128 IDispatch_Release(disp);
129 return hres;
130}
131
133 jsval_t *r)
134{
135 IDispatch *disp;
137
138 TRACE("\n");
139
140 if(is_null_disp(vthis)) {
141 if(r) *r = jsval_null_disp();
142 return S_OK;
143 }
144
145 hres = to_object(ctx, vthis, &disp);
146 if(FAILED(hres))
147 return hres;
148
149 if(r)
150 *r = jsval_disp(disp);
151 else
152 IDispatch_Release(disp);
153 return S_OK;
154}
155
157 jsval_t *r)
158{
159 IDispatchEx *dispex;
160 jsdisp_t *jsdisp;
161 IDispatch *disp;
162 jsstr_t *name;
163 DISPID id;
164 BSTR bstr;
166
167 TRACE("\n");
168
169 hres = to_object(ctx, vthis, &disp);
170 if(FAILED(hres))
171 return hres;
172
173 if(!argc) {
174 if(r)
175 *r = jsval_bool(FALSE);
176 goto done;
177 }
178
179 hres = to_string(ctx, argv[0], &name);
180 if(FAILED(hres))
181 goto done;
182
183 if((jsdisp = to_jsdisp(disp))) {
184 property_desc_t prop_desc;
185 const WCHAR *name_str;
186
187 name_str = jsstr_flatten(name);
188 if(!name_str) {
191 goto done;
192 }
193
194 hres = jsdisp_get_own_property(jsdisp, name_str, TRUE, &prop_desc);
197 goto done;
198
199 if(r) *r = jsval_bool(hres == S_OK);
200 hres = S_OK;
201 goto done;
202 }
203
204
206 if(bstr)
207 jsstr_flush(name, bstr);
209 if(!bstr) {
211 goto done;
212 }
213
214 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
215 if(SUCCEEDED(hres)) {
216 hres = IDispatchEx_GetDispID(dispex, bstr, make_grfdex(ctx, fdexNameCaseSensitive), &id);
217 IDispatchEx_Release(dispex);
218 }else {
219 hres = IDispatch_GetIDsOfNames(disp, &IID_NULL, &bstr, 1, ctx->lcid, &id);
220 }
221 SysFreeString(bstr);
222 if(r)
224 hres = S_OK;
225done:
226 IDispatch_Release(disp);
227 return hres;
228}
229
231 jsval_t *r)
232{
233 property_desc_t prop_desc;
234 const WCHAR *name;
235 jsstr_t *name_str;
236 jsdisp_t *jsdisp;
237 IDispatch *disp;
239
240 TRACE("\n");
241
242 hres = to_object(ctx, vthis, &disp);
243 if(FAILED(hres))
244 return hres;
245
246 if(argc != 1) {
247 FIXME("argc %d not supported\n", argc);
248 hres = E_NOTIMPL;
249 goto done;
250 }
251
252 if(!(jsdisp = to_jsdisp(disp))) {
253 FIXME("Host object this\n");
254 hres = E_FAIL;
255 goto done;
256 }
257
258 hres = to_flat_string(ctx, argv[0], &name_str, &name);
259 if(FAILED(hres))
260 goto done;
261
262 hres = jsdisp_get_own_property(jsdisp, name, TRUE, &prop_desc);
263 jsstr_release(name_str);
265 goto done;
266
267 if(r)
268 *r = jsval_bool(hres == S_OK && (prop_desc.flags & PROPF_ENUMERABLE) != 0);
269 hres = S_OK;
270done:
271 IDispatch_Release(disp);
272 return hres;
273}
274
276 jsval_t *r)
277{
278 jsdisp_t *jsthis, *jsdisp;
279 IDispatch *disp;
280 BOOL ret = FALSE;
282
283 hres = to_object(ctx, vthis, &disp);
284 if(FAILED(hres))
285 return hres;
286
287 if(!r)
288 goto done;
289
290 if(argc && (jsthis = to_jsdisp(disp)) && is_object_instance(argv[0]) &&
291 (jsdisp = to_jsdisp(get_object(argv[0])))) {
292 while(jsdisp->prototype) {
293 if(jsdisp->prototype == jsthis) {
294 ret = TRUE;
295 break;
296 }
297 jsdisp = jsdisp->prototype;
298 }
299 }
300
301 *r = jsval_bool(ret);
302done:
303 IDispatch_Release(disp);
304 return hres;
305}
306
308{
310 const WCHAR *name;
311 jsstr_t *name_str;
312 jsdisp_t *jsthis;
314
315 TRACE("\n");
316
317 if(!is_object_instance(vthis) || !(jsthis = to_jsdisp(get_object(vthis))))
318 goto done;
319
320 if(argc < 2 || !is_object_instance(argv[1]))
322
323 desc.getter = to_jsdisp(get_object(argv[1]));
324 if(!desc.getter) {
325 FIXME("getter is not JS object\n");
326 return E_NOTIMPL;
327 }
328 /* FIXME: Check IsCallable */
329
330 hres = to_flat_string(ctx, argv[0], &name_str, &name);
331 if(FAILED(hres))
332 return hres;
333
335 desc.explicit_getter = TRUE;
336 desc.explicit_setter = FALSE;
337 desc.explicit_value = FALSE;
338 desc.setter = NULL;
340
341 jsstr_release(name_str);
342 if(FAILED(hres))
343 return hres;
344done:
345 if(r)
346 *r = jsval_undefined();
347 return S_OK;
348}
349
351{
353 const WCHAR *name;
354 jsstr_t *name_str;
355 jsdisp_t *jsthis;
357
358 TRACE("\n");
359
360 if(!is_object_instance(vthis) || !(jsthis = to_jsdisp(get_object(vthis))))
361 goto done;
362
363 if(argc < 2 || !is_object_instance(argv[1]))
365
366 desc.setter = to_jsdisp(get_object(argv[1]));
367 if(!desc.setter) {
368 FIXME("setter is not JS object\n");
369 return E_NOTIMPL;
370 }
371 /* FIXME: Check IsCallable */
372
373 hres = to_flat_string(ctx, argv[0], &name_str, &name);
374 if(FAILED(hres))
375 return hres;
376
378 desc.explicit_getter = FALSE;
379 desc.explicit_setter = TRUE;
380 desc.explicit_value = FALSE;
381 desc.getter = NULL;
383
384 jsstr_release(name_str);
385 if(FAILED(hres))
386 return hres;
387done:
388 if(r)
389 *r = jsval_undefined();
390 return S_OK;
391}
392
394{
395 jsdisp_t *jsthis;
396 IDispatch *disp;
398
399 TRACE("%s\n", debugstr_jsval(vthis));
400
401 hres = to_object(ctx, vthis, &disp);
402 if(FAILED(hres))
403 return hres;
404
405 if(!r)
406 goto done;
407
408 if(!(jsthis = to_jsdisp(disp))) {
409 FIXME("Host object this\n");
410 hres = E_FAIL;
411 goto done;
412 }
413
414 *r = jsthis->prototype
416 : jsval_null();
417done:
418 IDispatch_Release(disp);
419 return hres;
420}
421
423{
424 jsdisp_t *jsthis, *proto;
426
427 TRACE("%s\n", debugstr_jsval(vthis));
428
429 if(is_undefined(vthis) || is_null(vthis))
431 if(!argc) {
432 if(r)
433 *r = jsval_undefined();
434 return S_OK;
435 }
436 if(!is_object_instance(vthis) || !(jsthis = to_jsdisp(get_object(vthis))))
437 goto done;
438
439 if(is_null(argv[0])) {
440 proto = NULL;
441 }else if(is_object_instance(argv[0])) {
443 if(!proto) {
444 FIXME("Host object value\n");
445 return E_FAIL;
446 }
447 }else
448 goto done;
449
451 if(FAILED(hres))
452 return hres;
453
454done:
455 return r ? jsval_copy(argv[0], r) : S_OK;
456}
457
458static const builtin_prop_t Object_props[] = {
459 {L"__defineGetter__", Object_defineGetter, PROPF_METHOD|PROPF_ES6|2},
460 {L"__defineSetter__", Object_defineSetter, PROPF_METHOD|PROPF_ES6|2},
461 {L"hasOwnProperty", Object_hasOwnProperty, PROPF_METHOD|1},
462 {L"isPrototypeOf", Object_isPrototypeOf, PROPF_METHOD|1},
463 {L"propertyIsEnumerable", Object_propertyIsEnumerable, PROPF_METHOD|1},
464 {L"toLocaleString", Object_toLocaleString, PROPF_METHOD},
465 {L"toString", Object_toString, PROPF_METHOD},
466 {L"valueOf", Object_valueOf, PROPF_METHOD}
467};
468
471 .props_cnt = ARRAY_SIZE(Object_props),
472 .props = Object_props,
473};
474
477};
478
480{
481 if(desc->explicit_value)
482 jsval_release(desc->value);
483 if(desc->getter)
484 jsdisp_release(desc->getter);
485 if(desc->setter)
486 jsdisp_release(desc->setter);
487}
488
490{
491 DISPID id;
492 jsval_t v;
493 BOOL b;
495
496 memset(desc, 0, sizeof(*desc));
497 desc->value = jsval_undefined();
498
499 hres = jsdisp_get_id(attr_obj, L"enumerable", 0, &id);
500 if(SUCCEEDED(hres)) {
501 desc->mask |= PROPF_ENUMERABLE;
502 hres = jsdisp_propget(attr_obj, id, &v);
503 if(FAILED(hres))
504 return hres;
505 hres = to_boolean(v, &b);
507 if(FAILED(hres))
508 return hres;
509 if(b)
510 desc->flags |= PROPF_ENUMERABLE;
511 }else if(hres != DISP_E_UNKNOWNNAME) {
512 return hres;
513 }
514
515 hres = jsdisp_get_id(attr_obj, L"configurable", 0, &id);
516 if(SUCCEEDED(hres)) {
517 desc->mask |= PROPF_CONFIGURABLE;
518 hres = jsdisp_propget(attr_obj, id, &v);
519 if(FAILED(hres))
520 return hres;
521 hres = to_boolean(v, &b);
523 if(FAILED(hres))
524 return hres;
525 if(b)
526 desc->flags |= PROPF_CONFIGURABLE;
527 }else if(hres != DISP_E_UNKNOWNNAME) {
528 return hres;
529 }
530
531 hres = jsdisp_get_id(attr_obj, L"value", 0, &id);
532 if(SUCCEEDED(hres)) {
533 hres = jsdisp_propget(attr_obj, id, &desc->value);
534 if(FAILED(hres))
535 return hres;
536 desc->explicit_value = TRUE;
537 }else if(hres != DISP_E_UNKNOWNNAME) {
538 return hres;
539 }
540
541 hres = jsdisp_get_id(attr_obj, L"writable", 0, &id);
542 if(SUCCEEDED(hres)) {
543 desc->mask |= PROPF_WRITABLE;
544 hres = jsdisp_propget(attr_obj, id, &v);
545 if(SUCCEEDED(hres)) {
546 hres = to_boolean(v, &b);
548 if(SUCCEEDED(hres) && b)
549 desc->flags |= PROPF_WRITABLE;
550 }
551 }else if(hres == DISP_E_UNKNOWNNAME) {
552 hres = S_OK;
553 }
554 if(FAILED(hres)) {
556 return hres;
557 }
558
559 hres = jsdisp_get_id(attr_obj, L"get", 0, &id);
560 if(SUCCEEDED(hres)) {
561 desc->explicit_getter = TRUE;
562 hres = jsdisp_propget(attr_obj, id, &v);
563 if(SUCCEEDED(hres) && !is_undefined(v)) {
564 if(!is_object_instance(v)) {
565 FIXME("getter is not an object\n");
567 hres = E_FAIL;
568 }else {
569 /* FIXME: Check IsCallable */
570 desc->getter = to_jsdisp(get_object(v));
571 if(!desc->getter)
572 FIXME("getter is not JS object\n");
573 }
574 }
575 }else if(hres == DISP_E_UNKNOWNNAME) {
576 hres = S_OK;
577 }
578 if(FAILED(hres)) {
580 return hres;
581 }
582
583 hres = jsdisp_get_id(attr_obj, L"set", 0, &id);
584 if(SUCCEEDED(hres)) {
585 desc->explicit_setter = TRUE;
586 hres = jsdisp_propget(attr_obj, id, &v);
587 if(SUCCEEDED(hres) && !is_undefined(v)) {
588 if(!is_object_instance(v)) {
589 FIXME("setter is not an object\n");
591 hres = E_FAIL;
592 }else {
593 /* FIXME: Check IsCallable */
594 desc->setter = to_jsdisp(get_object(v));
595 if(!desc->setter)
596 FIXME("setter is not JS object\n");
597 }
598 }
599 }else if(hres == DISP_E_UNKNOWNNAME) {
600 hres = S_OK;
601 }
602 if(FAILED(hres)) {
604 return hres;
605 }
606
607 if(desc->explicit_getter || desc->explicit_setter) {
608 if(desc->explicit_value)
610 else if(desc->mask & PROPF_WRITABLE)
612 }
613
614 if(FAILED(hres))
616 return hres;
617}
618
620{
621 DISPID id = DISPID_STARTENUM;
622 property_desc_t prop_desc;
623 IDispatch *list_disp;
624 jsdisp_t *list_obj, *desc_obj;
625 jsval_t desc_val;
626 BSTR name;
628
629 hres = to_object(ctx, list_val, &list_disp);
630 if(FAILED(hres))
631 return hres;
632
633 if(!(list_obj = to_jsdisp(list_disp))) {
634 FIXME("non-JS list obj\n");
635 IDispatch_Release(list_disp);
636 return E_NOTIMPL;
637 }
638
639 while(1) {
641 if(hres != S_OK)
642 break;
643
644 hres = jsdisp_propget(list_obj, id, &desc_val);
645 if(FAILED(hres))
646 break;
647
648 if(!is_object_instance(desc_val) || !(desc_obj = to_jsdisp(get_object(desc_val)))) {
649 jsval_release(desc_val);
650 break;
651 }
652
653 hres = to_property_descriptor(ctx, desc_obj, &prop_desc);
654 jsdisp_release(desc_obj);
655 if(FAILED(hres))
656 break;
657
658 hres = IDispatchEx_GetMemberName(to_dispex(list_obj), id, &name);
659 if(SUCCEEDED(hres))
660 hres = jsdisp_define_property(obj, name, &prop_desc);
661 release_property_descriptor(&prop_desc);
662 if(FAILED(hres))
663 break;
664 }
665
666 jsdisp_release(list_obj);
667 return FAILED(hres) ? hres : S_OK;
668}
669
671 unsigned argc, jsval_t *argv, jsval_t *r)
672{
673 property_desc_t prop_desc;
674 jsdisp_t *obj, *attr_obj;
675 const WCHAR *name;
676 jsstr_t *name_str;
678
679 TRACE("\n");
680
681 if(argc < 1 || !is_object_instance(argv[0]))
684 if(!obj) {
685 FIXME("not implemented non-JS object\n");
686 return E_NOTIMPL;
687 }
688
689 hres = to_flat_string(ctx, argc >= 2 ? argv[1] : jsval_undefined(), &name_str, &name);
690 if(FAILED(hres))
691 return hres;
692
693 if(argc >= 3 && is_object_instance(argv[2])) {
694 attr_obj = to_jsdisp(get_object(argv[2]));
695 if(attr_obj) {
696 hres = to_property_descriptor(ctx, attr_obj, &prop_desc);
697 }else {
698 FIXME("not implemented non-JS object\n");
699 hres = E_NOTIMPL;
700 }
701 }else {
703 }
704
705 if(FAILED(hres))
706 {
707 jsstr_release(name_str);
708 return hres;
709 }
710
711 hres = jsdisp_define_property(obj, name, &prop_desc);
712 jsstr_release(name_str);
713 release_property_descriptor(&prop_desc);
714 if(SUCCEEDED(hres) && r)
716 return hres;
717}
718
720 unsigned argc, jsval_t *argv, jsval_t *r)
721{
722 jsdisp_t *obj;
724
725 if(argc < 1 || !is_object_instance(argv[0]) || !(obj = to_jsdisp(get_object(argv[0])))) {
726 FIXME("not an object\n");
727 return E_NOTIMPL;
728 }
729
730 TRACE("%p\n", obj);
731
733 if(SUCCEEDED(hres) && r)
735 return hres;
736}
737
739 unsigned argc, jsval_t *argv, jsval_t *r)
740{
741 property_desc_t prop_desc;
742 jsdisp_t *obj, *desc_obj;
743 const WCHAR *name;
744 jsstr_t *name_str;
746
747 TRACE("\n");
748
749 if(argc < 1 || !is_object_instance(argv[0]))
752 if(!obj) {
753 FIXME("not implemented non-JS object\n");
754 return E_NOTIMPL;
755 }
756
757 hres = to_flat_string(ctx, argc >= 2 ? argv[1] : jsval_undefined(), &name_str, &name);
758 if(FAILED(hres))
759 return hres;
760
761 hres = jsdisp_get_own_property(obj, name, FALSE, &prop_desc);
762 jsstr_release(name_str);
763 if(hres == DISP_E_UNKNOWNNAME) {
764 if(r) *r = jsval_undefined();
765 return S_OK;
766 }
767 if(FAILED(hres))
768 return hres;
769
770 hres = create_object(ctx, NULL, &desc_obj);
771 if(FAILED(hres))
772 return hres;
773
774 if(prop_desc.explicit_getter || prop_desc.explicit_setter) {
776 prop_desc.getter ? jsval_obj(prop_desc.getter) : jsval_undefined());
777 if(SUCCEEDED(hres))
779 prop_desc.setter ? jsval_obj(prop_desc.setter) : jsval_undefined());
780 }else {
781 hres = jsdisp_propput_name(desc_obj, L"value", prop_desc.value);
782 if(SUCCEEDED(hres))
783 hres = jsdisp_define_data_property(desc_obj, L"writable", PROPF_ALL,
784 jsval_bool(!!(prop_desc.flags & PROPF_WRITABLE)));
785 }
786 if(SUCCEEDED(hres))
787 hres = jsdisp_define_data_property(desc_obj, L"enumerable", PROPF_ALL,
788 jsval_bool(!!(prop_desc.flags & PROPF_ENUMERABLE)));
789 if(SUCCEEDED(hres))
790 hres = jsdisp_define_data_property(desc_obj, L"configurable", PROPF_ALL,
791 jsval_bool(!!(prop_desc.flags & PROPF_CONFIGURABLE)));
792
793 release_property_descriptor(&prop_desc);
794 if(SUCCEEDED(hres) && r)
795 *r = jsval_obj(desc_obj);
796 else
797 jsdisp_release(desc_obj);
798 return hres;
799}
800
802 unsigned argc, jsval_t *argv, jsval_t *r)
803{
804 jsdisp_t *proto = NULL, *obj;
806
807 if(!argc || (!is_object_instance(argv[0]) && !is_null(argv[0]))) {
808 FIXME("Invalid arg\n");
809 return E_INVALIDARG;
810 }
811
812 TRACE("(%s)\n", debugstr_jsval(argv[0]));
813
814 if(argc && is_object_instance(argv[0])) {
815 if(get_object(argv[0]))
817 if(!proto) {
818 FIXME("Non-JS prototype\n");
819 return E_NOTIMPL;
820 }
821 }else if(!is_null(argv[0])) {
822 FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined()));
823 return E_INVALIDARG;
824 }
825
827 if(FAILED(hres))
828 return hres;
829
830 if(argc >= 2 && !is_undefined(argv[1]))
832
833 if(SUCCEEDED(hres) && r)
834 *r = jsval_obj(obj);
835 else
837 return hres;
838}
839
841 unsigned argc, jsval_t *argv, jsval_t *r)
842{
843 jsdisp_t *obj;
844
845 if(!argc || !is_object_instance(argv[0]))
847
848 TRACE("(%s)\n", debugstr_jsval(argv[0]));
849
851 if(r)
852 *r = obj && obj->prototype
853 ? jsval_obj(jsdisp_addref(obj->prototype))
854 : jsval_null();
855 return S_OK;
856}
857
859{
860 DISPID id = DISPID_STARTENUM;
861 jsdisp_t *obj, *array;
862 unsigned i = 0;
863 jsstr_t *key;
865
868
870 if(!obj) {
871 FIXME("Non-JS object\n");
872 return E_NOTIMPL;
873 }
874
875 hres = create_array(ctx, 0, &array);
876 if(FAILED(hres))
877 return hres;
878
879 do {
880 hres = jsdisp_next_prop(obj, id, enum_type, &id);
881 if(hres != S_OK)
882 break;
883
885 if(FAILED(hres))
886 break;
887
890 } while(hres == S_OK);
891
892 if(SUCCEEDED(hres) && r)
893 *r = jsval_obj(array);
894 else
896 return hres;
897}
898
900 unsigned argc, jsval_t *argv, jsval_t *r)
901{
903
904 TRACE("(%s)\n", debugstr_jsval(arg));
905
907}
908
910 unsigned argc, jsval_t *argv, jsval_t *r)
911{
913
914 TRACE("(%s)\n", debugstr_jsval(arg));
915
917}
918
920{
921 jsdisp_t *obj;
922
923 if(!argc || !is_object_instance(argv[0]))
925
926 TRACE("(%s)\n", debugstr_jsval(argv[0]));
927
929 if(!obj) {
930 FIXME("Non-JS object\n");
931 return E_NOTIMPL;
932 }
933
934 obj->extensible = FALSE;
935 if(r) *r = jsval_obj(jsdisp_addref(obj));
936 return S_OK;
937}
938
941{
942 jsdisp_t *obj;
943
944 if(!argc || !is_object_instance(argv[0])) {
945 WARN("argument is not an object\n");
947 }
948
949 TRACE("(%s)\n", debugstr_jsval(argv[0]));
950
952 if(!obj) {
953 FIXME("Non-JS object\n");
954 return E_NOTIMPL;
955 }
956
958 if(r) *r = jsval_obj(jsdisp_addref(obj));
959 return S_OK;
960}
961
964{
965 jsdisp_t *obj;
966
967 if(!argc || !is_object_instance(argv[0])) {
968 WARN("argument is not an object\n");
970 }
971
972 TRACE("(%s)\n", debugstr_jsval(argv[0]));
973
975 if(!obj) {
976 FIXME("Non-JS object\n");
977 return E_NOTIMPL;
978 }
979
981 if(r) *r = jsval_obj(jsdisp_addref(obj));
982 return S_OK;
983}
984
986{
987 jsdisp_t *obj;
988
989 if(!argc || !is_object_instance(argv[0])) {
990 WARN("argument is not an object\n");
992 }
993
994 TRACE("(%s)\n", debugstr_jsval(argv[0]));
995
997 if(!obj) {
998 FIXME("Non-JS object\n");
999 return E_NOTIMPL;
1000 }
1001
1002 if(r) *r = jsval_bool(obj->extensible);
1003 return S_OK;
1004}
1005
1007 jsval_t *argv, jsval_t *r)
1008{
1009 jsdisp_t *obj;
1010
1011 if(!argc || !is_object_instance(argv[0])) {
1012 WARN("argument is not an object\n");
1013 return JS_E_OBJECT_EXPECTED;
1014 }
1015
1016 TRACE("(%s)\n", debugstr_jsval(argv[0]));
1017
1019 if(!obj) {
1020 FIXME("Non-JS object\n");
1021 return E_NOTIMPL;
1022 }
1023
1025 return S_OK;
1026}
1027
1029 jsval_t *argv, jsval_t *r)
1030{
1031 jsdisp_t *obj;
1032
1033 if(!argc || !is_object_instance(argv[0])) {
1034 WARN("argument is not an object\n");
1035 return JS_E_OBJECT_EXPECTED;
1036 }
1037
1038 TRACE("(%s)\n", debugstr_jsval(argv[0]));
1039
1041 if(!obj) {
1042 FIXME("Non-JS object\n");
1043 return E_NOTIMPL;
1044 }
1045
1047 return S_OK;
1048}
1049
1051 {L"create", Object_create, PROPF_ES5|PROPF_METHOD|2},
1052 {L"defineProperties", Object_defineProperties, PROPF_ES5|PROPF_METHOD|2},
1053 {L"defineProperty", Object_defineProperty, PROPF_ES5|PROPF_METHOD|2},
1054 {L"freeze", Object_freeze, PROPF_ES5|PROPF_METHOD|1},
1055 {L"getOwnPropertyDescriptor", Object_getOwnPropertyDescriptor, PROPF_ES5|PROPF_METHOD|2},
1056 {L"getOwnPropertyNames", Object_getOwnPropertyNames, PROPF_ES5|PROPF_METHOD|1},
1057 {L"getPrototypeOf", Object_getPrototypeOf, PROPF_ES5|PROPF_METHOD|1},
1058 {L"isExtensible", Object_isExtensible, PROPF_ES5|PROPF_METHOD|1},
1059 {L"isFrozen", Object_isFrozen, PROPF_ES5|PROPF_METHOD|1},
1060 {L"isSealed", Object_isSealed, PROPF_ES5|PROPF_METHOD|1},
1061 {L"keys", Object_keys, PROPF_ES5|PROPF_METHOD|1},
1062 {L"preventExtensions", Object_preventExtensions, PROPF_ES5|PROPF_METHOD|1},
1063 {L"seal", Object_seal, PROPF_ES5|PROPF_METHOD|1},
1064};
1065
1068 .call = Function_value,
1069 .props_cnt = ARRAY_SIZE(ObjectConstr_props),
1070 .props = ObjectConstr_props,
1071};
1072
1074 jsval_t *r)
1075{
1076 HRESULT hres;
1077
1078 TRACE("\n");
1079
1080 switch(flags) {
1081 case DISPATCH_METHOD:
1082 case DISPATCH_CONSTRUCT: {
1083 jsdisp_t *obj;
1084
1085 if(argc) {
1086 if(!is_undefined(argv[0]) && !is_null(argv[0])) {
1087 IDispatch *disp;
1088
1089 hres = to_object(ctx, argv[0], &disp);
1090 if(FAILED(hres))
1091 return hres;
1092
1093 if(r)
1094 *r = jsval_disp(disp);
1095 else
1096 IDispatch_Release(disp);
1097 return S_OK;
1098 }
1099 }
1100
1102 if(FAILED(hres))
1103 return hres;
1104
1105 if(r)
1106 *r = jsval_obj(obj);
1107 else
1109 break;
1110 }
1111
1112 default:
1113 FIXME("unimplemented flags: %x\n", flags);
1114 return E_NOTIMPL;
1115 }
1116
1117 return S_OK;
1118}
1119
1121{
1123 object_prototype, ret);
1124}
1125
1127{
1128 return create_dispex(ctx, &Object_info, NULL, ret);
1129}
1130
1132{
1134 HRESULT hres;
1135
1136 object = calloc(1, sizeof(jsdisp_t));
1137 if(!object)
1138 return E_OUTOFMEMORY;
1139
1140 hres = init_dispex_from_constr(object, ctx, &ObjectInst_info, constr ? constr : ctx->object_constr);
1141 if(FAILED(hres)) {
1142 free(object);
1143 return hres;
1144 }
1145
1146 *ret = object;
1147 return S_OK;
1148}
HRESULT create_array(script_ctx_t *ctx, DWORD length, jsdisp_t **ret)
Definition: array.c:1780
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
OLECHAR * BSTR
Definition: compat.h:2293
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 Function_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:600
static HRESULT Object_isFrozen(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:1006
static HRESULT Object_keys(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:899
static HRESULT Object_preventExtensions(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:919
static HRESULT Object_defineSetter(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:350
static HRESULT Object_getOwnPropertyNames(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:909
static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:275
static const builtin_prop_t Object_props[]
Definition: object.c:458
HRESULT Object_get_proto_(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:393
static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:230
static const builtin_info_t Object_info
Definition: object.c:469
static HRESULT ObjectConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:1073
static const builtin_prop_t ObjectConstr_props[]
Definition: object.c:1050
HRESULT create_object(script_ctx_t *ctx, jsdisp_t *constr, jsdisp_t **ret)
Definition: object.c:1131
HRESULT create_object_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
Definition: object.c:1120
HRESULT create_object_prototype(script_ctx_t *ctx, jsdisp_t **ret)
Definition: object.c:1126
static HRESULT Object_getPrototypeOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:840
static HRESULT Object_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:27
static HRESULT Object_toLocaleString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:107
static HRESULT Object_defineGetter(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:307
static HRESULT Object_freeze(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:939
static HRESULT Object_defineProperty(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:670
static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:156
static HRESULT Object_defineProperties(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:719
static HRESULT Object_seal(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:962
static const builtin_info_t ObjectConstr_info
Definition: object.c:1066
static HRESULT Object_valueOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:132
static const builtin_info_t ObjectInst_info
Definition: object.c:475
static HRESULT Object_isExtensible(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:985
static HRESULT jsdisp_define_properties(script_ctx_t *ctx, jsdisp_t *obj, jsval_t list_val)
Definition: object.c:619
static HRESULT Object_isSealed(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:1028
static void release_property_descriptor(property_desc_t *desc)
Definition: object.c:479
static HRESULT Object_getOwnPropertyDescriptor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:738
HRESULT Object_set_proto_(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:422
static HRESULT object_keys(script_ctx_t *ctx, jsval_t arg, enum jsdisp_enum_type enum_type, jsval_t *r)
Definition: object.c:858
static HRESULT to_property_descriptor(script_ctx_t *ctx, jsdisp_t *attr_obj, property_desc_t *desc)
Definition: object.c:489
static HRESULT Object_create(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:801
MonoAssembly int argc
Definition: metahost.c:107
#define assert(_expr)
Definition: assert.h:32
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
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
GLuint GLuint * names
Definition: glext.h:11545
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLbitfield flags
Definition: glext.h:7161
GLuint id
Definition: glext.h:5910
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static HRESULT to_string(VARIANT *src, BSTR *dst)
Definition: host.c:46
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT jsdisp_get_own_property(jsdisp_t *obj, const WCHAR *name, BOOL flags_only, property_desc_t *desc)
Definition: dispex.c:3171
HRESULT jsdisp_define_data_property(jsdisp_t *obj, const WCHAR *name, unsigned flags, jsval_t value)
Definition: dispex.c:3349
HRESULT jsdisp_propput_name(jsdisp_t *obj, const WCHAR *name, jsval_t val)
Definition: dispex.c:2859
HRESULT jsdisp_get_id(jsdisp_t *jsdisp, const WCHAR *name, DWORD flags, DISPID *id)
Definition: dispex.c:2550
HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *constr)
Definition: dispex.c:2512
HRESULT jsdisp_get_prop_name(jsdisp_t *obj, DISPID id, jsstr_t **r)
Definition: dispex.c:3429
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
void jsdisp_freeze(jsdisp_t *obj, BOOL seal)
Definition: dispex.c:3393
HRESULT jsdisp_propput_idx(jsdisp_t *obj, DWORD idx, jsval_t val)
Definition: dispex.c:2864
jsdisp_t * jsdisp_addref(jsdisp_t *obj)
Definition: dispex.c:1902
HRESULT jsdisp_call_name(jsdisp_t *disp, const WCHAR *name, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: dispex.c:2615
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
HRESULT jsdisp_define_property(jsdisp_t *obj, const WCHAR *name, property_desc_t *desc)
Definition: dispex.c:3216
HRESULT jsdisp_change_prototype(jsdisp_t *obj, jsdisp_t *proto)
Definition: dispex.c:3356
HRESULT jsdisp_propget(jsdisp_t *jsdisp, DISPID id, jsval_t *val)
Definition: dispex.c:2983
HRESULT jsdisp_next_prop(jsdisp_t *obj, DISPID id, enum jsdisp_enum_type enum_type, DISPID *ret)
Definition: dispex.c:3073
BOOL jsdisp_is_frozen(jsdisp_t *obj, BOOL sealed)
Definition: dispex.c:3408
HRESULT to_flat_string(script_ctx_t *, jsval_t, jsstr_t **, const WCHAR **)
Definition: jsutils.c:846
#define PROPF_ES5
Definition: jscript.h:90
#define JS_E_OBJECT_EXPECTED
Definition: jscript.h:555
#define PROPF_ES6
Definition: jscript.h:91
#define SCRIPTLANGUAGEVERSION_ES5
Definition: jscript.h:53
#define JS_E_FUNCTION_EXPECTED
Definition: jscript.h:552
#define PROPF_ALL
Definition: jscript.h:84
jsdisp_enum_type
Definition: jscript.h:239
@ JSDISP_ENUM_OWN_ENUMERABLE
Definition: jscript.h:242
@ JSDISP_ENUM_OWN
Definition: jscript.h:241
#define JS_E_INVALID_WRITABLE_PROP_DESC
Definition: jscript.h:586
const char * debugstr_jsval(const jsval_t)
Definition: jsutils.c:35
static DWORD make_grfdex(script_ctx_t *ctx, DWORD flags)
Definition: jscript.h:513
HRESULT to_object(script_ctx_t *, jsval_t, IDispatch **)
Definition: jsutils.c:864
static IDispatchEx * to_dispex(jsdisp_t *jsdisp)
Definition: jscript.h:227
@ JSCLASS_FUNCTION
Definition: jscript.h:109
@ JSCLASS_OBJECT
Definition: jscript.h:113
@ JSCLASS_NONE
Definition: jscript.h:103
HRESULT to_boolean(jsval_t, BOOL *)
Definition: jsutils.c:489
#define JS_E_PROP_DESC_MISMATCH
Definition: jscript.h:585
const unsigned int PROPF_WRITABLE
Definition: jsdisp.idl:37
const unsigned int PROPF_ENUMERABLE
Definition: jsdisp.idl:36
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
static const WCHAR * jsstr_flatten(jsstr_t *str)
Definition: jsstr.h:136
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
static unsigned jsstr_length(jsstr_t *str)
Definition: jsstr.h:55
static unsigned jsstr_flush(jsstr_t *str, WCHAR *buf)
Definition: jsstr.h:145
static jsstr_t * jsstr_alloc(const WCHAR *str)
Definition: jsstr.h:100
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225
void jsval_release(jsval_t val)
Definition: jsutils.c:186
static jsval_t jsval_null(void)
Definition: jsval.h:130
static jsval_t jsval_string(jsstr_t *str)
Definition: jsval.h:109
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 BOOL is_null_disp(jsval_t v)
Definition: jsval.h:190
static jsval_t jsval_null_disp(void)
Definition: jsval.h:138
static BOOL is_undefined(jsval_t v)
Definition: jsval.h:180
static jsval_t jsval_disp(IDispatch *obj)
Definition: jsval.h:117
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
static BOOL is_null(jsval_t v)
Definition: jsval.h:185
#define b
Definition: ke_i.h:79
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1204
HRESULT hres
Definition: protocol.c:465
static VARIANTARG static DISPID
Definition: ordinal.c:49
#define argv
Definition: mplay32.c:18
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define DISPATCH_METHOD
Definition: oleauto.h:1006
short WCHAR
Definition: pedump.c:58
#define IID_NULL
Definition: guiddef.h:98
#define calloc
Definition: rosglue.h:14
const WCHAR * str
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
Definition: jsstr.h:36
Definition: jsval.h:54
BOOL explicit_setter
Definition: jscript.h:369
jsdisp_t * setter
Definition: jscript.h:370
unsigned flags
Definition: jscript.h:363
BOOL explicit_getter
Definition: jscript.h:367
jsdisp_t * getter
Definition: jscript.h:368
jsval_t value
Definition: jscript.h:366
Definition: undname.c:54
HRESULT(* to_string)(jsdisp_t *, jsstr_t **)
Definition: jscript.h:197
jsclass_t class
Definition: jscript.h:183
const builtin_info_t * builtin_info
Definition: jscript.h:218
jsdisp_t * prototype
Definition: jscript.h:216
Definition: copy.c:22
Definition: name.c:39
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618