From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/array.c | 3 + dlls/jscript/arraybuf.c | 6 ++ dlls/jscript/bool.c | 2 + dlls/jscript/date.c | 3 + dlls/jscript/dispex.c | 160 +++++++++++++++++++++----------------- dlls/jscript/engine.c | 3 +- dlls/jscript/enumerator.c | 3 + dlls/jscript/error.c | 2 + dlls/jscript/function.c | 5 ++ dlls/jscript/global.c | 1 + dlls/jscript/jscript.c | 2 +- dlls/jscript/jscript.h | 17 ++++ dlls/jscript/json.c | 1 + dlls/jscript/jsregexp.c | 3 + dlls/jscript/math.c | 1 + dlls/jscript/number.c | 2 + dlls/jscript/object.c | 3 + dlls/jscript/set.c | 6 ++ dlls/jscript/string.c | 3 + dlls/jscript/vbarray.c | 1 + 20 files changed, 153 insertions(+), 74 deletions(-)
diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c index dfd9eda75cc..64a945f9d84 100644 --- a/dlls/jscript/array.c +++ b/dlls/jscript/array.c @@ -1635,6 +1635,7 @@ static const builtin_prop_t Array_props[] = { };
static const builtin_info_t Array_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ARRAY, .props_cnt = ARRAY_SIZE(Array_props), .props = Array_props, @@ -1646,6 +1647,7 @@ static const builtin_prop_t ArrayInst_props[] = { };
static const builtin_info_t ArrayInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ARRAY, .props_cnt = ARRAY_SIZE(ArrayInst_props), .props = ArrayInst_props, @@ -1752,6 +1754,7 @@ static const builtin_prop_t ArrayConstr_props[] = { };
static const builtin_info_t ArrayConstr_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(ArrayConstr_props), diff --git a/dlls/jscript/arraybuf.c b/dlls/jscript/arraybuf.c index fc01773338f..c252dd27169 100644 --- a/dlls/jscript/arraybuf.c +++ b/dlls/jscript/arraybuf.c @@ -121,6 +121,7 @@ static const builtin_prop_t ArrayBuffer_props[] = { };
static const builtin_info_t ArrayBuffer_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ARRAYBUFFER, .props_cnt = ARRAY_SIZE(ArrayBuffer_props), .props = ArrayBuffer_props, @@ -131,6 +132,7 @@ static const builtin_prop_t ArrayBufferInst_props[] = { };
static const builtin_info_t ArrayBufferInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ARRAYBUFFER, .props_cnt = ARRAY_SIZE(ArrayBufferInst_props), .props = ArrayBufferInst_props, @@ -208,6 +210,7 @@ static const builtin_prop_t ArrayBufferConstr_props[] = { };
static const builtin_info_t ArrayBufferConstr_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(ArrayBufferConstr_props), @@ -601,6 +604,7 @@ static HRESULT DataView_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op o }
static const builtin_info_t DataView_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_DATAVIEW, .props_cnt = ARRAY_SIZE(DataView_props), .props = DataView_props, @@ -609,6 +613,7 @@ static const builtin_info_t DataView_info = { };
static const builtin_info_t DataViewInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_DATAVIEW, .destructor = DataView_destructor, .gc_traverse = DataView_gc_traverse @@ -680,6 +685,7 @@ static HRESULT DataViewConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags }
static const builtin_info_t DataViewConstr_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, }; diff --git a/dlls/jscript/bool.c b/dlls/jscript/bool.c index a4bbdec3a80..e8ddf653e82 100644 --- a/dlls/jscript/bool.c +++ b/dlls/jscript/bool.c @@ -119,6 +119,7 @@ static const builtin_prop_t Bool_props[] = { };
static const builtin_info_t Bool_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_BOOLEAN, .call = Bool_value, .props_cnt = ARRAY_SIZE(Bool_props), @@ -126,6 +127,7 @@ static const builtin_info_t Bool_info = { };
static const builtin_info_t BoolInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_BOOLEAN, .call = Bool_value, }; diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index d39b52177f6..87bb7b312ad 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -1900,12 +1900,14 @@ static const builtin_prop_t Date_props[] = { };
static const builtin_info_t Date_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_DATE, .props_cnt = ARRAY_SIZE(Date_props), .props = Date_props, };
static const builtin_info_t DateInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_DATE, };
@@ -2429,6 +2431,7 @@ static const builtin_prop_t DateConstr_props[] = { };
static const builtin_info_t DateConstr_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(DateConstr_props), diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index a678421f0a3..47d4ec2f8bd 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -60,6 +60,11 @@ struct _dispex_prop_t { int bucket_next; };
+static inline DWORD prop_id_to_idx(DISPID id) +{ + return id - 1; +} + static void fix_protref_prop(jsdisp_t *jsdisp, dispex_prop_t *prop) { DWORD ref; @@ -84,15 +89,17 @@ static inline DISPID prop_to_id(jsdisp_t *This, dispex_prop_t *prop) return prop - This->props + 1; }
-static inline dispex_prop_t *get_prop(jsdisp_t *This, DISPID id) +static inline BOOL is_dispid_prop(jsdisp_t *This, DISPID id) { - DWORD idx = id - 1; + DWORD idx = prop_id_to_idx(id);
if(idx >= This->prop_cnt) - return NULL; + return FALSE; fix_protref_prop(This, &This->props[idx]);
- return This->props[idx].type == PROP_DELETED ? NULL : &This->props[idx]; + if(This->props[idx].type == PROP_DELETED) + return FALSE; + return TRUE; }
static inline BOOL is_function_prop(dispex_prop_t *prop) @@ -603,12 +610,67 @@ static HRESULT invoke_prop_func(jsdisp_t *This, IDispatch *jsthis, dispex_prop_t return E_FAIL; }
+static HRESULT delete_prop(dispex_prop_t *prop, BOOL *ret) +{ + if(prop->type == PROP_PROTREF || prop->type == PROP_DELETED) { + *ret = TRUE; + return S_OK; + } + + if(!(prop->flags & PROPF_CONFIGURABLE)) { + *ret = FALSE; + return S_OK; + } + + *ret = TRUE; + + if(prop->type == PROP_JSVAL) + jsval_release(prop->u.val); + if(prop->type == PROP_ACCESSOR) { + if(prop->u.accessor.getter) + jsdisp_release(prop->u.accessor.getter); + if(prop->u.accessor.setter) + jsdisp_release(prop->u.accessor.setter); + } + prop->type = PROP_DELETED; + return S_OK; +} + HRESULT builtin_set_const(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value) { TRACE("%p %s\n", jsthis, debugstr_jsval(value)); return S_OK; }
+HRESULT dispex_prop_get(jsdisp_t *jsdisp, IDispatch *jsthis, DISPID id, jsval_t *r) +{ + return prop_get(jsdisp, jsthis, &jsdisp->props[prop_id_to_idx(id)], r); +} + +HRESULT dispex_prop_put(jsdisp_t *jsdisp, DISPID id, jsval_t val) +{ + return prop_put(jsdisp, &jsdisp->props[prop_id_to_idx(id)], val); +} + +HRESULT dispex_prop_invoke(jsdisp_t *jsdisp, IDispatch *jsthis, DISPID id, WORD flags, + unsigned argc, jsval_t *argv, jsval_t *r, IServiceProvider *caller) +{ + return invoke_prop_func(jsdisp, jsthis, &jsdisp->props[prop_id_to_idx(id)], flags, argc, argv, r, caller); +} + +HRESULT dispex_prop_delete(jsdisp_t *jsdisp, DISPID id, BOOL *ret) +{ + return delete_prop(&jsdisp->props[prop_id_to_idx(id)], ret); +} + +void *dispex_prop_get_name(jsdisp_t *jsdisp, DISPID id, BOOL bstr) +{ + const WCHAR *name = jsdisp->props[prop_id_to_idx(id)].name; + if(bstr) + return SysAllocString(name); + return jsstr_alloc(name); +} + static HRESULT fill_props(jsdisp_t *obj) { dispex_prop_t *prop; @@ -1916,7 +1978,6 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc { jsdisp_t *This = impl_from_IDispatchEx(iface); IServiceProvider *prev_caller; - dispex_prop_t *prop; jsexcept_t ei; HRESULT hres;
@@ -1925,8 +1986,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc if(pvarRes) V_VT(pvarRes) = VT_EMPTY;
- prop = get_prop(This, id); - if(!prop && id != DISPID_VALUE) { + if(!is_dispid_prop(This, id) && id != DISPID_VALUE) { TRACE("invalid id\n"); return DISP_E_MEMBERNOTFOUND; } @@ -1953,8 +2013,8 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc break;
passed_this = get_this(pdp); - if(prop) - hres = invoke_prop_func(This, passed_this, prop, wFlags, argc, argv, pvarRes ? &r : NULL, pspCaller); + if(id != DISPID_VALUE) + hres = This->builtin_info->prop_invoke(This, passed_this, id, wFlags, argc, argv, pvarRes ? &r : NULL, pspCaller); else hres = jsdisp_call_value(This, passed_this ? jsval_disp(passed_this) : jsval_undefined(), wFlags, argc, argv, pvarRes ? &r : NULL);
@@ -1971,8 +2031,8 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc case DISPATCH_PROPERTYGET: { jsval_t r;
- if(prop) - hres = prop_get(This, to_disp(This), prop, &r); + if(id != DISPID_VALUE) + hres = This->builtin_info->prop_get(This, to_disp(This), id, &r); else { hres = to_primitive(This->ctx, jsval_obj(This), &r, NO_HINT); if(hres == JS_E_TO_PRIMITIVE) @@ -1991,7 +2051,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc jsval_t val; DWORD i;
- if(!prop) { + if(id == DISPID_VALUE) { hres = DISP_E_MEMBERNOTFOUND; break; } @@ -2011,7 +2071,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc if(FAILED(hres)) break;
- hres = prop_put(This, prop, val); + This->builtin_info->prop_put(This, id, val); jsval_release(val); break; } @@ -2027,32 +2087,6 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc return leave_script(This->ctx, hres); }
-static HRESULT delete_prop(dispex_prop_t *prop, BOOL *ret) -{ - if(prop->type == PROP_PROTREF || prop->type == PROP_DELETED) { - *ret = TRUE; - return S_OK; - } - - if(!(prop->flags & PROPF_CONFIGURABLE)) { - *ret = FALSE; - return S_OK; - } - - *ret = TRUE; - - if(prop->type == PROP_JSVAL) - jsval_release(prop->u.val); - if(prop->type == PROP_ACCESSOR) { - if(prop->u.accessor.getter) - jsdisp_release(prop->u.accessor.getter); - if(prop->u.accessor.setter) - jsdisp_release(prop->u.accessor.setter); - } - prop->type = PROP_DELETED; - return S_OK; -} - static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) { jsdisp_t *This = impl_from_IDispatchEx(iface); @@ -2079,18 +2113,16 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bst static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) { jsdisp_t *This = impl_from_IDispatchEx(iface); - dispex_prop_t *prop; BOOL b;
TRACE("(%p)->(%lx)\n", This, id);
- prop = get_prop(This, id); - if(!prop) { + if(!is_dispid_prop(This, id)) { WARN("invalid id\n"); return DISP_E_MEMBERNOTFOUND; }
- return delete_prop(prop, &b); + return This->builtin_info->prop_delete(This, id, &b); }
static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) @@ -2103,15 +2135,13 @@ static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) { jsdisp_t *This = impl_from_IDispatchEx(iface); - dispex_prop_t *prop;
TRACE("(%p)->(%lx %p)\n", This, id, pbstrName);
- prop = get_prop(This, id); - if(!prop) + if(!is_dispid_prop(This, id)) return DISP_E_MEMBERNOTFOUND;
- *pbstrName = SysAllocString(prop->name); + *pbstrName = This->builtin_info->prop_get_name(This, id, TRUE); if(!*pbstrName) return E_OUTOFMEMORY;
@@ -2204,7 +2234,7 @@ HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *b return S_OK; }
-static const builtin_info_t dispex_info = { .class = JSCLASS_NONE }; +static const builtin_info_t dispex_info = { DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_NONE };
HRESULT create_dispex(script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype, jsdisp_t **dispex) { @@ -2381,13 +2411,10 @@ HRESULT jsdisp_call_value(jsdisp_t *jsfunc, jsval_t vthis, WORD flags, unsigned
HRESULT jsdisp_call(jsdisp_t *disp, DISPID id, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - dispex_prop_t *prop; - - prop = get_prop(disp, id); - if(!prop) + if(!is_dispid_prop(disp, id)) return DISP_E_MEMBERNOTFOUND;
- return invoke_prop_func(disp, to_disp(disp), prop, flags, argc, argv, r, &disp->ctx->jscaller->IServiceProvider_iface); + return disp->builtin_info->prop_invoke(disp, to_disp(disp), id, flags, argc, argv, r, &disp->ctx->jscaller->IServiceProvider_iface); }
HRESULT jsdisp_call_name(jsdisp_t *disp, const WCHAR *name, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) @@ -2665,11 +2692,8 @@ HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, jsval_t val)
jsdisp = iface_to_jsdisp(disp); if(jsdisp && jsdisp->ctx == ctx) { - dispex_prop_t *prop; - - prop = get_prop(jsdisp, id); - if(prop) - hres = prop_put(jsdisp, prop, val); + if(is_dispid_prop(jsdisp, id)) + hres = jsdisp->builtin_info->prop_put(jsdisp, id, val); else hres = DISP_E_MEMBERNOTFOUND;
@@ -2771,13 +2795,10 @@ HRESULT jsdisp_get_idx(jsdisp_t *obj, DWORD idx, jsval_t *r)
HRESULT jsdisp_propget(jsdisp_t *jsdisp, DISPID id, jsval_t *val) { - dispex_prop_t *prop; - - prop = get_prop(jsdisp, id); - if(!prop) + if(!is_dispid_prop(jsdisp, id)) return DISP_E_MEMBERNOTFOUND;
- return prop_get(jsdisp, to_disp(jsdisp), prop, val); + return jsdisp->builtin_info->prop_get(jsdisp, to_disp(jsdisp), id, val); }
HRESULT disp_propget(script_ctx_t *ctx, IDispatch *disp, DISPID id, jsval_t *val) @@ -2832,11 +2853,8 @@ HRESULT disp_delete(IDispatch *disp, DISPID id, BOOL *ret)
jsdisp = iface_to_jsdisp(disp); if(jsdisp) { - dispex_prop_t *prop; - - prop = get_prop(jsdisp, id); - if(prop) - hres = delete_prop(prop, ret); + if(is_dispid_prop(jsdisp, id)) + hres = jsdisp->builtin_info->prop_delete(jsdisp, id, ret); else hres = DISP_E_MEMBERNOTFOUND;
@@ -3192,11 +3210,9 @@ BOOL jsdisp_is_frozen(jsdisp_t *obj, BOOL sealed)
HRESULT jsdisp_get_prop_name(jsdisp_t *obj, DISPID id, jsstr_t **r) { - dispex_prop_t *prop = get_prop(obj, id); - - if(!prop) + if(!is_dispid_prop(obj, id)) return DISP_E_MEMBERNOTFOUND;
- *r = jsstr_alloc(prop->name); + *r = obj->builtin_info->prop_get_name(obj, id, FALSE); return *r ? S_OK : E_OUTOFMEMORY; } diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 60b479fb83b..2142b70e677 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -544,7 +544,8 @@ static HRESULT scope_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, }
static const builtin_info_t scope_info = { - JSCLASS_NONE, + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, + .class = JSCLASS_NONE, .destructor = scope_destructor, .idx_length = scope_idx_length, .idx_get = scope_idx_get, diff --git a/dlls/jscript/enumerator.c b/dlls/jscript/enumerator.c index 203bfa8b8e0..90bd98f19af 100644 --- a/dlls/jscript/enumerator.c +++ b/dlls/jscript/enumerator.c @@ -181,12 +181,14 @@ static const builtin_prop_t Enumerator_props[] = { };
static const builtin_info_t Enumerator_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ENUMERATOR, .props_cnt = ARRAY_SIZE(Enumerator_props), .props = Enumerator_props, };
static const builtin_info_t EnumeratorInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ENUMERATOR, .destructor = Enumerator_destructor, .gc_traverse = Enumerator_gc_traverse @@ -313,6 +315,7 @@ static HRESULT EnumeratorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD fla }
static const builtin_info_t EnumeratorConstr_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, }; diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c index e1f04aef38c..5031ce935c1 100644 --- a/dlls/jscript/error.c +++ b/dlls/jscript/error.c @@ -139,6 +139,7 @@ static const builtin_prop_t Error_props[] = { };
static const builtin_info_t Error_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ERROR, .call = Error_value, .props_cnt = ARRAY_SIZE(Error_props), @@ -146,6 +147,7 @@ static const builtin_info_t Error_info = { };
static const builtin_info_t ErrorInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ERROR, .call = Error_value, }; diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index 9c339b807f7..55ec36788c3 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -183,6 +183,7 @@ static HRESULT Arguments_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op }
static const builtin_info_t Arguments_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_ARGUMENTS, .call = Arguments_value, .destructor = Arguments_destructor, @@ -597,6 +598,7 @@ static const builtin_prop_t Function_props[] = { };
static const builtin_info_t Function_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(Function_props), @@ -612,6 +614,7 @@ static const builtin_prop_t FunctionInst_props[] = { };
static const builtin_info_t FunctionInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(FunctionInst_props), @@ -795,6 +798,7 @@ static const builtin_prop_t InterpretedFunction_props[] = { };
static const builtin_info_t InterpretedFunction_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(InterpretedFunction_props), @@ -923,6 +927,7 @@ static const builtin_prop_t BindFunction_props[] = { };
static const builtin_info_t BindFunction_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(BindFunction_props), diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c index 2653d72cd2b..284c3aa9025 100644 --- a/dlls/jscript/global.c +++ b/dlls/jscript/global.c @@ -905,6 +905,7 @@ static const builtin_prop_t JSGlobal_props[] = { };
static const builtin_info_t JSGlobal_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_GLOBAL, .props_cnt = ARRAY_SIZE(JSGlobal_props), .props = JSGlobal_props, diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index fc07c818edf..8a983b13ce6 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -122,7 +122,7 @@ static inline BOOL is_started(script_ctx_t *ctx)
HRESULT create_named_item_script_obj(script_ctx_t *ctx, named_item_t *item) { - static const builtin_info_t disp_info = { .class = JSCLASS_GLOBAL }; + static const builtin_info_t disp_info = { DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_GLOBAL }; return create_dispex(ctx, &disp_info, NULL, &item->script_obj); }
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 80641731006..b51c1fa482c 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -130,6 +130,11 @@ typedef HRESULT (*builtin_getter_t)(script_ctx_t*,jsdisp_t*,jsval_t*); typedef HRESULT (*builtin_setter_t)(script_ctx_t*,jsdisp_t*,jsval_t);
HRESULT builtin_set_const(script_ctx_t*,jsdisp_t*,jsval_t); +HRESULT dispex_prop_get(jsdisp_t*,IDispatch*,DISPID,jsval_t*); +HRESULT dispex_prop_put(jsdisp_t*,DISPID,jsval_t); +HRESULT dispex_prop_invoke(jsdisp_t*,IDispatch*,DISPID,WORD,unsigned,jsval_t*,jsval_t*,IServiceProvider*); +HRESULT dispex_prop_delete(jsdisp_t*,DISPID,BOOL*); +void *dispex_prop_get_name(jsdisp_t*,DISPID,BOOL);
struct thread_data { LONG ref; @@ -185,6 +190,11 @@ typedef struct { const builtin_prop_t *props; void (*destructor)(jsdisp_t*); void (*on_put)(jsdisp_t*,const WCHAR*); + HRESULT (*prop_get)(jsdisp_t*,IDispatch*,DISPID,jsval_t*); + HRESULT (*prop_put)(jsdisp_t*,DISPID,jsval_t); + HRESULT (*prop_invoke)(jsdisp_t*,IDispatch*,DISPID,WORD,unsigned,jsval_t*,jsval_t*,IServiceProvider*); + HRESULT (*prop_delete)(jsdisp_t*,DISPID,BOOL*); + void *(*prop_get_name)(jsdisp_t*,DISPID,BOOL); unsigned (*idx_length)(jsdisp_t*); HRESULT (*idx_get)(jsdisp_t*,unsigned,jsval_t*); HRESULT (*idx_put)(jsdisp_t*,unsigned,jsval_t); @@ -211,6 +221,13 @@ struct jsdisp_t { struct list entry; };
+#define DEFAULT_DISPEX_PROP_VTBL_ENTRIES \ + .prop_get = dispex_prop_get, \ + .prop_put = dispex_prop_put, \ + .prop_invoke = dispex_prop_invoke, \ + .prop_delete = dispex_prop_delete, \ + .prop_get_name = dispex_prop_get_name + static inline IDispatch *to_disp(jsdisp_t *jsdisp) { return (IDispatch*)&jsdisp->IDispatchEx_iface; diff --git a/dlls/jscript/json.c b/dlls/jscript/json.c index b56d75d3570..e69caf090a2 100644 --- a/dlls/jscript/json.c +++ b/dlls/jscript/json.c @@ -948,6 +948,7 @@ static const builtin_prop_t JSON_props[] = { };
static const builtin_info_t JSON_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_JSON, .props_cnt = ARRAY_SIZE(JSON_props), .props = JSON_props, diff --git a/dlls/jscript/jsregexp.c b/dlls/jscript/jsregexp.c index e3a707b1f6b..ccddebcd6c6 100644 --- a/dlls/jscript/jsregexp.c +++ b/dlls/jscript/jsregexp.c @@ -569,6 +569,7 @@ static const builtin_prop_t RegExp_props[] = { };
static const builtin_info_t RegExp_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_REGEXP, .call = RegExp_value, .props_cnt = ARRAY_SIZE(RegExp_props), @@ -586,6 +587,7 @@ static const builtin_prop_t RegExpInst_props[] = { };
static const builtin_info_t RegExpInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_REGEXP, .call = RegExp_value, .props_cnt = ARRAY_SIZE(RegExpInst_props), @@ -952,6 +954,7 @@ static const builtin_prop_t RegExpConstr_props[] = { };
static const builtin_info_t RegExpConstr_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(RegExpConstr_props), diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c index 7739f27ab0f..28b3d5264a5 100644 --- a/dlls/jscript/math.c +++ b/dlls/jscript/math.c @@ -491,6 +491,7 @@ static const builtin_prop_t Math_props[] = { };
static const builtin_info_t Math_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_MATH, .props_cnt = ARRAY_SIZE(Math_props), .props = Math_props, }; diff --git a/dlls/jscript/number.c b/dlls/jscript/number.c index 711d9bee89f..842e8e00636 100644 --- a/dlls/jscript/number.c +++ b/dlls/jscript/number.c @@ -586,12 +586,14 @@ static const builtin_prop_t Number_props[] = { };
static const builtin_info_t Number_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_NUMBER, .props_cnt = ARRAY_SIZE(Number_props), .props = Number_props, };
static const builtin_info_t NumberInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_NUMBER, };
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index 382f4107c45..da363cd92c9 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -460,12 +460,14 @@ static const builtin_prop_t Object_props[] = { };
static const builtin_info_t Object_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_OBJECT, .props_cnt = ARRAY_SIZE(Object_props), .props = Object_props, };
static const builtin_info_t ObjectInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_OBJECT, };
@@ -1057,6 +1059,7 @@ static const builtin_prop_t ObjectConstr_props[] = { };
static const builtin_info_t ObjectConstr_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(ObjectConstr_props), diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c index 5a568607a43..af37302b67c 100644 --- a/dlls/jscript/set.c +++ b/dlls/jscript/set.c @@ -399,6 +399,7 @@ static const builtin_prop_t Map_props[] = { };
static const builtin_info_t Map_prototype_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_OBJECT, .call = Map_value, .props_cnt = ARRAY_SIZE(Map_prototype_props), @@ -406,6 +407,7 @@ static const builtin_info_t Map_prototype_info = { };
static const builtin_info_t Map_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_MAP, .call = Map_value, .props_cnt = ARRAY_SIZE(Map_props), @@ -552,6 +554,7 @@ static const builtin_prop_t Set_prototype_props[] = { };
static const builtin_info_t Set_prototype_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_OBJECT, .call = Set_value, .props_cnt = ARRAY_SIZE(Set_prototype_props), @@ -559,6 +562,7 @@ static const builtin_info_t Set_prototype_info = { };
static const builtin_info_t Set_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_SET, .call = Set_value, .props_cnt = ARRAY_SIZE(Map_props), @@ -841,6 +845,7 @@ static const builtin_prop_t WeakMap_prototype_props[] = { };
static const builtin_info_t WeakMap_prototype_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_OBJECT, .call = WeakMap_value, .props_cnt = ARRAY_SIZE(WeakMap_prototype_props), @@ -848,6 +853,7 @@ static const builtin_info_t WeakMap_prototype_info = { };
static const builtin_info_t WeakMap_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_WEAKMAP, .call = WeakMap_value, .destructor = WeakMap_destructor, diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index ab7497912f2..63cd24db05a 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -1568,6 +1568,7 @@ static const builtin_prop_t String_props[] = { };
static const builtin_info_t String_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_STRING, .props_cnt = ARRAY_SIZE(String_props), .props = String_props, @@ -1579,6 +1580,7 @@ static const builtin_prop_t StringInst_props[] = { };
static const builtin_info_t StringInst_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_STRING, .props_cnt = ARRAY_SIZE(StringInst_props), .props = StringInst_props, @@ -1698,6 +1700,7 @@ static const builtin_prop_t StringConstr_props[] = { };
static const builtin_info_t StringConstr_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_FUNCTION, .call = Function_value, .props_cnt = ARRAY_SIZE(StringConstr_props), diff --git a/dlls/jscript/vbarray.c b/dlls/jscript/vbarray.c index 55500c86769..c29ae83b8de 100644 --- a/dlls/jscript/vbarray.c +++ b/dlls/jscript/vbarray.c @@ -246,6 +246,7 @@ static const builtin_prop_t VBArray_props[] = { };
static const builtin_info_t VBArray_info = { + DEFAULT_DISPEX_PROP_VTBL_ENTRIES, .class = JSCLASS_VBARRAY, .call = VBArray_value, .props_cnt = ARRAY_SIZE(VBArray_props),