Jacek Caban : vbscript: Added variable value expression support.
Alexandre Julliard
julliard at winehq.org
Tue Sep 13 12:18:10 CDT 2011
Module: wine
Branch: master
Commit: 07b542cc08d85144db1a6baa9f913a825d096982
URL: http://source.winehq.org/git/wine.git/?a=commit;h=07b542cc08d85144db1a6baa9f913a825d096982
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Sep 13 11:37:08 2011 +0200
vbscript: Added variable value expression support.
---
dlls/vbscript/interp.c | 42 ++++++++++++++++++++++++++++++++++++++++--
dlls/vbscript/tests/lang.vbs | 1 +
2 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index 45a7504..9dd74be 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -40,7 +40,8 @@ typedef HRESULT (*instr_func_t)(exec_ctx_t*);
typedef enum {
REF_NONE,
- REF_DISP
+ REF_DISP,
+ REF_VAR
} ref_type_t;
typedef struct {
@@ -50,6 +51,7 @@ typedef struct {
IDispatch *disp;
DISPID id;
} d;
+ VARIANT *v;
} u;
} ref_t;
@@ -59,12 +61,30 @@ typedef struct {
BOOL owned;
} variant_val_t;
+static BOOL lookup_dynamic_vars(dynamic_var_t *var, const WCHAR *name, ref_t *ref)
+{
+ while(var) {
+ if(!strcmpiW(var->name, name)) {
+ ref->type = REF_VAR;
+ ref->u.v = &var->v;
+ return TRUE;
+ }
+
+ var = var->next;
+ }
+
+ return FALSE;
+}
+
static HRESULT lookup_identifier(exec_ctx_t *ctx, BSTR name, ref_t *ref)
{
named_item_t *item;
DISPID id;
HRESULT hres;
+ if(lookup_dynamic_vars(ctx->script->global_vars, name, ref))
+ return S_OK;
+
LIST_FOR_EACH_ENTRY(item, &ctx->script->named_items, named_item_t, entry) {
if(item->flags & SCRIPTITEM_GLOBALMEMBERS) {
hres = disp_get_id(item->disp, name, &id);
@@ -210,12 +230,26 @@ static HRESULT do_icall(exec_ctx_t *ctx, VARIANT *res)
vbstack_to_dp(ctx, arg_cnt, &dp);
switch(ref.type) {
+ case REF_VAR:
+ if(!res) {
+ FIXME("REF_VAR no res\n");
+ return E_NOTIMPL;
+ }
+
+ if(arg_cnt) {
+ FIXME("arguments not implemented\n");
+ return E_NOTIMPL;
+ }
+
+ V_VT(res) = VT_BYREF|VT_VARIANT;
+ V_BYREF(res) = V_VT(ref.u.v) == (VT_VARIANT|VT_BYREF) ? V_VARIANTREF(ref.u.v) : ref.u.v;
+ break;
case REF_DISP:
hres = disp_call(ctx->script, ref.u.d.disp, ref.u.d.id, &dp, res);
if(FAILED(hres))
return hres;
break;
- default:
+ case REF_NONE:
FIXME("%s not found\n", debugstr_w(identifier));
return DISP_E_UNKNOWNNAME;
}
@@ -254,6 +288,10 @@ static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, VARIANT *val, BOOL own_v
return hres;
switch(ref.type) {
+ case REF_VAR:
+ FIXME("REF_VAR not implemented\n");
+ hres = E_NOTIMPL;
+ break;
case REF_DISP:
hres = disp_propput(ctx->script, ref.u.d.disp, ref.u.d.id, val);
if(own_val)
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 94dc3eb..61a59d0 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -66,6 +66,7 @@ Call ok(getVT(&hffFFffFF&) = "VT_I2", "getVT(&hffFFffFF&) is not VT_I2")
Call ok(getVT(1 & 100000) = "VT_BSTR", "getVT(1 & 100000) is not VT_BSTR")
Call ok(getVT(-empty) = "VT_I2", "getVT(-empty) = " & getVT(-empty))
Call ok(getVT(-null) = "VT_NULL", "getVT(-null) = " & getVT(-null))
+Call ok(getVT(y) = "VT_EMPTY*", "getVT(y) = " & getVT(y))
Call ok("ab" & "cd" = "abcd", """ab"" & ""cd"" <> ""abcd""")
Call ok("ab " & null = "ab ", """ab"" & null = " & ("ab " & null))
More information about the wine-cvs
mailing list