mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-06 15:45:00 +00:00
jscript: Store separated flag indicating if current exception value is valid.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
63683b42f7
commit
3c9b7011ff
|
@ -855,13 +855,21 @@ static HRESULT interp_case(script_ctx_t *ctx)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_error_value(script_ctx_t *ctx, jsval_t value)
|
||||||
|
{
|
||||||
|
jsexcept_t *ei = ctx->ei;
|
||||||
|
|
||||||
|
reset_ei(ei);
|
||||||
|
ei->valid_value = TRUE;
|
||||||
|
ei->value = value;
|
||||||
|
}
|
||||||
|
|
||||||
/* ECMA-262 3rd Edition 12.13 */
|
/* ECMA-262 3rd Edition 12.13 */
|
||||||
static HRESULT interp_throw(script_ctx_t *ctx)
|
static HRESULT interp_throw(script_ctx_t *ctx)
|
||||||
{
|
{
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
|
|
||||||
jsval_release(ctx->ei->value);
|
set_error_value(ctx, stack_pop(ctx));
|
||||||
ctx->ei->value = stack_pop(ctx);
|
|
||||||
return DISP_E_EXCEPTION;
|
return DISP_E_EXCEPTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -957,7 +965,7 @@ static HRESULT interp_end_finally(script_ctx_t *ctx)
|
||||||
if(!get_bool(v)) {
|
if(!get_bool(v)) {
|
||||||
TRACE("passing exception\n");
|
TRACE("passing exception\n");
|
||||||
|
|
||||||
ctx->ei->value = stack_pop(ctx);
|
set_error_value(ctx, stack_pop(ctx));
|
||||||
return DISP_E_EXCEPTION;
|
return DISP_E_EXCEPTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2713,6 +2721,7 @@ static void print_backtrace(script_ctx_t *ctx)
|
||||||
static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
|
static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
|
||||||
{
|
{
|
||||||
except_frame_t *except_frame;
|
except_frame_t *except_frame;
|
||||||
|
jsexcept_t *ei = ctx->ei;
|
||||||
call_frame_t *frame;
|
call_frame_t *frame;
|
||||||
jsval_t except_val;
|
jsval_t except_val;
|
||||||
unsigned catch_off;
|
unsigned catch_off;
|
||||||
|
@ -2724,8 +2733,8 @@ static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
|
||||||
|
|
||||||
static const WCHAR messageW[] = {'m','e','s','s','a','g','e',0};
|
static const WCHAR messageW[] = {'m','e','s','s','a','g','e',0};
|
||||||
|
|
||||||
WARN("Exception %08x %s", exception_hres, debugstr_jsval(ctx->ei->value));
|
WARN("Exception %08x %s", exception_hres, debugstr_jsval(ei->valid_value ? ei->value : jsval_undefined()));
|
||||||
if(jsval_type(ctx->ei->value) == JSV_OBJECT) {
|
if(ei->valid_value && jsval_type(ctx->ei->value) == JSV_OBJECT) {
|
||||||
error_obj = to_jsdisp(get_object(ctx->ei->value));
|
error_obj = to_jsdisp(get_object(ctx->ei->value));
|
||||||
if(error_obj) {
|
if(error_obj) {
|
||||||
hres = jsdisp_propget_name(error_obj, messageW, &msg);
|
hres = jsdisp_propget_name(error_obj, messageW, &msg);
|
||||||
|
@ -2766,8 +2775,12 @@ static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
|
||||||
frame->ip = catch_off ? catch_off : except_frame->finally_off;
|
frame->ip = catch_off ? catch_off : except_frame->finally_off;
|
||||||
if(catch_off) assert(frame->bytecode->instrs[frame->ip].op == OP_enter_catch);
|
if(catch_off) assert(frame->bytecode->instrs[frame->ip].op == OP_enter_catch);
|
||||||
|
|
||||||
except_val = ctx->ei->value;
|
if(ei->valid_value) {
|
||||||
ctx->ei->value = jsval_undefined();
|
except_val = ctx->ei->value;
|
||||||
|
ctx->ei->valid_value = FALSE;
|
||||||
|
}else {
|
||||||
|
except_val = jsval_undefined();
|
||||||
|
}
|
||||||
|
|
||||||
/* keep current except_frame if we're entering catch block with finally block associated */
|
/* keep current except_frame if we're entering catch block with finally block associated */
|
||||||
if(catch_off && except_frame->finally_off) {
|
if(catch_off && except_frame->finally_off) {
|
||||||
|
|
|
@ -222,7 +222,9 @@ static inline scope_chain_t *scope_addref(scope_chain_t *scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _jsexcept_t {
|
struct _jsexcept_t {
|
||||||
|
BOOL valid_value;
|
||||||
jsval_t value;
|
jsval_t value;
|
||||||
|
|
||||||
jsexcept_t *prev;
|
jsexcept_t *prev;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -404,7 +404,8 @@ static HRESULT throw_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str, j
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
jsval_release(ctx->ei->value);
|
reset_ei(ctx->ei);
|
||||||
|
ctx->ei->valid_value = TRUE;
|
||||||
ctx->ei->value = jsval_obj(err);
|
ctx->ei->value = jsval_obj(err);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,8 +103,10 @@ static inline BOOL is_started(script_ctx_t *ctx)
|
||||||
|
|
||||||
void reset_ei(jsexcept_t *ei)
|
void reset_ei(jsexcept_t *ei)
|
||||||
{
|
{
|
||||||
jsval_release(ei->value);
|
if(ei->valid_value) {
|
||||||
ei->value = jsval_undefined();
|
jsval_release(ei->value);
|
||||||
|
ei->valid_value = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void enter_script(script_ctx_t *ctx, jsexcept_t *ei)
|
void enter_script(script_ctx_t *ctx, jsexcept_t *ei)
|
||||||
|
|
Loading…
Reference in a new issue