Closed
Bug 190809
Opened 23 years ago
Closed 15 years ago
in a toString() method, the error output is suppressed
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
DUPLICATE
of bug 645468
People
(Reporter: mschneider, Unassigned)
Details
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Build Identifier: SpiderMonkey 1.5 RC 5
when i implement a toString() method for a javascript object, all error output
is suppressed. this is because js_DefaultValue() calls js_TryMethod which sets
the error reporter to NULL (jsobj.c:3380). this leads to the very uncool
situation that if a toString() script contains an error, the execution of that
script is terminated without any feedback..
Reproducible: Always
Steps to Reproduce:
function HierarchyElement(bla)
{
this.bla=bla;
}
HierarchyElement.prototype.toString = function()
{
this.bla += this.blubber() + " " + this.bla;
return this.bla;
}
var xxx = new HierarchyElement("Hello, World!");
write(xxx);
Actual Results:
the script terminates execution in the toString method.
Expected Results:
call the errorhandler before, so that our implementation can give a feedback
to the user
Comment 1•23 years ago
|
||
When I run your example in the JS shell, this is what I get:
[//d/JS_TRUNK/mozilla/js/src/WINNT4.0_DBG.OBJ]./js
js> load('test.js');
test.js:11: TypeError: this.blubber is not a function
As you say, the reported error is inside the user-defined toString() method:
this.bla += this.blubber() + " " + this.bla; <<<--------------- LINE 11
Isn't this informative enough? Just looking for extra clarification; thanks -
Assignee: rogerl → khanson
Status: UNCONFIRMED → NEW
Ever confirmed: true
Comment 2•23 years ago
|
||
I think the idea is that we should be calling the onerror handler...
| Reporter | ||
Comment 3•23 years ago
|
||
okay, i've looked deeper in that problem and here's what i've found out:
because the error handler is not called directly but an exception is raised,
it does not matter if the errorReporter is set to NULL in js_TryMethod() or
not.. the problem is that our implementation has the following code in a
wrapped jsvalue -> string conversion method:
JSString* pjsString = JS_ValueToString(cx, val);
char* cStr = NULL;
if (pjsString) {
cStr = JS_GetStringBytes(pjsString);
} else {
JS_ReportError(cx, "Conversion to String failed.");
}
return cStr;
JS_ReportError() reports the "Conversion to String failed" error, but the
initial exception will be deleted :(
okay, this is not a problem as we can just make the JS_IsExceptionPending()
check before calling JS_ReportError()..
But what im still worring about is that this bug breaks my debugger
implementation in a toString() method. this is because for the watches i
evaluate the watch expression in the right stack frame.. for the time of the
evaluation of the expression i redirect the error callbacks on rt-
>debugErrorHook so that im able to decide after the evaluation if the watch
expression was successfully executed.. unfortunately, in jscntxt.c:327 the
check
} else if (cx->runtime->debugErrorHook && cx->errorReporter) {
makes that the debugger gets not error callback.. the same effect i have
with "normal" script errors in a toString() method -> because the debug error
callback is not called, i cannot display the error location
so the bug may be here in this check? why is the check to cx->errorReporter?
must we care if only a debugger error callback is defined or could we still
call it?
thanks!
Comment 4•23 years ago
|
||
cc'ing JS experts -
Updated•20 years ago
|
Assignee: khanson → general
QA Contact: pschwartau → general
Updated•15 years ago
|
Status: NEW → RESOLVED
Closed: 15 years ago
Resolution: --- → DUPLICATE
You need to log in
before you can comment on or make changes to this bug.
Description
•