Jacek Caban : vbscript: Replace existing function for duplicated functions.
Alexandre Julliard
julliard at winehq.org
Mon Nov 4 16:40:26 CST 2019
Module: wine
Branch: master
Commit: 52bbac0a3661d1437b22cce40d4a7980c3efeaef
URL: https://source.winehq.org/git/wine.git/?a=commit;h=52bbac0a3661d1437b22cce40d4a7980c3efeaef
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Nov 4 17:37:42 2019 +0100
vbscript: Replace existing function for duplicated functions.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vbscript/compile.c | 24 +++++++++++++-----------
dlls/vbscript/tests/lang.vbs | 15 +++++++++++++++
dlls/vbscript/tests/run.c | 42 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 70 insertions(+), 11 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index dae8a97c83..6b0e113bef 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -1571,7 +1571,7 @@ static HRESULT create_function(compile_ctx_t *ctx, function_decl_t *decl, functi
function_t *func;
HRESULT hres;
- if(lookup_dim_decls(ctx, decl->name) || lookup_funcs_name(ctx, decl->name) || lookup_const_decls(ctx, decl->name, FALSE)) {
+ if(lookup_dim_decls(ctx, decl->name) || lookup_const_decls(ctx, decl->name, FALSE)) {
FIXME("%s: redefinition\n", debugstr_w(decl->name));
return E_FAIL;
}
@@ -1826,7 +1826,6 @@ static HRESULT check_script_collisions(compile_ctx_t *ctx, script_ctx_t *script)
{
class_desc_t *class;
dynamic_var_t *var;
- function_t *func;
for(var = ctx->global_vars; var; var = var->next) {
if(lookup_script_identifier(script, var->name)) {
@@ -1835,13 +1834,6 @@ static HRESULT check_script_collisions(compile_ctx_t *ctx, script_ctx_t *script)
}
}
- for(func = ctx->funcs; func; func = func->next) {
- if(lookup_script_identifier(script, func->name)) {
- FIXME("%s: redefined\n", debugstr_w(func->name));
- return E_FAIL;
- }
- }
-
for(class = ctx->classes; class; class = class->next) {
if(lookup_script_identifier(script, class->name)) {
FIXME("%s: redefined\n", debugstr_w(class->name));
@@ -1997,8 +1989,18 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli
script->global_funcs = new_funcs;
script->global_funcs_size = cnt;
}
- for(func_iter = ctx.funcs; func_iter; func_iter = func_iter->next)
- script->global_funcs[script->global_funcs_cnt++] = func_iter;
+ for(func_iter = ctx.funcs; func_iter; func_iter = func_iter->next) {
+ unsigned i;
+ for(i = 0; i < script->global_funcs_cnt; i++) {
+ if(!wcsicmp(script->global_funcs[i]->name, func_iter->name)) {
+ /* global function already exists, replace it */
+ script->global_funcs[i] = func_iter;
+ break;
+ }
+ }
+ if(i == script->global_funcs_cnt)
+ script->global_funcs[script->global_funcs_cnt++] = func_iter;
+ }
if(ctx.classes) {
class_desc_t *class = ctx.classes;
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 4623a08e2b..8a6f0ecd45 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -886,6 +886,21 @@ Public Function TestSepFunc(ByVal a) : :
End Function
Call ok(TestSepFunc(1) = 1, "Function did not return 1")
+ok duplicatedfunc() = 2, "duplicatedfunc = " & duplicatedfunc()
+
+function duplicatedfunc
+ ok false, "duplicatedfunc called"
+end function
+
+sub duplicatedfunc
+ ok false, "duplicatedfunc called"
+end sub
+
+function duplicatedfunc
+ duplicatedfunc = 2
+end function
+
+ok duplicatedfunc() = 2, "duplicatedfunc = " & duplicatedfunc()
' Stop has an effect only in debugging mode
Stop
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index d3d41a80d2..9ed1096a4d 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -2688,6 +2688,47 @@ static void test_isexpression(void)
close_script(engine);
}
+static void test_multiple_parse(void)
+{
+ IActiveScriptParse *parser;
+ IActiveScript *script;
+ HRESULT hres;
+
+ script = create_and_init_script(SCRIPTITEM_GLOBALMEMBERS, TRUE);
+
+ hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
+ ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres);
+
+ hres = IActiveScriptParse_ParseScriptText(parser,
+ L"function duplicatedfunc\n"
+ L" ok false, \"duplicatedfunc called\"\n"
+ L"end function\n",
+ NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+ ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+
+ hres = IActiveScriptParse_ParseScriptText(parser,
+ L"sub duplicatedfunc\n"
+ L" ok false, \"duplicatedfunc called\"\n"
+ L"end sub\n",
+ NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+ ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+
+ hres = IActiveScriptParse_ParseScriptText(parser,
+ L"function duplicatedfunc\n"
+ L" duplicatedfunc = 2\n"
+ L"end function\n",
+ NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+ ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+
+ hres = IActiveScriptParse_ParseScriptText(parser,
+ L"ok duplicatedfunc() = 2, \"duplicatedfunc = \" & duplicatedfunc()\n",
+ NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+ ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+
+ IActiveScriptParse_Release(parser);
+ close_script(script);
+}
+
static BSTR get_script_from_file(const char *filename)
{
DWORD size, len;
@@ -3037,6 +3078,7 @@ static void run_tests(void)
test_parse_errors();
test_parse_context();
test_callbacks();
+ test_multiple_parse();
}
static BOOL check_vbscript(void)
More information about the wine-cvs
mailing list