Jacek Caban : vbscript: Added function parser implementation.
Alexandre Julliard
julliard at winehq.org
Wed Sep 14 12:25:41 CDT 2011
Module: wine
Branch: master
Commit: 78957118fb91c3fc4aecb6ec19f1225f796f9d2f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=78957118fb91c3fc4aecb6ec19f1225f796f9d2f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 14 16:55:51 2011 +0200
vbscript: Added function parser implementation.
---
dlls/vbscript/compile.c | 2 +
dlls/vbscript/parser.y | 2 +
dlls/vbscript/tests/lang.vbs | 63 ++++++++++++++++++++++++++++++++++++++++
dlls/vbscript/tests/vbscript.c | 3 --
dlls/vbscript/vbscript.h | 1 +
5 files changed, 68 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index dd756b3..a4608be 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -621,6 +621,7 @@ static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *f
if(ctx->sub_end_label == -1)
return E_OUTOFMEMORY;
break;
+ case FUNC_FUNCTION: /* FIXME */
case FUNC_GLOBAL:
break;
}
@@ -833,6 +834,7 @@ static vbscode_t *alloc_vbscode(compile_ctx_t *ctx, const WCHAR *source)
ret->bstr_pool = NULL;
ret->bstr_pool_size = 0;
ret->bstr_cnt = 0;
+ ret->global_executed = FALSE;
ret->global_code.type = FUNC_GLOBAL;
ret->global_code.name = NULL;
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index f406f8e..36edc02 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -253,6 +253,8 @@ PrimaryExpression
FunctionDecl
: /* Storage_opt */ tSUB tIdentifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tSUB
{ $$ = new_function_decl(ctx, $2, FUNC_SUB, $3, $5); CHECK_ERROR; }
+ | /* Storage_opt */ tFUNCTION tIdentifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tFUNCTION
+ { $$ = new_function_decl(ctx, $2, FUNC_FUNCTION, $3, $5); CHECK_ERROR; }
ArgumentsDecl_opt
: EmptyBrackets_opt { $$ = NULL; }
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index a46394b..5f47360 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -241,4 +241,67 @@ y = true
Call TestSubLocalVal
Call ok(x, "global x is not true?")
+if false then
+Function testfunc
+ x = true
+End Function
+end if
+
+x = false
+Call TestFunc
+Call ok(x, "x is false, testfunc not called?")
+
+Function FuncSetTrue(v)
+ Call ok(not v, "v is not true")
+ v = true
+End Function
+
+x = false
+FuncSetTrue x
+Call ok(x, "x was not set by FuncSetTrue")
+
+FuncSetTrue false
+Call ok(not false, "false is no longer false?")
+
+Function FuncSetTrue2(ByRef v)
+ Call ok(not v, "v is not true")
+ v = true
+End Function
+
+x = false
+FuncSetTrue2 x
+Call ok(x, "x was not set by FuncSetTrue")
+
+Function TestFuncArgVal(ByVal v)
+ Call ok(not v, "v is not false")
+ v = true
+ Call ok(v, "v is not true?")
+End Function
+
+x = false
+Call TestFuncArgVal(x)
+Call ok(not x, "x is true after TestFuncArgVal call?")
+
+Function TestFuncMultiArgs(a,b,c,d,e)
+ Call ok(a=1, "a = " & a)
+ Call ok(b=2, "b = " & b)
+ Call ok(c=3, "c = " & c)
+ Call ok(d=4, "d = " & d)
+ Call ok(e=5, "e = " & e)
+End Function
+
+TestFuncMultiArgs 1, 2, 3, 4, 5
+Call TestFuncMultiArgs(1, 2, 3, 4, 5)
+
+Function TestFuncLocalVal
+ x = false
+ Call ok(not x, "local x is not false?")
+ Dim x
+End Function
+
+x = true
+y = true
+Call TestFuncLocalVal
+Call ok(x, "global x is not true?")
+
reportSuccess()
diff --git a/dlls/vbscript/tests/vbscript.c b/dlls/vbscript/tests/vbscript.c
index ab5c8af..6ead8f4 100644
--- a/dlls/vbscript/tests/vbscript.c
+++ b/dlls/vbscript/tests/vbscript.c
@@ -412,7 +412,6 @@ static void test_vbscript_uninitializing(void)
test_state(script, SCRIPTSTATE_INITIALIZED);
hres = IActiveScriptParse64_ParseScriptText(parse, script_textW, NULL, NULL, NULL, 0, 1, 0x42, NULL, NULL);
- todo_wine
ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
@@ -441,9 +440,7 @@ static void test_vbscript_uninitializing(void)
hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
CHECK_CALLED(OnStateChange_CONNECTED);
- todo_wine
CHECK_CALLED(OnEnterScript);
- todo_wine
CHECK_CALLED(OnLeaveScript);
test_state(script, SCRIPTSTATE_CONNECTED);
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index cf625cc..5e86176 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -164,6 +164,7 @@ typedef struct {
typedef enum {
FUNC_GLOBAL,
+ FUNC_FUNCTION,
FUNC_SUB
} function_type_t;
More information about the wine-cvs
mailing list