vbscript: Added set statement parser/compiler implementation.

This commit is contained in:
Jacek Caban 2011-09-15 14:17:38 +02:00 committed by Alexandre Julliard
parent e8797c29b5
commit b3a6217ed3
5 changed files with 41 additions and 5 deletions

View File

@ -475,7 +475,7 @@ static HRESULT compile_if_statement(compile_ctx_t *ctx, if_statement_t *stat)
return S_OK; return S_OK;
} }
static HRESULT compile_assign_statement(compile_ctx_t *ctx, assign_statement_t *stat) static HRESULT compile_assign_statement(compile_ctx_t *ctx, assign_statement_t *stat, BOOL is_set)
{ {
HRESULT hres; HRESULT hres;
@ -493,9 +493,9 @@ static HRESULT compile_assign_statement(compile_ctx_t *ctx, assign_statement_t *
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
hres = push_instr_bstr(ctx, OP_assign_member, stat->member_expr->identifier); hres = push_instr_bstr(ctx, is_set ? OP_set_member : OP_assign_member, stat->member_expr->identifier);
}else { }else {
hres = push_instr_bstr(ctx, OP_assign_ident, stat->member_expr->identifier); hres = push_instr_bstr(ctx, is_set ? OP_set_ident : OP_assign_ident, stat->member_expr->identifier);
} }
return hres; return hres;
@ -585,7 +585,7 @@ static HRESULT compile_statement(compile_ctx_t *ctx, statement_t *stat)
while(stat) { while(stat) {
switch(stat->type) { switch(stat->type) {
case STAT_ASSIGN: case STAT_ASSIGN:
hres = compile_assign_statement(ctx, (assign_statement_t*)stat); hres = compile_assign_statement(ctx, (assign_statement_t*)stat, FALSE);
break; break;
case STAT_CALL: case STAT_CALL:
hres = compile_member_expression(ctx, ((call_statement_t*)stat)->expr, FALSE); hres = compile_member_expression(ctx, ((call_statement_t*)stat)->expr, FALSE);
@ -605,6 +605,9 @@ static HRESULT compile_statement(compile_ctx_t *ctx, statement_t *stat)
case STAT_IF: case STAT_IF:
hres = compile_if_statement(ctx, (if_statement_t*)stat); hres = compile_if_statement(ctx, (if_statement_t*)stat);
break; break;
case STAT_SET:
hres = compile_assign_statement(ctx, (assign_statement_t*)stat, TRUE);
break;
default: default:
FIXME("Unimplemented statement type %d\n", stat->type); FIXME("Unimplemented statement type %d\n", stat->type);
hres = E_NOTIMPL; hres = E_NOTIMPL;

View File

@ -385,6 +385,13 @@ static HRESULT interp_assign_ident(exec_ctx_t *ctx)
return assign_ident(ctx, arg, v.v, v.owned); return assign_ident(ctx, arg, v.v, v.owned);
} }
static HRESULT interp_set_ident(exec_ctx_t *ctx)
{
const BSTR arg = ctx->instr->arg1.bstr;
FIXME("%s\n", debugstr_w(arg));
return E_NOTIMPL;
}
static HRESULT interp_assign_member(exec_ctx_t *ctx) static HRESULT interp_assign_member(exec_ctx_t *ctx)
{ {
BSTR identifier = ctx->instr->arg1.bstr; BSTR identifier = ctx->instr->arg1.bstr;
@ -419,6 +426,13 @@ static HRESULT interp_assign_member(exec_ctx_t *ctx)
return hres; return hres;
} }
static HRESULT interp_set_member(exec_ctx_t *ctx)
{
BSTR identifier = ctx->instr->arg1.bstr;
FIXME("%s\n", debugstr_w(identifier));
return E_NOTIMPL;
}
static HRESULT interp_jmp(exec_ctx_t *ctx) static HRESULT interp_jmp(exec_ctx_t *ctx)
{ {
const unsigned arg = ctx->instr->arg1.uint; const unsigned arg = ctx->instr->arg1.uint;

View File

@ -94,7 +94,8 @@ typedef enum {
STAT_EXITFUNC, STAT_EXITFUNC,
STAT_EXITSUB, STAT_EXITSUB,
STAT_FUNC, STAT_FUNC,
STAT_IF STAT_IF,
STAT_SET
} statement_type_t; } statement_type_t;
typedef struct _statement_t { typedef struct _statement_t {

View File

@ -49,6 +49,7 @@ static member_expression_t *new_member_expression(parser_ctx_t*,expression_t*,co
static void *new_statement(parser_ctx_t*,statement_type_t,size_t); static void *new_statement(parser_ctx_t*,statement_type_t,size_t);
static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*); static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*);
static statement_t *new_assign_statement(parser_ctx_t*,member_expression_t*,expression_t*); static statement_t *new_assign_statement(parser_ctx_t*,member_expression_t*,expression_t*);
static statement_t *new_set_statement(parser_ctx_t*,member_expression_t*,expression_t*);
static statement_t *new_dim_statement(parser_ctx_t*,dim_decl_t*); static statement_t *new_dim_statement(parser_ctx_t*,dim_decl_t*);
static statement_t *new_if_statement(parser_ctx_t*,expression_t*,statement_t*,elseif_decl_t*,statement_t*); static statement_t *new_if_statement(parser_ctx_t*,expression_t*,statement_t*,elseif_decl_t*,statement_t*);
static statement_t *new_function_statement(parser_ctx_t*,function_decl_t*); static statement_t *new_function_statement(parser_ctx_t*,function_decl_t*);
@ -146,6 +147,8 @@ Statement
| FunctionDecl { $$ = new_function_statement(ctx, $1); CHECK_ERROR; } | FunctionDecl { $$ = new_function_statement(ctx, $1); CHECK_ERROR; }
| tEXIT tFUNCTION { $$ = new_statement(ctx, STAT_EXITFUNC, 0); CHECK_ERROR; } | tEXIT tFUNCTION { $$ = new_statement(ctx, STAT_EXITFUNC, 0); CHECK_ERROR; }
| tEXIT tSUB { $$ = new_statement(ctx, STAT_EXITSUB, 0); CHECK_ERROR; } | tEXIT tSUB { $$ = new_statement(ctx, STAT_EXITSUB, 0); CHECK_ERROR; }
| tSET MemberExpression Arguments_opt '=' Expression
{ $2->args = $3; $$ = new_set_statement(ctx, $2, $5); CHECK_ERROR; }
MemberExpression MemberExpression
: tIdentifier { $$ = new_member_expression(ctx, NULL, $1); CHECK_ERROR; } : tIdentifier { $$ = new_member_expression(ctx, NULL, $1); CHECK_ERROR; }
@ -465,6 +468,19 @@ static statement_t *new_assign_statement(parser_ctx_t *ctx, member_expression_t
return &stat->stat; return &stat->stat;
} }
static statement_t *new_set_statement(parser_ctx_t *ctx, member_expression_t *left, expression_t *right)
{
assign_statement_t *stat;
stat = new_statement(ctx, STAT_SET, sizeof(*stat));
if(!stat)
return NULL;
stat->member_expr = left;
stat->value_expr = right;
return &stat->stat;
}
static dim_decl_t *new_dim_decl(parser_ctx_t *ctx, const WCHAR *name, dim_decl_t *next) static dim_decl_t *new_dim_decl(parser_ctx_t *ctx, const WCHAR *name, dim_decl_t *next)
{ {
dim_decl_t *decl; dim_decl_t *decl;

View File

@ -150,6 +150,8 @@ typedef enum {
X(null, 1, 0, 0) \ X(null, 1, 0, 0) \
X(or, 1, 0, 0) \ X(or, 1, 0, 0) \
X(ret, 0, 0, 0) \ X(ret, 0, 0, 0) \
X(set_ident, 1, ARG_BSTR, 0) \
X(set_member, 1, ARG_BSTR, 0) \
X(short, 1, ARG_INT, 0) \ X(short, 1, ARG_INT, 0) \
X(string, 1, ARG_STR, 0) \ X(string, 1, ARG_STR, 0) \
X(sub, 1, 0, 0) \ X(sub, 1, 0, 0) \