Jacek Caban : vbscript: Added interp_const implementation.

Alexandre Julliard julliard at winehq.org
Wed Sep 21 13:35:16 CDT 2011


Module: wine
Branch: master
Commit: 6cbf3e3b3c0a566c35ae168efabf5939264ff081
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6cbf3e3b3c0a566c35ae168efabf5939264ff081

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Sep 21 14:04:16 2011 +0200

vbscript: Added interp_const implementation.

---

 dlls/vbscript/compile.c  |    1 +
 dlls/vbscript/interp.c   |   38 +++++++++++++++++++++++++++++++-------
 dlls/vbscript/vbscript.h |    1 +
 3 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 712d97d..9cfe45b 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -921,6 +921,7 @@ static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *f
                     return E_OUTOFMEMORY;
 
                 V_VT(&new_var->v) = VT_EMPTY;
+                new_var->is_const = FALSE;
 
                 new_var->next = ctx->global_vars;
                 ctx->global_vars = new_var;
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index 46d15ff..c2ffd98 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -24,7 +24,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
 
-
 typedef struct {
     vbscode_t *code;
     instr_t *instr;
@@ -52,6 +51,7 @@ typedef enum {
     REF_DISP,
     REF_VAR,
     REF_OBJ,
+    REF_CONST,
     REF_FUNC
 } ref_type_t;
 
@@ -78,7 +78,7 @@ static BOOL lookup_dynamic_vars(dynamic_var_t *var, const WCHAR *name, ref_t *re
 {
     while(var) {
         if(!strcmpiW(var->name, name)) {
-            ref->type = REF_VAR;
+            ref->type = var->is_const ? REF_CONST : REF_VAR;
             ref->u.v = &var->v;
             return TRUE;
         }
@@ -198,7 +198,7 @@ static HRESULT lookup_identifier(exec_ctx_t *ctx, BSTR name, vbdisp_invoke_type_
     return S_OK;
 }
 
-static HRESULT add_dynamic_var(exec_ctx_t *ctx, const WCHAR *name, VARIANT *val, BOOL own_val)
+static HRESULT add_dynamic_var(exec_ctx_t *ctx, const WCHAR *name, BOOL is_const, VARIANT *val, BOOL own_val)
 {
     dynamic_var_t *new_var;
     vbsheap_t *heap;
@@ -218,6 +218,7 @@ static HRESULT add_dynamic_var(exec_ctx_t *ctx, const WCHAR *name, VARIANT *val,
         return E_OUTOFMEMORY;
     memcpy(str, name, size);
     new_var->name = str;
+    new_var->is_const = is_const;
 
     if(own_val) {
         new_var->v = *val;
@@ -379,6 +380,7 @@ static HRESULT do_icall(exec_ctx_t *ctx, VARIANT *res)
 
     switch(ref.type) {
     case REF_VAR:
+    case REF_CONST:
         if(!res) {
             FIXME("REF_VAR no res\n");
             return E_NOTIMPL;
@@ -531,13 +533,16 @@ static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, VARIANT *val, BOOL own_v
     case REF_OBJ:
         FIXME("REF_OBJ\n");
         return E_NOTIMPL;
+    case REF_CONST:
+        FIXME("REF_CONST\n");
+        return E_NOTIMPL;
     case REF_NONE:
         if(ctx->func->code_ctx->option_explicit) {
             FIXME("throw exception\n");
             hres = E_FAIL;
         }else {
             TRACE("creating variable %s\n", debugstr_w(name));
-            hres = add_dynamic_var(ctx, name, val, own_val);
+            hres = add_dynamic_var(ctx, name, FALSE, val, own_val);
         }
     }
 
@@ -653,8 +658,28 @@ static HRESULT interp_set_member(exec_ctx_t *ctx)
 static HRESULT interp_const(exec_ctx_t *ctx)
 {
     BSTR arg = ctx->instr->arg1.bstr;
-    FIXME("%s\n", debugstr_w(arg));
-    return E_NOTIMPL;
+    variant_val_t val;
+    ref_t ref;
+    HRESULT hres;
+
+    TRACE("%s\n", debugstr_w(arg));
+
+    assert(ctx->func->type == FUNC_GLOBAL);
+
+    hres = lookup_identifier(ctx, arg, VBDISP_CALLGET, &ref);
+    if(FAILED(hres))
+        return hres;
+
+    if(ref.type != REF_NONE) {
+        FIXME("%s already defined\n", debugstr_w(arg));
+        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);
 }
 
 static HRESULT interp_new(exec_ctx_t *ctx)
@@ -1547,6 +1572,5 @@ HRESULT exec_script(script_ctx_t *ctx, function_t *func, IDispatch *this_obj, DI
     }
 
     release_exec(&exec);
-
     return hres;
 }
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 73b0b86..bd55719 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -136,6 +136,7 @@ typedef struct _dynamic_var_t {
     struct _dynamic_var_t *next;
     VARIANT v;
     const WCHAR *name;
+    BOOL is_const;
 } dynamic_var_t;
 
 struct _script_ctx_t {




More information about the wine-cvs mailing list