vbscript: Added On Error statement parser implementation.

oldstable
Jacek Caban 2011-09-19 14:10:19 +02:00 committed by Alexandre Julliard
parent afffa2c58c
commit 6afc32c97d
5 changed files with 37 additions and 0 deletions

View File

@ -697,6 +697,11 @@ static HRESULT compile_exitprop_statement(compile_ctx_t *ctx)
return push_instr_addr(ctx, OP_jmp, ctx->prop_end_label);
}
static HRESULT compile_onerror_statement(compile_ctx_t *ctx, onerror_statement_t *stat)
{
return push_instr_int(ctx, OP_errmode, stat->resume_next);
}
static HRESULT compile_statement(compile_ctx_t *ctx, statement_t *stat)
{
HRESULT hres;
@ -734,6 +739,9 @@ static HRESULT compile_statement(compile_ctx_t *ctx, statement_t *stat)
case STAT_IF:
hres = compile_if_statement(ctx, (if_statement_t*)stat);
break;
case STAT_ONERROR:
hres = compile_onerror_statement(ctx, (onerror_statement_t*)stat);
break;
case STAT_SET:
hres = compile_assign_statement(ctx, (assign_statement_t*)stat, TRUE);
break;

View File

@ -732,6 +732,13 @@ static HRESULT interp_bool(exec_ctx_t *ctx)
return stack_push(ctx, &v);
}
static HRESULT interp_errmode(exec_ctx_t *ctx)
{
const int err_mode = ctx->instr->arg1.uint;
FIXME("%d\n", err_mode);
return E_NOTIMPL;
}
static HRESULT interp_string(exec_ctx_t *ctx)
{
VARIANT v;

View File

@ -107,6 +107,7 @@ typedef enum {
STAT_EXITSUB,
STAT_FUNC,
STAT_IF,
STAT_ONERROR,
STAT_SET,
STAT_STOP,
STAT_UNTIL,
@ -194,6 +195,11 @@ typedef struct {
statement_t *body;
} while_statement_t;
typedef struct {
statement_t stat;
BOOL resume_next;
} onerror_statement_t;
typedef struct {
const WCHAR *code;
const WCHAR *ptr;

View File

@ -55,6 +55,7 @@ static statement_t *new_dim_statement(parser_ctx_t*,dim_decl_t*);
static statement_t *new_while_statement(parser_ctx_t*,statement_type_t,expression_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_onerror_statement(parser_ctx_t*,BOOL);
static dim_decl_t *new_dim_decl(parser_ctx_t*,const WCHAR*,dim_decl_t*);
static elseif_decl_t *new_elseif_decl(parser_ctx_t*,expression_t*,statement_t*);
@ -170,6 +171,8 @@ Statement
| tSET MemberExpression Arguments_opt '=' Expression
{ $2->args = $3; $$ = new_set_statement(ctx, $2, $5); CHECK_ERROR; }
| tSTOP { $$ = new_statement(ctx, STAT_STOP, 0); CHECK_ERROR; }
| tON tERROR tRESUME tNEXT { $$ = new_onerror_statement(ctx, TRUE); CHECK_ERROR; }
| tON tERROR tGOTO '0' { $$ = new_onerror_statement(ctx, FALSE); CHECK_ERROR; }
MemberExpression
: tIdentifier { $$ = new_member_expression(ctx, NULL, $1); CHECK_ERROR; }
@ -614,6 +617,18 @@ static statement_t *new_if_statement(parser_ctx_t *ctx, expression_t *expr, stat
return &stat->stat;
}
static statement_t *new_onerror_statement(parser_ctx_t *ctx, BOOL resume_next)
{
onerror_statement_t *stat;
stat = new_statement(ctx, STAT_ONERROR, sizeof(*stat));
if(!stat)
return NULL;
stat->resume_next = resume_next;
return &stat->stat;
}
static arg_decl_t *new_argument_decl(parser_ctx_t *ctx, const WCHAR *name, BOOL by_ref)
{
arg_decl_t *arg_decl;

View File

@ -186,6 +186,7 @@ typedef enum {
X(double, 1, ARG_DOUBLE, 0) \
X(empty, 1, 0, 0) \
X(equal, 1, 0, 0) \
X(errmode, 1, ARG_INT, 0) \
X(eqv, 1, 0, 0) \
X(exp, 1, 0, 0) \
X(gt, 1, 0, 0) \