From fc713bfc1233a0c11f0441569281fd2efd0b6d5d Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 13 Nov 2013 16:29:18 +0100 Subject: [PATCH] vbscript: Added bytecode support for arrays. --- dlls/vbscript/compile.c | 42 ++++++++++++++++++++++++++++++++++++++-- dlls/vbscript/interp.c | 9 +++++++++ dlls/vbscript/vbscript.h | 8 ++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 7353c2270a5..ea227878270 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -937,8 +937,9 @@ static HRESULT compile_dim_statement(compile_ctx_t *ctx, dim_statement_t *stat) ctx->func->var_cnt++; if(dim_decl->is_array) { - FIXME("arrays not supported\n"); - return E_NOTIMPL; + HRESULT hres = push_instr_bstr_uint(ctx, OP_dim, dim_decl->name, ctx->func->array_cnt++); + if(FAILED(hres)) + return hres; } if(!dim_decl->next) @@ -1302,6 +1303,41 @@ static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *f } } + if(func->array_cnt) { + unsigned dim_cnt, array_id = 0; + dim_decl_t *dim_decl; + dim_list_t *iter; + + func->array_descs = compiler_alloc(ctx->code, func->array_cnt * sizeof(array_desc_t)); + if(!func->array_descs) + return E_OUTOFMEMORY; + + for(dim_decl = ctx->dim_decls; dim_decl; dim_decl = dim_decl->next) { + if(!dim_decl->is_array) + continue; + + dim_cnt = 0; + for(iter = dim_decl->dims; iter; iter = iter->next) + dim_cnt++; + + func->array_descs[array_id].bounds = compiler_alloc(ctx->code, dim_cnt * sizeof(SAFEARRAYBOUND)); + if(!func->array_descs[array_id].bounds) + return E_OUTOFMEMORY; + + func->array_descs[array_id].dim_cnt = dim_cnt; + + dim_cnt = 0; + for(iter = dim_decl->dims; iter; iter = iter->next) { + func->array_descs[array_id].bounds[dim_cnt].cElements = iter->val+1; + func->array_descs[array_id].bounds[dim_cnt++].lLbound = 0; + } + + array_id++; + } + + assert(array_id == func->array_cnt); + } + return S_OK; } @@ -1337,6 +1373,7 @@ static HRESULT create_function(compile_ctx_t *ctx, function_decl_t *decl, functi func->vars = NULL; func->var_cnt = 0; + func->array_cnt = 0; func->code_ctx = ctx->code; func->type = decl->type; func->is_public = decl->is_public; @@ -1637,6 +1674,7 @@ static vbscode_t *alloc_vbscode(compile_ctx_t *ctx, const WCHAR *source) ret->main_code.code_ctx = ret; ret->main_code.vars = NULL; ret->main_code.var_cnt = 0; + ret->main_code.array_cnt = 0; ret->main_code.arg_cnt = 0; ret->main_code.args = NULL; diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index b3f424467fe..7d2cd657611 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -887,6 +887,15 @@ static HRESULT interp_new(exec_ctx_t *ctx) return stack_push(ctx, &v); } +static HRESULT interp_dim(exec_ctx_t *ctx) +{ + const BSTR ident = ctx->instr->arg1.bstr; + const unsigned array_id = ctx->instr->arg2.uint; + + FIXME("%s(%d)\n", debugstr_w(ident), array_id); + return E_NOTIMPL; +} + static HRESULT interp_step(exec_ctx_t *ctx) { const BSTR ident = ctx->instr->arg2.bstr; diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index e25b524350f..47fa4c031bc 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -212,6 +212,7 @@ typedef enum { X(case, 0, ARG_ADDR, 0) \ X(concat, 1, 0, 0) \ X(const, 1, ARG_BSTR, 0) \ + X(dim, 1, ARG_BSTR, ARG_UINT) \ X(div, 1, 0, 0) \ X(double, 1, ARG_DOUBLE, 0) \ X(empty, 1, 0, 0) \ @@ -299,6 +300,11 @@ typedef struct { const WCHAR *name; } var_desc_t; +typedef struct { + unsigned dim_cnt; + SAFEARRAYBOUND *bounds; +} array_desc_t; + struct _function_t { function_type_t type; const WCHAR *name; @@ -307,6 +313,8 @@ struct _function_t { unsigned arg_cnt; var_desc_t *vars; unsigned var_cnt; + array_desc_t *array_descs; + unsigned array_cnt; unsigned code_off; vbscode_t *code_ctx; function_t *next;