Jacek Caban : vbscript: Added parser/compiler support for |option explicit| .
Alexandre Julliard
julliard at winehq.org
Fri Sep 9 10:56:47 CDT 2011
Module: wine
Branch: master
Commit: 8108b4040ca140dd7567adf698943de56edaa616
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8108b4040ca140dd7567adf698943de56edaa616
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Sep 9 14:47:00 2011 +0200
vbscript: Added parser/compiler support for |option explicit|.
---
dlls/vbscript/compile.c | 2 ++
dlls/vbscript/interp.c | 5 ++++-
dlls/vbscript/parse.h | 1 +
dlls/vbscript/parser.y | 14 +++++++++++---
dlls/vbscript/tests/lang.vbs | 2 ++
dlls/vbscript/vbscript.h | 2 ++
6 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 7e8fe3b..ea55177 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -256,6 +256,8 @@ static vbscode_t *alloc_vbscode(compile_ctx_t *ctx, const WCHAR *source)
ctx->instr_cnt = 0;
ctx->instr_size = 32;
+ ret->option_explicit = ctx->parser.option_explicit;
+
ret->bstr_pool = NULL;
ret->bstr_pool_size = 0;
ret->bstr_cnt = 0;
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index f5254c4..a33ff90 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -29,6 +29,7 @@ typedef struct {
vbscode_t *code;
instr_t *instr;
script_ctx_t *script;
+ function_t *func;
unsigned stack_size;
unsigned top;
@@ -70,7 +71,8 @@ static HRESULT lookup_identifier(exec_ctx_t *ctx, BSTR name, ref_t *ref)
}
}
- FIXME("create if no option explicit\n");
+ if(!ctx->func->code_ctx->option_explicit)
+ FIXME("create an attempt to set\n");
ref->type = REF_NONE;
return S_OK;
@@ -223,6 +225,7 @@ HRESULT exec_script(script_ctx_t *ctx, function_t *func)
exec.code = func->code_ctx;
exec.instr = exec.code->instrs + func->code_off;
exec.script = ctx;
+ exec.func = func;
while(exec.instr) {
op = exec.instr->op;
diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h
index a0c7f2c..5f7fba2 100644
--- a/dlls/vbscript/parse.h
+++ b/dlls/vbscript/parse.h
@@ -63,6 +63,7 @@ typedef struct {
const WCHAR *ptr;
const WCHAR *end;
+ BOOL option_explicit;
BOOL parse_complete;
HRESULT hres;
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index 72790fa..258420d 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -31,7 +31,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
static int parser_error(const char*);
-static void parse_complete(parser_ctx_t*);
+ static void parse_complete(parser_ctx_t*,BOOL);
static void source_add_statement(parser_ctx_t*,statement_t*);
@@ -54,6 +54,7 @@ static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*);
statement_t *statement;
expression_t *expression;
member_expression_t *member;
+ BOOL bool;
}
%token tEOF tNL tREM tEMPTYBRACKETS
@@ -75,11 +76,16 @@ static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*);
%type <expression> Expression LiteralExpression
%type <member> MemberExpression
%type <expression> Arguments_opt ArgumentList_opt ArgumentList
+%type <bool> OptionExplicit_opt
%%
Program
- : SourceElements tEOF { parse_complete(ctx); }
+ : OptionExplicit_opt SourceElements tEOF { parse_complete(ctx, $1); }
+
+OptionExplicit_opt
+ : /* empty */ { $$ = FALSE; }
+ | tOPTION tEXPLICIT tNL { $$ = TRUE; }
SourceElements
: /* empty */
@@ -137,9 +143,10 @@ static void source_add_statement(parser_ctx_t *ctx, statement_t *stat)
}
}
-static void parse_complete(parser_ctx_t *ctx)
+static void parse_complete(parser_ctx_t *ctx, BOOL option_explicit)
{
ctx->parse_complete = TRUE;
+ ctx->option_explicit = option_explicit;
}
static void *new_expression(parser_ctx_t *ctx, expression_type_t type, unsigned size)
@@ -240,6 +247,7 @@ HRESULT parse_script(parser_ctx_t *ctx, const WCHAR *code)
ctx->last_token = tNL;
ctx->last_nl = 0;
ctx->stats = ctx->stats_tail = NULL;
+ ctx->option_explicit = FALSE;
parser_parse(ctx);
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 55a8cad..07585fa 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -16,6 +16,8 @@
' Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
'
+Option Explicit
+
call ok(true, "true is not true?")
ok true, "true is not true?"
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index a1428bb..54d7da5 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -109,6 +109,8 @@ struct _vbscode_t {
instr_t *instrs;
WCHAR *source;
+ BOOL option_explicit;
+
BOOL global_executed;
function_t global_code;
More information about the wine-cvs
mailing list