https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3381ee4b89c4f15e09e6b…
commit 3381ee4b89c4f15e09e6b7b3384bdb7b482a42a2
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Fri Jan 19 00:45:08 2018 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Fri Jan 19 00:45:08 2018 +0100
[JSCRIPT] Sync with Wine 3.0. CORE-14225
---
dll/win32/jscript/compile.c | 7 ++++---
dll/win32/jscript/dispex.c | 4 ++++
dll/win32/jscript/engine.c | 32 +++++++++++++-------------------
dll/win32/jscript/jsutils.c | 10 ++++++++++
media/doc/README.WINE | 2 +-
5 files changed, 32 insertions(+), 23 deletions(-)
diff --git a/dll/win32/jscript/compile.c b/dll/win32/jscript/compile.c
index 7afbf01586..b9dff8fe30 100644
--- a/dll/win32/jscript/compile.c
+++ b/dll/win32/jscript/compile.c
@@ -1867,12 +1867,13 @@ static BOOL alloc_variable(compiler_ctx_t *ctx, const WCHAR *name)
return alloc_local(ctx, ident, ctx->func->var_cnt++);
}
-static BOOL visit_function_expression(compiler_ctx_t *ctx, function_expression_t *expr)
+static HRESULT visit_function_expression(compiler_ctx_t *ctx, function_expression_t
*expr)
{
expr->func_id = ctx->func->func_cnt++;
ctx->func_tail = ctx->func_tail ? (ctx->func_tail->next = expr) :
(ctx->func_head = expr);
- return !expr->identifier || expr->event_target || alloc_variable(ctx,
expr->identifier);
+ return !expr->identifier || expr->event_target || alloc_variable(ctx,
expr->identifier)
+ ? S_OK : E_OUTOFMEMORY;
}
static HRESULT visit_expression(compiler_ctx_t *ctx, expression_t *expr)
@@ -1985,7 +1986,7 @@ static HRESULT visit_expression(compiler_ctx_t *ctx, expression_t
*expr)
break;
}
case EXPR_FUNC:
- visit_function_expression(ctx, (function_expression_t*)expr);
+ hres = visit_function_expression(ctx, (function_expression_t*)expr);
break;
case EXPR_MEMBER:
hres = visit_expression(ctx, ((member_expression_t*)expr)->expression);
diff --git a/dll/win32/jscript/dispex.c b/dll/win32/jscript/dispex.c
index a6c14d6c1b..8bc03d1662 100644
--- a/dll/win32/jscript/dispex.c
+++ b/dll/win32/jscript/dispex.c
@@ -1096,6 +1096,8 @@ HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id,
WORD flags, uns
return E_FAIL;
}
+ if(ctx != jsdisp->ctx)
+ flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK;
hres = jsdisp_call(jsdisp, id, flags, argc, argv, ret);
jsdisp_release(jsdisp);
return hres;
@@ -1184,6 +1186,8 @@ HRESULT disp_call_value(script_ctx_t *ctx, IDispatch *disp,
IDispatch *jsthis, W
jsdisp = iface_to_jsdisp(disp);
if(jsdisp) {
+ if(ctx != jsdisp->ctx)
+ flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK;
hres = jsdisp_call_value(jsdisp, jsthis, flags, argc, argv, r);
jsdisp_release(jsdisp);
return hres;
diff --git a/dll/win32/jscript/engine.c b/dll/win32/jscript/engine.c
index a731930fd8..16fe6aaeae 100644
--- a/dll/win32/jscript/engine.c
+++ b/dll/win32/jscript/engine.c
@@ -18,8 +18,6 @@
#include "jscript.h"
-WINE_DECLARE_DEBUG_CHANNEL(jscript_except);
-
static const WCHAR booleanW[] =
{'b','o','o','l','e','a','n',0};
static const WCHAR functionW[] =
{'f','u','n','c','t','i','o','n',0};
static const WCHAR numberW[] =
{'n','u','m','b','e','r',0};
@@ -2661,29 +2659,27 @@ static void print_backtrace(script_ctx_t *ctx)
call_frame_t *frame;
for(frame = ctx->call_ctx; frame; frame = frame->prev_frame) {
- TRACE_(jscript_except)("%u\t", depth);
+ WARN("%u\t", depth);
depth++;
if(frame->this_obj && frame->this_obj != to_disp(ctx->global)
&& frame->this_obj != ctx->host_global)
- TRACE_(jscript_except)("%p->", frame->this_obj);
- TRACE_(jscript_except)("%s(", frame->function->name ?
debugstr_w(frame->function->name) : "[unnamed]");
+ WARN("%p->", frame->this_obj);
+ WARN("%s(", frame->function->name ?
debugstr_w(frame->function->name) : "[unnamed]");
if(frame->base_scope && frame->base_scope->frame) {
for(i=0; i < frame->argc; i++) {
if(i < frame->function->param_cnt)
- TRACE_(jscript_except)("%s%s=%s", i ? ", " :
"",
- debugstr_w(frame->function->params[i]),
- debugstr_jsval(ctx->stack[local_off(frame,
-i-1)]));
+ WARN("%s%s=%s", i ? ", " : "",
debugstr_w(frame->function->params[i]),
+ debugstr_jsval(ctx->stack[local_off(frame, -i-1)]));
else
- TRACE_(jscript_except)("%s%s", i ? ", " :
"",
- debugstr_jsval(ctx->stack[local_off(frame,
-i-1)]));
+ WARN("%s%s", i ? ", " : "",
debugstr_jsval(ctx->stack[local_off(frame, -i-1)]));
}
}else {
- TRACE_(jscript_except)("[detached frame]");
+ WARN("[detached frame]");
}
- TRACE_(jscript_except)(")\n");
+ WARN(")\n");
if(!(frame->flags & EXEC_RETURN_TO_INTERP)) {
- TRACE_(jscript_except)("%u\t[native code]\n", depth);
+ WARN("%u\t[native code]\n", depth);
depth++;
}
}
@@ -2697,26 +2693,24 @@ static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT
exception_hres)
unsigned catch_off;
HRESULT hres;
- TRACE("%08x\n", exception_hres);
-
- if(TRACE_ON(jscript_except)) {
+ if(WARN_ON(jscript)) {
jsdisp_t *error_obj;
jsval_t msg;
static const WCHAR messageW[] =
{'m','e','s','s','a','g','e',0};
- TRACE_(jscript_except)("Exception %08x %s", exception_hres,
debugstr_jsval(ctx->ei.val));
+ WARN("Exception %08x %s", exception_hres,
debugstr_jsval(ctx->ei.val));
if(jsval_type(ctx->ei.val) == JSV_OBJECT) {
error_obj = to_jsdisp(get_object(ctx->ei.val));
if(error_obj) {
hres = jsdisp_propget_name(error_obj, messageW, &msg);
if(SUCCEEDED(hres)) {
- TRACE_(jscript_except)(" (message %s)",
debugstr_jsval(msg));
+ WARN(" (message %s)", debugstr_jsval(msg));
jsval_release(msg);
}
}
}
- TRACE_(jscript_except)(" in:\n");
+ WARN(" in:\n");
print_backtrace(ctx);
}
diff --git a/dll/win32/jscript/jsutils.c b/dll/win32/jscript/jsutils.c
index 20b30f0d71..fb691afe8d 100644
--- a/dll/win32/jscript/jsutils.c
+++ b/dll/win32/jscript/jsutils.c
@@ -287,12 +287,22 @@ HRESULT variant_to_jsval(VARIANT *var, jsval_t *r)
case VT_I2:
*r = jsval_number(V_I2(var));
return S_OK;
+ case VT_UI2:
+ *r = jsval_number(V_UI2(var));
+ return S_OK;
case VT_INT:
*r = jsval_number(V_INT(var));
return S_OK;
case VT_UI4:
*r = jsval_number(V_UI4(var));
return S_OK;
+ case VT_UI8:
+ /*
+ * Native doesn't support VT_UI8 here, but it's needed for IE9+ APIs
+ * (native IE9 doesn't use jscript.dll for JavaScript).
+ */
+ *r = jsval_number(V_UI8(var));
+ return S_OK;
case VT_R4:
*r = jsval_number(V_R4(var));
return S_OK;
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index 52792aaca6..13f6bdd797 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -85,7 +85,7 @@ reactos/dll/win32/inseng # Synced to Wine-3.0
reactos/dll/win32/iphlpapi # Out of sync
reactos/dll/win32/itircl # Synced to WineStaging-2.9
reactos/dll/win32/itss # Synced to Wine-3.0
-reactos/dll/win32/jscript # Synced to WineStaging-2.16
+reactos/dll/win32/jscript # Synced to Wine-3.0
reactos/dll/win32/jsproxy # Synced to WineStaging-2.16
reactos/dll/win32/loadperf # Synced to WineStaging-2.9
reactos/dll/win32/lz32 # Synced to WineStaging-2.9