Module: wine Branch: master Commit: 5ecf4364493623054f9c7ea524e3a36157f17479 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5ecf4364493623054f9c7ea524...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Sep 7 14:08:47 2011 +0200
vbscript: Added call statement compilation implementation.
---
dlls/vbscript/compile.c | 70 ++++++++++++++++++++++++++++++++++++++++++--- dlls/vbscript/interp.c | 10 +++++- dlls/vbscript/vbscript.h | 18 ++++++++++-- 3 files changed, 88 insertions(+), 10 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 4ac760b..d57abcf 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -34,6 +34,12 @@ typedef struct { vbscode_t *code; } compile_ctx_t;
+static inline instr_t *instr_ptr(compile_ctx_t *ctx, unsigned id) +{ + assert(id < ctx->instr_cnt); + return ctx->code->instrs + id; +} + static unsigned push_instr(compile_ctx_t *ctx, vbsop_t op) { assert(ctx->instr_size && ctx->instr_size >= ctx->instr_cnt); @@ -53,18 +59,72 @@ static unsigned push_instr(compile_ctx_t *ctx, vbsop_t op) return ctx->instr_cnt++; }
-static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *func) +static HRESULT push_instr_str(compile_ctx_t *ctx, vbsop_t op, const WCHAR *arg) { - func->code_off = ctx->instr_cnt; + unsigned instr;
- if(push_instr(ctx, OP_ret) == -1) + instr = push_instr(ctx, op); + if(instr == -1) return E_OUTOFMEMORY;
- if(stat) { - FIXME("statements compilation not implemented\n"); + instr_ptr(ctx, instr)->arg1.str = arg; + return S_OK; +} + +static HRESULT compile_member_expression(compile_ctx_t *ctx, member_expression_t *expr) +{ + HRESULT hres; + + if(expr->args) { + FIXME("arguments not implemented\n"); return E_NOTIMPL; }
+ if(expr->obj_expr) { + FIXME("obj_expr not implemented\n"); + hres = E_NOTIMPL; + }else { + hres = push_instr_str(ctx, OP_icallv, expr->identifier); + } + + return hres; +} + +static HRESULT compile_statement(compile_ctx_t *ctx, statement_t *stat) +{ + HRESULT hres; + + while(stat) { + switch(stat->type) { + case STAT_CALL: + hres = compile_member_expression(ctx, ((call_statement_t*)stat)->expr); + break; + default: + FIXME("Unimplemented statement type %d\n", stat->type); + hres = E_NOTIMPL; + } + + if(FAILED(hres)) + return hres; + stat = stat->next; + } + + return S_OK; +} + +static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *func) +{ + HRESULT hres; + + func->code_off = ctx->instr_cnt; + + hres = compile_statement(ctx, stat); + if(FAILED(hres)) + return hres; + + if(push_instr(ctx, OP_ret) == -1) + return E_OUTOFMEMORY; + return S_OK; }
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index 7cee9c7..3ff6bbd 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -33,6 +33,12 @@ typedef struct {
typedef HRESULT (*instr_func_t)(exec_ctx_t*);
+static HRESULT interp_icallv(exec_ctx_t *ctx) +{ + FIXME("\n"); + return E_NOTIMPL; +} + static HRESULT interp_ret(exec_ctx_t *ctx) { TRACE("\n"); @@ -42,13 +48,13 @@ static HRESULT interp_ret(exec_ctx_t *ctx) }
static const instr_func_t op_funcs[] = { -#define X(x,n) interp_ ## x, +#define X(x,n,a,b) interp_ ## x, OP_LIST #undef X };
static const unsigned op_move[] = { -#define X(x,n) n, +#define X(x,n,a,b) n, OP_LIST #undef X }; diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index 99ed4ba..bca630a 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -62,18 +62,30 @@ typedef struct {
HRESULT init_global(script_ctx_t*);
-#define OP_LIST \ - X(ret, 0) +typedef enum { + ARG_NONE = 0, + ARG_STR +} instr_arg_type_t; + +#define OP_LIST \ + X(icallv, 1, ARG_STR, 0) \ + X(ret, 0, 0, 0)
typedef enum { -#define X(x,n) OP_##x, +#define X(x,n,a,b) OP_##x, OP_LIST #undef X OP_LAST } vbsop_t;
+typedef union { + const WCHAR *str; +} instr_arg_t; + typedef struct { vbsop_t op; + instr_arg_t arg1; + instr_arg_t arg2; } instr_t;
struct _function_t {