ReactOS 0.4.17-dev-357-ga8f14ff
object.c File Reference
#include <assert.h>
#include "jscript.h"
#include "wine/debug.h"
Include dependency graph for object.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (jscript)
 
static HRESULT Object_toString (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_toLocaleString (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_valueOf (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_hasOwnProperty (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_propertyIsEnumerable (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_isPrototypeOf (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_defineGetter (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_defineSetter (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
HRESULT Object_get_proto_ (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
HRESULT Object_set_proto_ (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static void release_property_descriptor (property_desc_t *desc)
 
static HRESULT to_property_descriptor (script_ctx_t *ctx, jsdisp_t *attr_obj, property_desc_t *desc)
 
static HRESULT jsdisp_define_properties (script_ctx_t *ctx, jsdisp_t *obj, jsval_t list_val)
 
static HRESULT Object_defineProperty (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_defineProperties (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_getOwnPropertyDescriptor (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_create (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_getPrototypeOf (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT object_keys (script_ctx_t *ctx, jsval_t arg, enum jsdisp_enum_type enum_type, jsval_t *r)
 
static HRESULT Object_keys (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_getOwnPropertyNames (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_preventExtensions (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_freeze (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_seal (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_isExtensible (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_isFrozen (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Object_isSealed (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT ObjectConstr_value (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
HRESULT create_object_constr (script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
 
HRESULT create_object_prototype (script_ctx_t *ctx, jsdisp_t **ret)
 
HRESULT create_object (script_ctx_t *ctx, jsdisp_t *constr, jsdisp_t **ret)
 

Variables

static const builtin_prop_t Object_props []
 
static const builtin_info_t Object_info
 
static const builtin_info_t ObjectInst_info
 
static const builtin_prop_t ObjectConstr_props []
 
static const builtin_info_t ObjectConstr_info
 

Function Documentation

◆ create_object()

HRESULT create_object ( script_ctx_t ctx,
jsdisp_t constr,
jsdisp_t **  ret 
)

Definition at line 1131 of file object.c.

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}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
static const builtin_info_t ObjectInst_info
Definition: object.c:475
return ret
Definition: mutex.c:146
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
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 hres
Definition: protocol.c:465
#define calloc
Definition: rosglue.h:14

Referenced by create_activex_constr(), d3drm3_CreateObject(), interp_new_obj(), InterpretedFunction_call(), InterpretedFunction_get_prototype(), JSON_parse(), JSON_stringify(), Object_getOwnPropertyDescriptor(), ObjectConstr_value(), and parse_json_value().

◆ create_object_constr()

HRESULT create_object_constr ( script_ctx_t ctx,
jsdisp_t object_prototype,
jsdisp_t **  ret 
)

Definition at line 1120 of file object.c.

1121{
1123 object_prototype, ret);
1124}
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
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_info_t ObjectConstr_info
Definition: object.c:1066
#define L(x)
Definition: resources.c:13
const unsigned int PROPF_CONSTR
Definition: jsdisp.idl:34

Referenced by init_constructors().

◆ create_object_prototype()

HRESULT create_object_prototype ( script_ctx_t ctx,
jsdisp_t **  ret 
)

Definition at line 1126 of file object.c.

1127{
1128 return create_dispex(ctx, &Object_info, NULL, ret);
1129}
#define NULL
Definition: types.h:112
static const builtin_info_t Object_info
Definition: object.c:469
HRESULT create_dispex(script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype, jsdisp_t **dispex)
Definition: dispex.c:2493

Referenced by init_global().

◆ jsdisp_define_properties()

static HRESULT jsdisp_define_properties ( script_ctx_t ctx,
jsdisp_t obj,
jsval_t  list_val 
)
static

Definition at line 619 of file object.c.

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}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
OLECHAR * BSTR
Definition: compat.h:2293
static void release_property_descriptor(property_desc_t *desc)
Definition: object.c:479
static HRESULT to_property_descriptor(script_ctx_t *ctx, jsdisp_t *attr_obj, property_desc_t *desc)
Definition: object.c:489
#define SUCCEEDED(hr)
Definition: intsafe.h:50
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
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_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
@ JSDISP_ENUM_OWN_ENUMERABLE
Definition: jscript.h:242
HRESULT to_object(script_ctx_t *, jsval_t, IDispatch **)
Definition: jsutils.c:864
static IDispatchEx * to_dispex(jsdisp_t *jsdisp)
Definition: jscript.h:227
void jsval_release(jsval_t val)
Definition: jsutils.c:186
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
static VARIANTARG static DISPID
Definition: ordinal.c:49
Definition: jsval.h:54
Definition: name.c:39

Referenced by Object_create(), and Object_defineProperties().

◆ Object_create()

static HRESULT Object_create ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 801 of file object.c.

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}
#define E_INVALIDARG
Definition: ddrawi.h:101
static HRESULT jsdisp_define_properties(script_ctx_t *ctx, jsdisp_t *obj, jsval_t list_val)
Definition: object.c:619
MonoAssembly int argc
Definition: metahost.c:107
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
const char * debugstr_jsval(const jsval_t)
Definition: jsutils.c:35
static jsval_t jsval_undefined(void)
Definition: jsval.h:146
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
static BOOL is_undefined(jsval_t v)
Definition: jsval.h:180
static BOOL is_null(jsval_t v)
Definition: jsval.h:185
#define argv
Definition: mplay32.c:18
#define TRACE(s)
Definition: solgame.cpp:4

◆ Object_defineGetter()

static HRESULT Object_defineGetter ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 307 of file object.c.

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}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HRESULT to_flat_string(script_ctx_t *, jsval_t, jsstr_t **, const WCHAR **)
Definition: jsutils.c:846
#define JS_E_FUNCTION_EXPECTED
Definition: jscript.h:552
const unsigned int PROPF_ENUMERABLE
Definition: jsdisp.idl:36
const unsigned int PROPF_CONFIGURABLE
Definition: jsdisp.idl:38
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1204
short WCHAR
Definition: pedump.c:58
Definition: jsstr.h:36

◆ Object_defineProperties()

static HRESULT Object_defineProperties ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 719 of file object.c.

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}
jsdisp_t * jsdisp_addref(jsdisp_t *obj)
Definition: dispex.c:1902

◆ Object_defineProperty()

static HRESULT Object_defineProperty ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 670 of file object.c.

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}
#define JS_E_OBJECT_EXPECTED
Definition: jscript.h:555

◆ Object_defineSetter()

static HRESULT Object_defineSetter ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 350 of file object.c.

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}

◆ Object_freeze()

static HRESULT Object_freeze ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 939 of file object.c.

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}
#define WARN(fmt,...)
Definition: precomp.h:61
void jsdisp_freeze(jsdisp_t *obj, BOOL seal)
Definition: dispex.c:3393

◆ Object_get_proto_()

HRESULT Object_get_proto_ ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)

Definition at line 393 of file object.c.

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}
#define E_FAIL
Definition: ddrawi.h:102
static jsval_t jsval_null(void)
Definition: jsval.h:130
jsdisp_t * prototype
Definition: jscript.h:216

Referenced by init_object_prototype_accessors().

◆ Object_getOwnPropertyDescriptor()

static HRESULT Object_getOwnPropertyDescriptor ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 738 of file object.c.

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}
HRESULT create_object(script_ctx_t *ctx, jsdisp_t *constr, jsdisp_t **ret)
Definition: object.c:1131
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
#define PROPF_ALL
Definition: jscript.h:84
const unsigned int PROPF_WRITABLE
Definition: jsdisp.idl:37
static jsval_t jsval_bool(BOOL b)
Definition: jsval.h:101
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
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618

◆ Object_getOwnPropertyNames()

static HRESULT Object_getOwnPropertyNames ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 909 of file object.c.

911{
913
914 TRACE("(%s)\n", debugstr_jsval(arg));
915
917}
static HRESULT object_keys(script_ctx_t *ctx, jsval_t arg, enum jsdisp_enum_type enum_type, jsval_t *r)
Definition: object.c:858
@ JSDISP_ENUM_OWN
Definition: jscript.h:241

◆ Object_getPrototypeOf()

static HRESULT Object_getPrototypeOf ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 840 of file object.c.

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}

◆ Object_hasOwnProperty()

static HRESULT Object_hasOwnProperty ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 156 of file object.c.

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}
GLuint id
Definition: glext.h:5910
static HRESULT to_string(VARIANT *src, BSTR *dst)
Definition: host.c:46
static DWORD make_grfdex(script_ctx_t *ctx, DWORD flags)
Definition: jscript.h:513
static const WCHAR * jsstr_flatten(jsstr_t *str)
Definition: jsstr.h:136
static unsigned jsstr_length(jsstr_t *str)
Definition: jsstr.h:55
static unsigned jsstr_flush(jsstr_t *str, WCHAR *buf)
Definition: jsstr.h:145
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 IID_NULL
Definition: guiddef.h:98

◆ Object_isExtensible()

static HRESULT Object_isExtensible ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 985 of file object.c.

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}

◆ Object_isFrozen()

static HRESULT Object_isFrozen ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 1006 of file object.c.

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}
BOOL jsdisp_is_frozen(jsdisp_t *obj, BOOL sealed)
Definition: dispex.c:3408

◆ Object_isPrototypeOf()

static HRESULT Object_isPrototypeOf ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 275 of file object.c.

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}
unsigned int BOOL
Definition: ntddk_ex.h:94

◆ Object_isSealed()

static HRESULT Object_isSealed ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 1028 of file object.c.

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}

◆ object_keys()

static HRESULT object_keys ( script_ctx_t ctx,
jsval_t  arg,
enum jsdisp_enum_type  enum_type,
jsval_t r 
)
static

Definition at line 858 of file object.c.

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}
HRESULT create_array(script_ctx_t *ctx, DWORD length, jsdisp_t **ret)
Definition: array.c:1780
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
HRESULT jsdisp_get_prop_name(jsdisp_t *obj, DISPID id, jsstr_t **r)
Definition: dispex.c:3429
HRESULT jsdisp_propput_idx(jsdisp_t *obj, DWORD idx, jsval_t val)
Definition: dispex.c:2864
static jsval_t jsval_string(jsstr_t *str)
Definition: jsval.h:109
Definition: undname.c:54
Definition: copy.c:22

Referenced by Object_getOwnPropertyNames(), and Object_keys().

◆ Object_keys()

static HRESULT Object_keys ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 899 of file object.c.

901{
903
904 TRACE("(%s)\n", debugstr_jsval(arg));
905
907}

◆ Object_preventExtensions()

static HRESULT Object_preventExtensions ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 919 of file object.c.

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}

◆ Object_propertyIsEnumerable()

static HRESULT Object_propertyIsEnumerable ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 230 of file object.c.

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}

◆ Object_seal()

static HRESULT Object_seal ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 962 of file object.c.

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}

◆ Object_set_proto_()

HRESULT Object_set_proto_ ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)

Definition at line 422 of file object.c.

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}
HRESULT jsdisp_change_prototype(jsdisp_t *obj, jsdisp_t *proto)
Definition: dispex.c:3356
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225

Referenced by init_object_prototype_accessors().

◆ Object_toLocaleString()

static HRESULT Object_toLocaleString ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 107 of file object.c.

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}
HRESULT jsdisp_call_name(jsdisp_t *disp, const WCHAR *name, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: dispex.c:2615
#define DISPATCH_METHOD
Definition: oleauto.h:1006

◆ Object_toString()

static HRESULT Object_toString ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 27 of file object.c.

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}
#define assert(_expr)
Definition: assert.h:32
GLuint GLuint * names
Definition: glext.h:11545
#define SCRIPTLANGUAGEVERSION_ES5
Definition: jscript.h:53
@ JSCLASS_NONE
Definition: jscript.h:103
static jsstr_t * jsstr_alloc(const WCHAR *str)
Definition: jsstr.h:100
const WCHAR * str
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

◆ Object_valueOf()

static HRESULT Object_valueOf ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 132 of file object.c.

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}
static BOOL is_null_disp(jsval_t v)
Definition: jsval.h:190
static jsval_t jsval_null_disp(void)
Definition: jsval.h:138
static jsval_t jsval_disp(IDispatch *obj)
Definition: jsval.h:117

◆ ObjectConstr_value()

static HRESULT ObjectConstr_value ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 1073 of file object.c.

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}
GLbitfield flags
Definition: glext.h:7161

Referenced by create_object_constr().

◆ release_property_descriptor()

static void release_property_descriptor ( property_desc_t desc)
static

Definition at line 479 of file object.c.

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}

Referenced by jsdisp_define_properties(), Object_defineProperty(), Object_getOwnPropertyDescriptor(), and to_property_descriptor().

◆ to_property_descriptor()

static HRESULT to_property_descriptor ( script_ctx_t ctx,
jsdisp_t attr_obj,
property_desc_t desc 
)
static

Definition at line 489 of file object.c.

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}
const GLdouble * v
Definition: gl.h:2040
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
HRESULT jsdisp_get_id(jsdisp_t *jsdisp, const WCHAR *name, DWORD flags, DISPID *id)
Definition: dispex.c:2550
#define JS_E_INVALID_WRITABLE_PROP_DESC
Definition: jscript.h:586
HRESULT to_boolean(jsval_t, BOOL *)
Definition: jsutils.c:489
#define JS_E_PROP_DESC_MISMATCH
Definition: jscript.h:585
#define b
Definition: ke_i.h:79
#define memset(x, y, z)
Definition: compat.h:39

Referenced by jsdisp_define_properties(), and Object_defineProperty().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( jscript  )

Variable Documentation

◆ Object_info

const builtin_info_t Object_info
static
Initial value:
= {
.class = JSCLASS_OBJECT,
.props_cnt = ARRAY_SIZE(Object_props),
.props = Object_props,
}
#define ARRAY_SIZE(A)
Definition: main.h:20
static const builtin_prop_t Object_props[]
Definition: object.c:458
@ JSCLASS_OBJECT
Definition: jscript.h:113

Definition at line 469 of file object.c.

Referenced by create_object_prototype().

◆ Object_props

const builtin_prop_t Object_props[]
static
Initial value:
= {
{L"__defineGetter__", Object_defineGetter, PROPF_METHOD|PROPF_ES6|2},
{L"__defineSetter__", Object_defineSetter, PROPF_METHOD|PROPF_ES6|2},
{L"hasOwnProperty", Object_hasOwnProperty, PROPF_METHOD|1},
{L"isPrototypeOf", Object_isPrototypeOf, PROPF_METHOD|1},
{L"propertyIsEnumerable", Object_propertyIsEnumerable, PROPF_METHOD|1},
{L"toLocaleString", Object_toLocaleString, PROPF_METHOD},
}
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_isPrototypeOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:275
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 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_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_valueOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:132
#define PROPF_ES6
Definition: jscript.h:91
const unsigned int PROPF_METHOD
Definition: jsdisp.idl:33

Definition at line 458 of file object.c.

◆ ObjectConstr_info

const builtin_info_t ObjectConstr_info
static
Initial value:
= {
.class = JSCLASS_FUNCTION,
.call = Function_value,
}
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 const builtin_prop_t ObjectConstr_props[]
Definition: object.c:1050
@ JSCLASS_FUNCTION
Definition: jscript.h:109

Definition at line 1066 of file object.c.

Referenced by create_object_constr().

◆ ObjectConstr_props

const builtin_prop_t ObjectConstr_props[]
static
Initial value:
= {
{L"getOwnPropertyDescriptor", Object_getOwnPropertyDescriptor, PROPF_ES5|PROPF_METHOD|2},
{L"getOwnPropertyNames", Object_getOwnPropertyNames, PROPF_ES5|PROPF_METHOD|1},
}
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_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_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_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_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 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 Object_isSealed(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: object.c:1028
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
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
#define PROPF_ES5
Definition: jscript.h:90

Definition at line 1050 of file object.c.

◆ ObjectInst_info

const builtin_info_t ObjectInst_info
static
Initial value:
= {
.class = JSCLASS_OBJECT,
}

Definition at line 475 of file object.c.

Referenced by create_object(), and Object_create().