Jacek Caban : jscript: Support propagating error message.

Alexandre Julliard julliard at winehq.org
Mon Feb 3 15:06:07 CST 2020


Module: wine
Branch: master
Commit: bcba07229a74f8a4e7edaa9da1a3ee4750da3492
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=bcba07229a74f8a4e7edaa9da1a3ee4750da3492

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Feb  3 14:47:25 2020 +0100

jscript: Support propagating error message.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/dispex.c  |  2 ++
 dlls/jscript/engine.c  | 14 ++++++++++++--
 dlls/jscript/engine.h  |  1 +
 dlls/jscript/error.c   |  4 +++-
 dlls/jscript/jscript.c |  4 ++++
 5 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 2038173dca..4ed327ad72 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -1978,6 +1978,8 @@ static HRESULT disp_invoke(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD f
         ctx->ei->error = (SUCCEEDED(ei.scode) || ei.scode == DISP_E_EXCEPTION) ? E_FAIL : ei.scode;
         if(ei.bstrSource)
             ctx->ei->source = jsstr_alloc_len(ei.bstrSource, SysStringLen(ei.bstrSource));
+        if(ei.bstrDescription)
+            ctx->ei->message = jsstr_alloc_len(ei.bstrDescription, SysStringLen(ei.bstrDescription));
         SysFreeString(ei.bstrSource);
         SysFreeString(ei.bstrDescription);
         SysFreeString(ei.bstrHelpFile);
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 520b62fad2..e84dd4e3d7 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -867,6 +867,7 @@ static void set_error_value(script_ctx_t *ctx, jsval_t value)
 
     if(is_object_instance(value) && get_object(value) && (obj = to_jsdisp(get_object(value)))) {
         UINT32 number;
+        jsstr_t *str;
         jsval_t v;
         HRESULT hres;
 
@@ -879,8 +880,15 @@ static void set_error_value(script_ctx_t *ctx, jsval_t value)
                 ei->error = FAILED(number) ? number : E_FAIL;
             jsval_release(v);
         }
-    }
 
+        hres = jsdisp_propget_name(obj, L"description", &v);
+        if(SUCCEEDED(hres)) {
+            hres = to_string(ctx, v, &str);
+            if(SUCCEEDED(hres))
+                ei->message = str;
+            jsval_release(v);
+        }
+    }
 }
 
 /* ECMA-262 3rd Edition    12.13 */
@@ -2769,8 +2777,10 @@ static HRESULT unwind_exception(script_ctx_t *ctx, HRESULT exception_hres)
     }
 
     frame = ctx->call_ctx;
-    if(exception_hres != DISP_E_EXCEPTION)
+    if(exception_hres != DISP_E_EXCEPTION) {
+        reset_ei(ei);
         ei->error = exception_hres;
+    }
     set_error_location(ei, frame->bytecode, frame->bytecode->instrs[frame->ip].loc, IDS_RUNTIME_ERROR);
 
     while(!frame->except_frame) {
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index 839d38d822..bb991c442e 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -228,6 +228,7 @@ struct _jsexcept_t {
     jsval_t value;
 
     jsstr_t *source;
+    jsstr_t *message;
 
     bytecode_t *code;
     unsigned loc;
diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c
index 5551ab3a89..b58210d2a7 100644
--- a/dlls/jscript/error.c
+++ b/dlls/jscript/error.c
@@ -455,6 +455,8 @@ void set_error_location(jsexcept_t *ei, bytecode_t *code, unsigned loc, unsigned
             len = LoadStringW(jscript_hinstance, source_id, (WCHAR*)&res, 0);
             ei->source = jsstr_alloc_len(res, len);
         }
+        if(!ei->message)
+            ei->message = format_error_message(ei->error, NULL);
     }
 
     TRACE("source %s in %s\n", debugstr_w(code->source + loc), debugstr_w(code->source));
@@ -538,6 +540,6 @@ jsdisp_t *create_builtin_error(script_ctx_t *ctx)
         }
     }
 
-    hres = create_error(ctx, constr, ei->error, jsstr_empty(), &r);
+    hres = create_error(ctx, constr, ei->error, ei->message ? ei->message : jsstr_empty(), &r);
     return SUCCEEDED(hres) ? r : NULL;
 }
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 09d002dbca..0e8d3ec2e9 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -223,6 +223,10 @@ void reset_ei(jsexcept_t *ei)
         jsstr_release(ei->source);
         ei->source = NULL;
     }
+    if(ei->message) {
+        jsstr_release(ei->message);
+        ei->message = NULL;
+    }
 }
 
 void enter_script(script_ctx_t *ctx, jsexcept_t *ei)




More information about the wine-cvs mailing list