Jacek Caban : vbscript: Store call identifier as BSTR.

Alexandre Julliard julliard at winehq.org
Thu Sep 8 14:52:12 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep  8 14:54:23 2011 +0200

vbscript: Store call identifier as BSTR.

---

 dlls/vbscript/Makefile.in |    1 +
 dlls/vbscript/compile.c   |   47 ++++++++++++++++++++++++++++++++++++++++++--
 dlls/vbscript/vbscript.h  |   10 +++++++-
 3 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/dlls/vbscript/Makefile.in b/dlls/vbscript/Makefile.in
index 9e27dd4..cd7e18d 100644
--- a/dlls/vbscript/Makefile.in
+++ b/dlls/vbscript/Makefile.in
@@ -1,4 +1,5 @@
 MODULE    = vbscript.dll
+IMPORTS   = oleaut32
 
 C_SRCS = \
 	compile.c \
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index d57abcf..49d933b 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -59,15 +59,45 @@ static unsigned push_instr(compile_ctx_t *ctx, vbsop_t op)
     return ctx->instr_cnt++;
 }
 
-static HRESULT push_instr_str(compile_ctx_t *ctx, vbsop_t op, const WCHAR *arg)
+static BSTR alloc_bstr_arg(compile_ctx_t *ctx, const WCHAR *str)
+{
+    if(!ctx->code->bstr_pool_size) {
+        ctx->code->bstr_pool = heap_alloc(8 * sizeof(BSTR));
+        if(!ctx->code->bstr_pool)
+            return NULL;
+        ctx->code->bstr_pool_size = 8;
+    }else if(ctx->code->bstr_pool_size == ctx->code->bstr_cnt) {
+       BSTR *new_pool;
+
+        new_pool = heap_realloc(ctx->code->bstr_pool, ctx->code->bstr_pool_size*2*sizeof(BSTR));
+        if(!new_pool)
+            return NULL;
+
+        ctx->code->bstr_pool = new_pool;
+        ctx->code->bstr_pool_size *= 2;
+    }
+
+    ctx->code->bstr_pool[ctx->code->bstr_cnt] = SysAllocString(str);
+    if(!ctx->code->bstr_pool[ctx->code->bstr_cnt])
+        return NULL;
+
+    return ctx->code->bstr_pool[ctx->code->bstr_cnt++];
+}
+
+static HRESULT push_instr_bstr(compile_ctx_t *ctx, vbsop_t op, const WCHAR *arg)
 {
     unsigned instr;
+    BSTR bstr;
+
+    bstr = alloc_bstr_arg(ctx, arg);
+    if(!bstr)
+        return E_OUTOFMEMORY;
 
     instr = push_instr(ctx, op);
     if(instr == -1)
         return E_OUTOFMEMORY;
 
-    instr_ptr(ctx, instr)->arg1.str = arg;
+    instr_ptr(ctx, instr)->arg1.bstr = bstr;
     return S_OK;
 }
 
@@ -84,7 +114,7 @@ static HRESULT compile_member_expression(compile_ctx_t *ctx, member_expression_t
         FIXME("obj_expr not implemented\n");
         hres = E_NOTIMPL;
     }else {
-        hres = push_instr_str(ctx, OP_icallv, expr->identifier);
+        hres = push_instr_bstr(ctx, OP_icallv, expr->identifier);
     }
 
     return hres;
@@ -130,7 +160,14 @@ static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *f
 
 void release_vbscode(vbscode_t *code)
 {
+    unsigned i;
+
     list_remove(&code->entry);
+
+    for(i=0; i < code->bstr_cnt; i++)
+        SysFreeString(code->bstr_pool[i]);
+
+    heap_free(code->bstr_pool);
     heap_free(code->source);
     heap_free(code->instrs);
     heap_free(code);
@@ -159,6 +196,10 @@ static vbscode_t *alloc_vbscode(compile_ctx_t *ctx, const WCHAR *source)
     ctx->instr_cnt = 0;
     ctx->instr_size = 32;
 
+    ret->bstr_pool = NULL;
+    ret->bstr_pool_size = 0;
+    ret->bstr_cnt = 0;
+
     ret->global_code.code_ctx = ret;
 
     list_init(&ret->entry);
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index bca630a..9942ac7 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -64,11 +64,12 @@ HRESULT init_global(script_ctx_t*);
 
 typedef enum {
     ARG_NONE = 0,
-    ARG_STR
+    ARG_STR,
+    ARG_BSTR
 } instr_arg_type_t;
 
 #define OP_LIST                                   \
-    X(icallv,         1, ARG_STR,     0)          \
+    X(icallv,         1, ARG_BSTR,    0)          \
     X(ret,            0, 0,           0)
 
 typedef enum {
@@ -80,6 +81,7 @@ OP_LIST
 
 typedef union {
     const WCHAR *str;
+    BSTR bstr;
 } instr_arg_t;
 
 typedef struct {
@@ -100,6 +102,10 @@ struct _vbscode_t {
     BOOL global_executed;
     function_t global_code;
 
+    BSTR *bstr_pool;
+    unsigned bstr_pool_size;
+    unsigned bstr_cnt;
+
     struct list entry;
 };
 




More information about the wine-cvs mailing list