vbscript: Added bytecode support for arrays.
This commit is contained in:
parent
f3e1f7002d
commit
fc713bfc12
|
@ -937,8 +937,9 @@ static HRESULT compile_dim_statement(compile_ctx_t *ctx, dim_statement_t *stat)
|
||||||
ctx->func->var_cnt++;
|
ctx->func->var_cnt++;
|
||||||
|
|
||||||
if(dim_decl->is_array) {
|
if(dim_decl->is_array) {
|
||||||
FIXME("arrays not supported\n");
|
HRESULT hres = push_instr_bstr_uint(ctx, OP_dim, dim_decl->name, ctx->func->array_cnt++);
|
||||||
return E_NOTIMPL;
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!dim_decl->next)
|
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;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1337,6 +1373,7 @@ static HRESULT create_function(compile_ctx_t *ctx, function_decl_t *decl, functi
|
||||||
|
|
||||||
func->vars = NULL;
|
func->vars = NULL;
|
||||||
func->var_cnt = 0;
|
func->var_cnt = 0;
|
||||||
|
func->array_cnt = 0;
|
||||||
func->code_ctx = ctx->code;
|
func->code_ctx = ctx->code;
|
||||||
func->type = decl->type;
|
func->type = decl->type;
|
||||||
func->is_public = decl->is_public;
|
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.code_ctx = ret;
|
||||||
ret->main_code.vars = NULL;
|
ret->main_code.vars = NULL;
|
||||||
ret->main_code.var_cnt = 0;
|
ret->main_code.var_cnt = 0;
|
||||||
|
ret->main_code.array_cnt = 0;
|
||||||
ret->main_code.arg_cnt = 0;
|
ret->main_code.arg_cnt = 0;
|
||||||
ret->main_code.args = NULL;
|
ret->main_code.args = NULL;
|
||||||
|
|
||||||
|
|
|
@ -887,6 +887,15 @@ static HRESULT interp_new(exec_ctx_t *ctx)
|
||||||
return stack_push(ctx, &v);
|
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)
|
static HRESULT interp_step(exec_ctx_t *ctx)
|
||||||
{
|
{
|
||||||
const BSTR ident = ctx->instr->arg2.bstr;
|
const BSTR ident = ctx->instr->arg2.bstr;
|
||||||
|
|
|
@ -212,6 +212,7 @@ typedef enum {
|
||||||
X(case, 0, ARG_ADDR, 0) \
|
X(case, 0, ARG_ADDR, 0) \
|
||||||
X(concat, 1, 0, 0) \
|
X(concat, 1, 0, 0) \
|
||||||
X(const, 1, ARG_BSTR, 0) \
|
X(const, 1, ARG_BSTR, 0) \
|
||||||
|
X(dim, 1, ARG_BSTR, ARG_UINT) \
|
||||||
X(div, 1, 0, 0) \
|
X(div, 1, 0, 0) \
|
||||||
X(double, 1, ARG_DOUBLE, 0) \
|
X(double, 1, ARG_DOUBLE, 0) \
|
||||||
X(empty, 1, 0, 0) \
|
X(empty, 1, 0, 0) \
|
||||||
|
@ -299,6 +300,11 @@ typedef struct {
|
||||||
const WCHAR *name;
|
const WCHAR *name;
|
||||||
} var_desc_t;
|
} var_desc_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned dim_cnt;
|
||||||
|
SAFEARRAYBOUND *bounds;
|
||||||
|
} array_desc_t;
|
||||||
|
|
||||||
struct _function_t {
|
struct _function_t {
|
||||||
function_type_t type;
|
function_type_t type;
|
||||||
const WCHAR *name;
|
const WCHAR *name;
|
||||||
|
@ -307,6 +313,8 @@ struct _function_t {
|
||||||
unsigned arg_cnt;
|
unsigned arg_cnt;
|
||||||
var_desc_t *vars;
|
var_desc_t *vars;
|
||||||
unsigned var_cnt;
|
unsigned var_cnt;
|
||||||
|
array_desc_t *array_descs;
|
||||||
|
unsigned array_cnt;
|
||||||
unsigned code_off;
|
unsigned code_off;
|
||||||
vbscode_t *code_ctx;
|
vbscode_t *code_ctx;
|
||||||
function_t *next;
|
function_t *next;
|
||||||
|
|
Loading…
Reference in New Issue