Author: akhaldi Date: Wed Jul 22 00:39:49 2015 New Revision: 68536
URL: http://svn.reactos.org/svn/reactos?rev=68536&view=rev Log: [VBSCRIPT] Sync with Wine Staging 1.7.47. CORE-9924
Modified: trunk/reactos/dll/win32/vbscript/global.c trunk/reactos/dll/win32/vbscript/interp.c trunk/reactos/dll/win32/vbscript/vbdisp.c trunk/reactos/dll/win32/vbscript/vbregexp.c trunk/reactos/dll/win32/vbscript/vbscript.h trunk/reactos/media/doc/README.WINE
Modified: trunk/reactos/dll/win32/vbscript/global.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/vbscript/global.c... ============================================================================== --- trunk/reactos/dll/win32/vbscript/global.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/vbscript/global.c [iso-8859-1] Wed Jul 22 00:39:49 2015 @@ -539,26 +539,25 @@ { WCHAR buf[17], *ptr; DWORD n; + HRESULT hres; + int ret;
TRACE("%s\n", debugstr_variant(arg));
switch(V_VT(arg)) { case VT_I2: n = (WORD)V_I2(arg); - break; - case VT_I4: - n = V_I4(arg); - break; - case VT_EMPTY: - n = 0; break; case VT_NULL: if(res) V_VT(res) = VT_NULL; return S_OK; default: - FIXME("unsupported type %s\n", debugstr_variant(arg)); - return E_NOTIMPL; + hres = to_int(arg, &ret); + if(FAILED(hres)) + return hres; + else + n = ret; }
buf[16] = 0; @@ -579,8 +578,43 @@
static HRESULT Global_Oct(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) { - FIXME("\n"); - return E_NOTIMPL; + HRESULT hres; + WCHAR buf[23], *ptr; + DWORD n; + int ret; + + TRACE("%s\n", debugstr_variant(arg)); + + switch(V_VT(arg)) { + case VT_I2: + n = (WORD)V_I2(arg); + break; + case VT_NULL: + if(res) + V_VT(res) = VT_NULL; + return S_OK; + default: + hres = to_int(arg, &ret); + if(FAILED(hres)) + return hres; + else + n = ret; + } + + buf[22] = 0; + ptr = buf + 21; + + if(n) { + do { + *ptr-- = '0' + (n & 0x7); + n >>= 3; + }while(n); + ptr++; + }else { + *ptr = '0'; + } + + return return_string(res, ptr); }
static HRESULT Global_VarType(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) @@ -1298,7 +1332,7 @@ buf[len++] = c>>8; if(!len || IsDBCSLeadByteEx(cp, buf[0])) buf[len++] = c; - if(!MultiByteToWideChar(0, 0, buf, len, &ch, 1)) { + if(!MultiByteToWideChar(CP_ACP, 0, buf, len, &ch, 1)) { WARN("invalid arg %d, cp %d\n", c, cp); return E_FAIL; } @@ -1788,7 +1822,7 @@
assert(2 <= args_cnt && args_cnt <= 4);
- if(V_VT(args) == VT_NULL || V_VT(args+1) == VT_NULL || V_VT(args+2) == VT_NULL) + if(V_VT(args) == VT_NULL || V_VT(args+1) == VT_NULL || (args_cnt > 2 && V_VT(args+2) == VT_NULL)) return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE);
hres = to_string(args, &str1);
Modified: trunk/reactos/dll/win32/vbscript/interp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/vbscript/interp.c... ============================================================================== --- trunk/reactos/dll/win32/vbscript/interp.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/vbscript/interp.c [iso-8859-1] Wed Jul 22 00:39:49 2015 @@ -214,13 +214,12 @@ }
static HRESULT add_dynamic_var(exec_ctx_t *ctx, const WCHAR *name, - BOOL is_const, VARIANT *val, BOOL own_val, VARIANT **out_var) + BOOL is_const, VARIANT **out_var) { dynamic_var_t *new_var; heap_pool_t *heap; WCHAR *str; unsigned size; - HRESULT hres;
heap = ctx->func->type == FUNC_GLOBAL ? &ctx->script->heap : &ctx->heap;
@@ -235,15 +234,7 @@ memcpy(str, name, size); new_var->name = str; new_var->is_const = is_const; - - if(own_val) { - new_var->v = *val; - }else { - V_VT(&new_var->v) = VT_EMPTY; - hres = VariantCopy(&new_var->v, val); - if(FAILED(hres)) - return hres; - } + V_VT(&new_var->v) = VT_EMPTY;
if(ctx->func->type == FUNC_GLOBAL) { new_var->next = ctx->script->global_vars; @@ -253,9 +244,7 @@ ctx->dynamic_vars = new_var; }
- if(out_var) - *out_var = &new_var->v; - + *out_var = &new_var->v; return S_OK; }
@@ -328,10 +317,9 @@ stack_pop_deref(ctx, r);
if(V_VT(r->v) == VT_DISPATCH) { - DISPPARAMS dp = {0}; HRESULT hres;
- hres = disp_call(ctx->script, V_DISPATCH(r->v), DISPID_VALUE, &dp, &r->store); + hres = get_disp_value(ctx->script, V_DISPATCH(r->v), &r->store); if(r->owned) IDispatch_Release(V_DISPATCH(r->v)); if(FAILED(hres)) @@ -359,12 +347,10 @@ }
if(V_VT(v) == VT_DISPATCH) { - DISPPARAMS dp = {0}; IDispatch *disp;
disp = V_DISPATCH(v); - V_VT(v) = VT_EMPTY; - hres = disp_call(ctx->script, disp, DISPID_VALUE, &dp, v); + hres = get_disp_value(ctx->script, disp, v); IDispatch_Release(disp); if(FAILED(hres)) return hres; @@ -614,9 +600,8 @@ break; case REF_NONE: if(res && !ctx->func->code_ctx->option_explicit && arg_cnt == 0) { - VARIANT v, *new; - VariantInit(&v); - hres = add_dynamic_var(ctx, identifier, FALSE, &v, FALSE, &new); + VARIANT *new; + hres = add_dynamic_var(ctx, identifier, FALSE, &new); if(FAILED(hres)) return hres; V_VT(res) = VT_BYREF|VT_VARIANT; @@ -703,7 +688,29 @@ return do_mcall(ctx, NULL); }
-static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, DISPPARAMS *dp) +static HRESULT assign_value(exec_ctx_t *ctx, VARIANT *dst, VARIANT *src, WORD flags) +{ + HRESULT hres; + + hres = VariantCopyInd(dst, src); + if(FAILED(hres)) + return hres; + + if(V_VT(dst) == VT_DISPATCH && !(flags & DISPATCH_PROPERTYPUTREF)) { + VARIANT value; + + hres = get_disp_value(ctx->script, V_DISPATCH(dst), &value); + IDispatch_Release(V_DISPATCH(dst)); + if(FAILED(hres)) + return hres; + + *dst = value; + } + + return S_OK; +} + +static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, WORD flags, DISPPARAMS *dp) { ref_t ref; HRESULT hres; @@ -752,11 +759,11 @@ return E_NOTIMPL; }
- hres = VariantCopyInd(v, dp->rgvarg); + hres = assign_value(ctx, v, dp->rgvarg, flags); break; } case REF_DISP: - hres = disp_propput(ctx->script, ref.u.d.disp, ref.u.d.id, dp); + hres = disp_propput(ctx->script, ref.u.d.disp, ref.u.d.id, flags, dp); break; case REF_FUNC: FIXME("functions not implemented\n"); @@ -772,13 +779,17 @@ FIXME("throw exception\n"); hres = E_FAIL; }else { + VARIANT *new_var; + if(arg_cnt(dp)) { FIXME("arg_cnt %d not supported\n", arg_cnt(dp)); return E_NOTIMPL; }
TRACE("creating variable %s\n", debugstr_w(name)); - hres = add_dynamic_var(ctx, name, FALSE, dp->rgvarg, FALSE, NULL); + hres = add_dynamic_var(ctx, name, FALSE, &new_var); + if(SUCCEEDED(hres)) + hres = assign_value(ctx, new_var, dp->rgvarg, flags); } }
@@ -794,12 +805,8 @@
TRACE("%s\n", debugstr_w(arg));
- hres = stack_assume_val(ctx, arg_cnt); - if(FAILED(hres)) - return hres; - vbstack_to_dp(ctx, arg_cnt, TRUE, &dp); - hres = assign_ident(ctx, arg, &dp); + hres = assign_ident(ctx, arg, DISPATCH_PROPERTYPUT, &dp); if(FAILED(hres)) return hres;
@@ -826,7 +833,7 @@ return hres;
vbstack_to_dp(ctx, 0, TRUE, &dp); - hres = assign_ident(ctx, ctx->instr->arg1.bstr, &dp); + hres = assign_ident(ctx, ctx->instr->arg1.bstr, DISPATCH_PROPERTYPUTREF, &dp); if(FAILED(hres)) return hres;
@@ -854,14 +861,10 @@ return E_FAIL; }
- hres = stack_assume_val(ctx, arg_cnt); - if(FAILED(hres)) - return hres; - hres = disp_get_id(obj, identifier, VBDISP_LET, FALSE, &id); if(SUCCEEDED(hres)) { vbstack_to_dp(ctx, arg_cnt, TRUE, &dp); - hres = disp_propput(ctx->script, obj, id, &dp); + hres = disp_propput(ctx->script, obj, id, DISPATCH_PROPERTYPUT, &dp); } if(FAILED(hres)) return hres; @@ -902,7 +905,7 @@ hres = disp_get_id(obj, identifier, VBDISP_SET, FALSE, &id); if(SUCCEEDED(hres)) { vbstack_to_dp(ctx, arg_cnt, TRUE, &dp); - hres = disp_propput(ctx->script, obj, id, &dp); + hres = disp_propput(ctx->script, obj, id, DISPATCH_PROPERTYPUTREF, &dp); } if(FAILED(hres)) return hres; @@ -914,7 +917,7 @@ static HRESULT interp_const(exec_ctx_t *ctx) { BSTR arg = ctx->instr->arg1.bstr; - variant_val_t val; + VARIANT *v; ref_t ref; HRESULT hres;
@@ -931,11 +934,16 @@ return E_FAIL; }
- hres = stack_pop_val(ctx, &val); - if(FAILED(hres)) - return hres; - - return add_dynamic_var(ctx, arg, TRUE, val.v, val.owned, NULL); + hres = stack_assume_val(ctx, 0); + if(FAILED(hres)) + return hres; + + hres = add_dynamic_var(ctx, arg, TRUE, &v); + if(FAILED(hres)) + return hres; + + *v = *stack_pop(ctx); + return S_OK; }
static HRESULT interp_val(exec_ctx_t *ctx) @@ -1170,7 +1178,7 @@ return hres;
do_continue = hres == S_OK; - hres = assign_ident(ctx, ident, &dp); + hres = assign_ident(ctx, ident, DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF, &dp); VariantClear(&v); if(FAILED(hres)) return hres;
Modified: trunk/reactos/dll/win32/vbscript/vbdisp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/vbscript/vbdisp.c... ============================================================================== --- trunk/reactos/dll/win32/vbscript/vbdisp.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/vbscript/vbdisp.c [iso-8859-1] Wed Jul 22 00:39:49 2015 @@ -79,19 +79,43 @@ return DISP_E_UNKNOWNNAME; }
-static VARIANT *get_propput_arg(const DISPPARAMS *dp) +static HRESULT get_propput_arg(script_ctx_t *ctx, const DISPPARAMS *dp, WORD flags, VARIANT *v, BOOL *is_owned) { unsigned i;
for(i=0; i < dp->cNamedArgs; i++) { if(dp->rgdispidNamedArgs[i] == DISPID_PROPERTYPUT) - return dp->rgvarg+i; - } - - return NULL; -} - -static HRESULT invoke_variant_prop(VARIANT *v, WORD flags, DISPPARAMS *dp, VARIANT *res) + break; + } + if(i == dp->cNamedArgs) { + WARN("no value to set\n"); + return DISP_E_PARAMNOTOPTIONAL; + } + + *v = dp->rgvarg[i]; + if(V_VT(v) == (VT_VARIANT|VT_BYREF)) + *v = *V_VARIANTREF(v); + *is_owned = FALSE; + + if(V_VT(v) == VT_DISPATCH) { + if(!(flags & DISPATCH_PROPERTYPUTREF)) { + HRESULT hres; + + hres = get_disp_value(ctx, V_DISPATCH(v), v); + if(FAILED(hres)) + return hres; + + *is_owned = TRUE; + } + }else if(!(flags & DISPATCH_PROPERTYPUT)) { + WARN("%s can't be assigned without DISPATCH_PROPERTYPUT flag\n", debugstr_variant(v)); + return DISP_E_EXCEPTION; + } + + return S_OK; +} + +static HRESULT invoke_variant_prop(script_ctx_t *ctx, VARIANT *v, WORD flags, DISPPARAMS *dp, VARIANT *res) { HRESULT hres;
@@ -106,14 +130,15 @@ hres = VariantCopyInd(res, v); break;
- case DISPATCH_PROPERTYPUT: { - VARIANT *put_val; - - put_val = get_propput_arg(dp); - if(!put_val) { - WARN("no value to set\n"); - return DISP_E_PARAMNOTOPTIONAL; - } + case DISPATCH_PROPERTYPUT: + case DISPATCH_PROPERTYPUTREF: + case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: { + VARIANT put_val; + BOOL own_val; + + hres = get_propput_arg(ctx, dp, flags, &put_val, &own_val); + if(FAILED(hres)) + return hres;
if(arg_cnt(dp)) { FIXME("Arguments not supported\n"); @@ -123,7 +148,10 @@ if(res) V_VT(res) = VT_EMPTY;
- hres = VariantCopyInd(v, put_val); + if(own_val) + *v = put_val; + else + hres = VariantCopyInd(v, &put_val); break; }
@@ -403,29 +431,34 @@ }
return exec_script(This->desc->ctx, func, This, pdp, pvarRes); - case DISPATCH_PROPERTYPUT: { - VARIANT *put_val; + case DISPATCH_PROPERTYPUT: + case DISPATCH_PROPERTYPUTREF: + case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: { DISPPARAMS dp = {NULL, NULL, 1, 0}; + BOOL needs_release; + VARIANT put_val; + HRESULT hres;
if(arg_cnt(pdp)) { FIXME("arguments not implemented\n"); return E_NOTIMPL; }
- put_val = get_propput_arg(pdp); - if(!put_val) { - WARN("no value to set\n"); - return DISP_E_PARAMNOTOPTIONAL; - } - - dp.rgvarg = put_val; - func = This->desc->funcs[id].entries[V_VT(put_val) == VT_DISPATCH ? VBDISP_SET : VBDISP_LET]; + hres = get_propput_arg(This->desc->ctx, pdp, wFlags, &put_val, &needs_release); + if(FAILED(hres)) + return hres; + + dp.rgvarg = &put_val; + func = This->desc->funcs[id].entries[V_VT(&put_val) == VT_DISPATCH ? VBDISP_SET : VBDISP_LET]; if(!func) { FIXME("no letter/setter\n"); return DISP_E_MEMBERNOTFOUND; }
- return exec_script(This->desc->ctx, func, This, &dp, NULL); + hres = exec_script(This->desc->ctx, func, This, &dp, NULL); + if(needs_release) + VariantClear(&put_val); + return hres; } default: FIXME("flags %x\n", wFlags); @@ -434,7 +467,7 @@ }
if(id < This->desc->prop_cnt + This->desc->func_cnt) - return invoke_variant_prop(This->props+(id-This->desc->func_cnt), wFlags, pdp, pvarRes); + return invoke_variant_prop(This->desc->ctx, This->props+(id-This->desc->func_cnt), wFlags, pdp, pvarRes);
if(This->desc->builtin_prop_cnt) { unsigned min = 0, max = This->desc->builtin_prop_cnt-1, i; @@ -839,7 +872,7 @@ return E_NOTIMPL; }
- return invoke_variant_prop(&ident->u.var->v, wFlags, pdp, pvarRes); + return invoke_variant_prop(This->ctx, &ident->u.var->v, wFlags, pdp, pvarRes); }
switch(wFlags) { @@ -1060,7 +1093,13 @@ return hres; }
-HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, DISPPARAMS *dp) +HRESULT get_disp_value(script_ctx_t *ctx, IDispatch *disp, VARIANT *v) +{ + DISPPARAMS dp = {NULL}; + return disp_call(ctx, disp, DISPID_VALUE, &dp, v); +} + +HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags, DISPPARAMS *dp) { IDispatchEx *dispex; EXCEPINFO ei = {0}; @@ -1068,13 +1107,13 @@
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); if(SUCCEEDED(hres)) { - hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, DISPATCH_PROPERTYPUT, dp, NULL, &ei, NULL /* FIXME! */); + hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, NULL, &ei, NULL /* FIXME! */); IDispatchEx_Release(dispex); }else { ULONG err = 0;
TRACE("using IDispatch\n"); - hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, DISPATCH_PROPERTYPUT, dp, NULL, &ei, &err); + hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, NULL, &ei, &err); }
return hres;
Modified: trunk/reactos/dll/win32/vbscript/vbregexp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/vbscript/vbregexp... ============================================================================== --- trunk/reactos/dll/win32/vbscript/vbregexp.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/vbscript/vbregexp.c [iso-8859-1] Wed Jul 22 00:39:49 2015 @@ -1186,29 +1186,23 @@ static HRESULT WINAPI RegExp2_put_Pattern(IRegExp2 *iface, BSTR pattern) { RegExp2 *This = impl_from_IRegExp2(iface); - WCHAR *p; - DWORD size; + WCHAR *new_pattern;
TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(pattern));
- if(!pattern) { - heap_free(This->pattern); - if(This->regexp) { - regexp_destroy(This->regexp); - This->regexp = NULL; - } - This->pattern = NULL; - return S_OK; - } - - size = (SysStringLen(pattern)+1) * sizeof(WCHAR); - p = heap_alloc(size); - if(!p) - return E_OUTOFMEMORY; + if(pattern && *pattern) { + SIZE_T size = (SysStringLen(pattern)+1) * sizeof(WCHAR); + new_pattern = heap_alloc(size); + if(!new_pattern) + return E_OUTOFMEMORY; + memcpy(new_pattern, pattern, size); + }else { + new_pattern = NULL; + }
heap_free(This->pattern); - This->pattern = p; - memcpy(p, pattern, size); + This->pattern = new_pattern; + if(This->regexp) { regexp_destroy(This->regexp); This->regexp = NULL;
Modified: trunk/reactos/dll/win32/vbscript/vbscript.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/vbscript/vbscript... ============================================================================== --- trunk/reactos/dll/win32/vbscript/vbscript.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/vbscript/vbscript.h [iso-8859-1] Wed Jul 22 00:39:49 2015 @@ -159,7 +159,8 @@ HRESULT disp_get_id(IDispatch*,BSTR,vbdisp_invoke_type_t,BOOL,DISPID*) DECLSPEC_HIDDEN; HRESULT vbdisp_get_id(vbdisp_t*,BSTR,vbdisp_invoke_type_t,BOOL,DISPID*) DECLSPEC_HIDDEN; HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN; -HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,DISPPARAMS*) DECLSPEC_HIDDEN; +HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,WORD,DISPPARAMS*) DECLSPEC_HIDDEN; +HRESULT get_disp_value(script_ctx_t*,IDispatch*,VARIANT*) DECLSPEC_HIDDEN; void collect_objects(script_ctx_t*) DECLSPEC_HIDDEN; HRESULT create_procedure_disp(script_ctx_t*,vbscode_t*,IDispatch**) DECLSPEC_HIDDEN; HRESULT create_script_disp(script_ctx_t*,ScriptDisp**) DECLSPEC_HIDDEN;
Modified: trunk/reactos/media/doc/README.WINE URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=6... ============================================================================== --- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original) +++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Wed Jul 22 00:39:49 2015 @@ -198,7 +198,7 @@ reactos/dll/win32/urlmon # Synced to WineStaging-1.7.47 reactos/dll/win32/usp10 # Synced to WineStaging-1.7.47 reactos/dll/win32/uxtheme # Forked -reactos/dll/win32/vbscript # Synced to WineStaging-1.7.37 +reactos/dll/win32/vbscript # Synced to WineStaging-1.7.47 reactos/dll/win32/version # Synced to WineStaging-1.7.37 reactos/dll/win32/wbemdisp # Synced to WineStaging-1.7.37 reactos/dll/win32/wbemprox # Synced to WineStaging-1.7.37