+2012-02-01 Csaba Osztrogonác <ossy@webkit.org>
+
+ Implement Error.stack
+ https://bugs.webkit.org/show_bug.cgi?id=66994
+
+ Unreviewed, rolling out r106407.
+
+ * fast/js/exception-properties-expected.txt:
+ * fast/js/script-tests/exception-properties.js:
+ * fast/js/script-tests/stack-trace.js: Removed.
+ * fast/js/stack-trace-expected.txt: Removed.
+ * fast/js/stack-trace.html: Removed.
+ * platform/chromium/test_expectations.txt:
+
2012-02-01 Yuzo Fujishima <yuzo@google.com>
[Chromium] Unreviewed test expectaion change.
PASS enumerableProperties(error) is []
-PASS enumerableProperties(nativeError) is ["line", "sourceURL", "stack"]
+PASS enumerableProperties(nativeError) is ["line", "sourceURL"]
PASS Object.getPrototypeOf(nativeError).name is "RangeError"
PASS Object.getPrototypeOf(nativeError).message is ""
PASS successfullyParsed is true
var error = new Error("message");
shouldBe('enumerableProperties(error)', '[]');
- shouldBe('enumerableProperties(nativeError)', '["line", "sourceURL", "stack"]');
+ shouldBe('enumerableProperties(nativeError)', '["line", "sourceURL"]');
shouldBe('Object.getPrototypeOf(nativeError).name', '"RangeError"');
shouldBe('Object.getPrototypeOf(nativeError).message', '""');
+++ /dev/null
-description(
-'This test checks stack trace corectness in special cases.'
-);
-
-function printStack(stackTrace) {
- debug("--> Stack Trace:")
- var length = Math.min(stackTrace.length, 100);
- for (var i = 0; i < length; i++)
- debug(" " + i + " " + stackTrace[i].substring(0, stackTrace[i].indexOf('file:')) + stackTrace[i].substring(stackTrace[i].lastIndexOf('/')+1));
-
- debug('');
-}
-
-function hostThrower() { Element.prototype.appendChild.call({ }, [{ }]); }
-function callbacker(f) { [0].map(f); }
-function outer(errorName) { inner(errorName); }
-function inner(errorName) { throw new Error("Error in " + errorName); }
-function evaler(code) { eval(code); }
-function normalOuter() { normalInner(); }
-function normalInner() { if(thisVarDoesntExist) failIfTrue("shouldFailBeforeThis") };
-function scripterInner() { htmlInner(); }
-function scripterOuter() { htmlOuter(); }
- // Expected functions in stack trace
-// Normal Case
-try { normalOuter() } catch (e) { printStack(e.stack) } // normalOuter -> normalInner
-
-// Eval Case
-try { evaler("inner('inner eval');"); } catch (e) { printStack(e.stack) } // evaler -> eval -> inner
-try { evaler("outer('outer eval');"); } catch (e) { printStack(e.stack) } // evaler -> eval -> outer -> inner
-
-// Function Callback Case
-try { callbacker(inner('inner map')); } catch (e) { printStack(e.stack); } // callbacker -> map -> inner
-try { callbacker(outer('outer map')); } catch (e) { printStack(e.stack); } // callbacker -> map -> outer -> inner
-
-// Host Code Case
-try { hostThrower(); } catch (e) { printStack(e.stack); } // hostThrower
-
-try { scripterInner(); } catch (e) { printStack(e.stack) } // program -> scripter -> inner
-try { scripterOuter(); } catch (e) { printStack(e.stack) } // program -> scripter -> outer -> inner
-
-function selfRecursive1() {
- selfRecursive1();
-}
-
-try { selfRecursive1(); } catch (e) { printStack(e.stack) } // selfRecursive1 -> selfRecursive1 -> selfRecursive1 -> selfRecursive1 ...
-
-function selfRecursive2() {
- // A little work to make the DFG kick in
- for (var i = 0; i < 10; i++) {
- if (i == 9)
- selfRecursive2();
- }
-}
-
-try { selfRecursive2(); } catch (e) { printStack(e.stack) } // selfRecursive2 -> selfRecursive2 -> selfRecursive2 -> selfRecursive2 ...
-
-function selfRecursive3() {
- eval("selfRecursive3()");
-}
-
-try { selfRecursive3(); } catch (e) { printStack(e.stack) } // selfRecursive3 -> eval -> selfRecursive3 -> eval ...
-
-
-successfullyParsed = true;
+++ /dev/null
-This test checks stack trace corectness in special cases.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
---> Stack Trace:
- 0 normalInner at stack-trace.js:20
- 1 normalOuter at stack-trace.js:19
- 2 global code at stack-trace.js:25
-
---> Stack Trace:
- 0 inner at stack-trace.js:17
- 1 eval
- 2 evaler at stack-trace.js:18
- 3 global code at stack-trace.js:28
-
---> Stack Trace:
- 0 inner at stack-trace.js:17
- 1 outer at stack-trace.js:16
- 2 eval
- 3 evaler at stack-trace.js:18
- 4 global code at stack-trace.js:29
-
---> Stack Trace:
- 0 inner at stack-trace.js:17
- 1 global code at stack-trace.js:32
-
---> Stack Trace:
- 0 inner at stack-trace.js:17
- 1 outer at stack-trace.js:16
- 2 global code at stack-trace.js:33
-
---> Stack Trace:
- 0 hostThrower at stack-trace.js:14
- 1 global code at stack-trace.js:36
-
---> Stack Trace:
- 0 htmlInner at stack-trace.html:10
- 1 scripterInner at stack-trace.js:21
- 2 global code at stack-trace.js:38
-
---> Stack Trace:
- 0 htmlInner at stack-trace.html:10
- 1 htmlOuter at stack-trace.html:11
- 2 scripterOuter at stack-trace.js:22
- 3 global code at stack-trace.js:39
-
---> Stack Trace:
- 0 selfRecursive1 at stack-trace.js:42
- 1 selfRecursive1 at stack-trace.js:42
- 2 selfRecursive1 at stack-trace.js:42
- 3 selfRecursive1 at stack-trace.js:42
- 4 selfRecursive1 at stack-trace.js:42
- 5 selfRecursive1 at stack-trace.js:42
- 6 selfRecursive1 at stack-trace.js:42
- 7 selfRecursive1 at stack-trace.js:42
- 8 selfRecursive1 at stack-trace.js:42
- 9 selfRecursive1 at stack-trace.js:42
- 10 selfRecursive1 at stack-trace.js:42
- 11 selfRecursive1 at stack-trace.js:42
- 12 selfRecursive1 at stack-trace.js:42
- 13 selfRecursive1 at stack-trace.js:42
- 14 selfRecursive1 at stack-trace.js:42
- 15 selfRecursive1 at stack-trace.js:42
- 16 selfRecursive1 at stack-trace.js:42
- 17 selfRecursive1 at stack-trace.js:42
- 18 selfRecursive1 at stack-trace.js:42
- 19 selfRecursive1 at stack-trace.js:42
- 20 selfRecursive1 at stack-trace.js:42
- 21 selfRecursive1 at stack-trace.js:42
- 22 selfRecursive1 at stack-trace.js:42
- 23 selfRecursive1 at stack-trace.js:42
- 24 selfRecursive1 at stack-trace.js:42
- 25 selfRecursive1 at stack-trace.js:42
- 26 selfRecursive1 at stack-trace.js:42
- 27 selfRecursive1 at stack-trace.js:42
- 28 selfRecursive1 at stack-trace.js:42
- 29 selfRecursive1 at stack-trace.js:42
- 30 selfRecursive1 at stack-trace.js:42
- 31 selfRecursive1 at stack-trace.js:42
- 32 selfRecursive1 at stack-trace.js:42
- 33 selfRecursive1 at stack-trace.js:42
- 34 selfRecursive1 at stack-trace.js:42
- 35 selfRecursive1 at stack-trace.js:42
- 36 selfRecursive1 at stack-trace.js:42
- 37 selfRecursive1 at stack-trace.js:42
- 38 selfRecursive1 at stack-trace.js:42
- 39 selfRecursive1 at stack-trace.js:42
- 40 selfRecursive1 at stack-trace.js:42
- 41 selfRecursive1 at stack-trace.js:42
- 42 selfRecursive1 at stack-trace.js:42
- 43 selfRecursive1 at stack-trace.js:42
- 44 selfRecursive1 at stack-trace.js:42
- 45 selfRecursive1 at stack-trace.js:42
- 46 selfRecursive1 at stack-trace.js:42
- 47 selfRecursive1 at stack-trace.js:42
- 48 selfRecursive1 at stack-trace.js:42
- 49 selfRecursive1 at stack-trace.js:42
- 50 selfRecursive1 at stack-trace.js:42
- 51 selfRecursive1 at stack-trace.js:42
- 52 selfRecursive1 at stack-trace.js:42
- 53 selfRecursive1 at stack-trace.js:42
- 54 selfRecursive1 at stack-trace.js:42
- 55 selfRecursive1 at stack-trace.js:42
- 56 selfRecursive1 at stack-trace.js:42
- 57 selfRecursive1 at stack-trace.js:42
- 58 selfRecursive1 at stack-trace.js:42
- 59 selfRecursive1 at stack-trace.js:42
- 60 selfRecursive1 at stack-trace.js:42
- 61 selfRecursive1 at stack-trace.js:42
- 62 selfRecursive1 at stack-trace.js:42
- 63 selfRecursive1 at stack-trace.js:42
- 64 selfRecursive1 at stack-trace.js:42
- 65 selfRecursive1 at stack-trace.js:42
- 66 selfRecursive1 at stack-trace.js:42
- 67 selfRecursive1 at stack-trace.js:42
- 68 selfRecursive1 at stack-trace.js:42
- 69 selfRecursive1 at stack-trace.js:42
- 70 selfRecursive1 at stack-trace.js:42
- 71 selfRecursive1 at stack-trace.js:42
- 72 selfRecursive1 at stack-trace.js:42
- 73 selfRecursive1 at stack-trace.js:42
- 74 selfRecursive1 at stack-trace.js:42
- 75 selfRecursive1 at stack-trace.js:42
- 76 selfRecursive1 at stack-trace.js:42
- 77 selfRecursive1 at stack-trace.js:42
- 78 selfRecursive1 at stack-trace.js:42
- 79 selfRecursive1 at stack-trace.js:42
- 80 selfRecursive1 at stack-trace.js:42
- 81 selfRecursive1 at stack-trace.js:42
- 82 selfRecursive1 at stack-trace.js:42
- 83 selfRecursive1 at stack-trace.js:42
- 84 selfRecursive1 at stack-trace.js:42
- 85 selfRecursive1 at stack-trace.js:42
- 86 selfRecursive1 at stack-trace.js:42
- 87 selfRecursive1 at stack-trace.js:42
- 88 selfRecursive1 at stack-trace.js:42
- 89 selfRecursive1 at stack-trace.js:42
- 90 selfRecursive1 at stack-trace.js:42
- 91 selfRecursive1 at stack-trace.js:42
- 92 selfRecursive1 at stack-trace.js:42
- 93 selfRecursive1 at stack-trace.js:42
- 94 selfRecursive1 at stack-trace.js:42
- 95 selfRecursive1 at stack-trace.js:42
- 96 selfRecursive1 at stack-trace.js:42
- 97 selfRecursive1 at stack-trace.js:42
- 98 selfRecursive1 at stack-trace.js:42
- 99 selfRecursive1 at stack-trace.js:42
-
---> Stack Trace:
- 0 selfRecursive2 at stack-trace.js:51
- 1 selfRecursive2 at stack-trace.js:51
- 2 selfRecursive2 at stack-trace.js:51
- 3 selfRecursive2 at stack-trace.js:51
- 4 selfRecursive2 at stack-trace.js:51
- 5 selfRecursive2 at stack-trace.js:51
- 6 selfRecursive2 at stack-trace.js:51
- 7 selfRecursive2 at stack-trace.js:51
- 8 selfRecursive2 at stack-trace.js:51
- 9 selfRecursive2 at stack-trace.js:51
- 10 selfRecursive2 at stack-trace.js:51
- 11 selfRecursive2 at stack-trace.js:51
- 12 selfRecursive2 at stack-trace.js:51
- 13 selfRecursive2 at stack-trace.js:51
- 14 selfRecursive2 at stack-trace.js:51
- 15 selfRecursive2 at stack-trace.js:51
- 16 selfRecursive2 at stack-trace.js:51
- 17 selfRecursive2 at stack-trace.js:51
- 18 selfRecursive2 at stack-trace.js:51
- 19 selfRecursive2 at stack-trace.js:51
- 20 selfRecursive2 at stack-trace.js:51
- 21 selfRecursive2 at stack-trace.js:51
- 22 selfRecursive2 at stack-trace.js:51
- 23 selfRecursive2 at stack-trace.js:51
- 24 selfRecursive2 at stack-trace.js:51
- 25 selfRecursive2 at stack-trace.js:51
- 26 selfRecursive2 at stack-trace.js:51
- 27 selfRecursive2 at stack-trace.js:51
- 28 selfRecursive2 at stack-trace.js:51
- 29 selfRecursive2 at stack-trace.js:51
- 30 selfRecursive2 at stack-trace.js:51
- 31 selfRecursive2 at stack-trace.js:51
- 32 selfRecursive2 at stack-trace.js:51
- 33 selfRecursive2 at stack-trace.js:51
- 34 selfRecursive2 at stack-trace.js:51
- 35 selfRecursive2 at stack-trace.js:51
- 36 selfRecursive2 at stack-trace.js:51
- 37 selfRecursive2 at stack-trace.js:51
- 38 selfRecursive2 at stack-trace.js:51
- 39 selfRecursive2 at stack-trace.js:51
- 40 selfRecursive2 at stack-trace.js:51
- 41 selfRecursive2 at stack-trace.js:51
- 42 selfRecursive2 at stack-trace.js:51
- 43 selfRecursive2 at stack-trace.js:51
- 44 selfRecursive2 at stack-trace.js:51
- 45 selfRecursive2 at stack-trace.js:51
- 46 selfRecursive2 at stack-trace.js:51
- 47 selfRecursive2 at stack-trace.js:51
- 48 selfRecursive2 at stack-trace.js:51
- 49 selfRecursive2 at stack-trace.js:51
- 50 selfRecursive2 at stack-trace.js:51
- 51 selfRecursive2 at stack-trace.js:51
- 52 selfRecursive2 at stack-trace.js:51
- 53 selfRecursive2 at stack-trace.js:51
- 54 selfRecursive2 at stack-trace.js:51
- 55 selfRecursive2 at stack-trace.js:51
- 56 selfRecursive2 at stack-trace.js:51
- 57 selfRecursive2 at stack-trace.js:51
- 58 selfRecursive2 at stack-trace.js:51
- 59 selfRecursive2 at stack-trace.js:51
- 60 selfRecursive2 at stack-trace.js:51
- 61 selfRecursive2 at stack-trace.js:51
- 62 selfRecursive2 at stack-trace.js:51
- 63 selfRecursive2 at stack-trace.js:51
- 64 selfRecursive2 at stack-trace.js:51
- 65 selfRecursive2 at stack-trace.js:51
- 66 selfRecursive2 at stack-trace.js:51
- 67 selfRecursive2 at stack-trace.js:51
- 68 selfRecursive2 at stack-trace.js:51
- 69 selfRecursive2 at stack-trace.js:51
- 70 selfRecursive2 at stack-trace.js:51
- 71 selfRecursive2 at stack-trace.js:51
- 72 selfRecursive2 at stack-trace.js:51
- 73 selfRecursive2 at stack-trace.js:51
- 74 selfRecursive2 at stack-trace.js:51
- 75 selfRecursive2 at stack-trace.js:51
- 76 selfRecursive2 at stack-trace.js:51
- 77 selfRecursive2 at stack-trace.js:51
- 78 selfRecursive2 at stack-trace.js:51
- 79 selfRecursive2 at stack-trace.js:51
- 80 selfRecursive2 at stack-trace.js:51
- 81 selfRecursive2 at stack-trace.js:51
- 82 selfRecursive2 at stack-trace.js:51
- 83 selfRecursive2 at stack-trace.js:51
- 84 selfRecursive2 at stack-trace.js:51
- 85 selfRecursive2 at stack-trace.js:51
- 86 selfRecursive2 at stack-trace.js:51
- 87 selfRecursive2 at stack-trace.js:51
- 88 selfRecursive2 at stack-trace.js:51
- 89 selfRecursive2 at stack-trace.js:51
- 90 selfRecursive2 at stack-trace.js:51
- 91 selfRecursive2 at stack-trace.js:51
- 92 selfRecursive2 at stack-trace.js:51
- 93 selfRecursive2 at stack-trace.js:51
- 94 selfRecursive2 at stack-trace.js:51
- 95 selfRecursive2 at stack-trace.js:51
- 96 selfRecursive2 at stack-trace.js:51
- 97 selfRecursive2 at stack-trace.js:51
- 98 selfRecursive2 at stack-trace.js:51
- 99 selfRecursive2 at stack-trace.js:51
-
---> Stack Trace:
- 0 selfRecursive3 at stack-trace.js:58
- 1 eval
- 2 selfRecursive3 at stack-trace.js:58
- 3 eval
- 4 selfRecursive3 at stack-trace.js:58
- 5 eval
- 6 selfRecursive3 at stack-trace.js:58
- 7 eval
- 8 selfRecursive3 at stack-trace.js:58
- 9 eval
- 10 selfRecursive3 at stack-trace.js:58
- 11 eval
- 12 selfRecursive3 at stack-trace.js:58
- 13 eval
- 14 selfRecursive3 at stack-trace.js:58
- 15 eval
- 16 selfRecursive3 at stack-trace.js:58
- 17 eval
- 18 selfRecursive3 at stack-trace.js:58
- 19 eval
- 20 selfRecursive3 at stack-trace.js:58
- 21 eval
- 22 selfRecursive3 at stack-trace.js:58
- 23 eval
- 24 selfRecursive3 at stack-trace.js:58
- 25 eval
- 26 selfRecursive3 at stack-trace.js:58
- 27 eval
- 28 selfRecursive3 at stack-trace.js:58
- 29 eval
- 30 selfRecursive3 at stack-trace.js:58
- 31 eval
- 32 selfRecursive3 at stack-trace.js:58
- 33 eval
- 34 selfRecursive3 at stack-trace.js:58
- 35 eval
- 36 selfRecursive3 at stack-trace.js:58
- 37 eval
- 38 selfRecursive3 at stack-trace.js:58
- 39 eval
- 40 selfRecursive3 at stack-trace.js:58
- 41 eval
- 42 selfRecursive3 at stack-trace.js:58
- 43 eval
- 44 selfRecursive3 at stack-trace.js:58
- 45 eval
- 46 selfRecursive3 at stack-trace.js:58
- 47 eval
- 48 selfRecursive3 at stack-trace.js:58
- 49 eval
- 50 selfRecursive3 at stack-trace.js:58
- 51 eval
- 52 selfRecursive3 at stack-trace.js:58
- 53 eval
- 54 selfRecursive3 at stack-trace.js:58
- 55 eval
- 56 selfRecursive3 at stack-trace.js:58
- 57 eval
- 58 selfRecursive3 at stack-trace.js:58
- 59 eval
- 60 selfRecursive3 at stack-trace.js:58
- 61 eval
- 62 selfRecursive3 at stack-trace.js:58
- 63 eval
- 64 selfRecursive3 at stack-trace.js:58
- 65 eval
- 66 selfRecursive3 at stack-trace.js:58
- 67 eval
- 68 selfRecursive3 at stack-trace.js:58
- 69 eval
- 70 selfRecursive3 at stack-trace.js:58
- 71 eval
- 72 selfRecursive3 at stack-trace.js:58
- 73 eval
- 74 selfRecursive3 at stack-trace.js:58
- 75 eval
- 76 selfRecursive3 at stack-trace.js:58
- 77 eval
- 78 selfRecursive3 at stack-trace.js:58
- 79 eval
- 80 selfRecursive3 at stack-trace.js:58
- 81 eval
- 82 selfRecursive3 at stack-trace.js:58
- 83 eval
- 84 selfRecursive3 at stack-trace.js:58
- 85 eval
- 86 selfRecursive3 at stack-trace.js:58
- 87 eval
- 88 selfRecursive3 at stack-trace.js:58
- 89 eval
- 90 selfRecursive3 at stack-trace.js:58
- 91 eval
- 92 selfRecursive3 at stack-trace.js:58
- 93 eval
- 94 selfRecursive3 at stack-trace.js:58
- 95 eval
- 96 selfRecursive3 at stack-trace.js:58
- 97 eval
- 98 selfRecursive3 at stack-trace.js:58
- 99 eval
-
-
+++ /dev/null
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
- <link rel="stylesheet" href="resources/js-test-style.css">
- <script src="resources/js-test-pre.js"></script>
-</head>
-<body>
- <p id="description"></p>
- <p id="console"></p>
- <script>function htmlInner() { throw new Error("Error in HTML"); }</script>
- <script>function htmlOuter() { htmlInner(); }</script>
- <script src="script-tests/stack-trace.js"></script>
-</body>
-</html>
// throw. V8 follows the spec.
WONTFIX SKIP : fast/js/reparsing-semicolon-insertion.html = FAIL
-// This tests stack-traces that are generated by JSC. This test should
-// fail since it is specific to jsc.
-WONTFIX SKIP : fast/js/stack-trace.html = FAIL
-
// Rubber-banding is currently a CG only feature.
WONTFIX : platform/chromium/rubberbanding = FAIL
WONTFIX : platform/chromium/compositing/rubberbanding = IMAGE
+2012-02-01 Csaba Osztrogonác <ossy@webkit.org>
+
+ Implement Error.stack
+ https://bugs.webkit.org/show_bug.cgi?id=66994
+
+ Unreviewed, rolling out r106407.
+
+ * JavaScriptCore.exp:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+ * interpreter/AbstractPC.cpp:
+ (JSC::AbstractPC::AbstractPC):
+ * interpreter/Interpreter.cpp:
+ (JSC::Interpreter::throwException):
+ * interpreter/Interpreter.h:
+ (JSC):
+ (Interpreter):
+ * jsc.cpp:
+ (GlobalObject::finishCreation):
+ * parser/Parser.h:
+ (JSC::::parse):
+ * runtime/CommonIdentifiers.h:
+ * runtime/Error.cpp:
+ (JSC::addErrorInfo):
+ * runtime/Error.h:
+ (JSC):
+
2012-01-31 Hajime Morrita <morrita@chromium.org>
Add missing JS_PRIVATE_EXPORTs
__ZN3JSC10JSFunctionC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE
__ZN3JSC10throwErrorEPNS_9ExecStateENS_7JSValueE
__ZN3JSC10throwErrorEPNS_9ExecStateEPNS_8JSObjectE
-__ZN3JSC11Interpreter13getStackTraceEPNS_12JSGlobalDataEiRN3WTF6VectorINS_10StackFrameELm0EEE
+__ZN3JSC11JSByteArray10putByIndexEPNS_6JSCellEPNS_9ExecStateEjNS_7JSValueE
__ZN3JSC11JSByteArray15createStructureERNS_12JSGlobalDataEPNS_14JSGlobalObjectENS_7JSValueEPKNS_9ClassInfoE
__ZN3JSC11JSByteArray18getOwnPropertySlotEPNS_6JSCellEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE
__ZN3JSC11JSByteArray19getOwnPropertyNamesEPNS_8JSObjectEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE
?getPropertyDescriptor@JSObject@JSC@@QAE_NPAVExecState@2@ABVIdentifier@2@AAVPropertyDescriptor@2@@Z
?getPropertyNames@JSObject@JSC@@SAXPAV12@PAVExecState@2@AAVPropertyNameArray@2@W4EnumerationMode@2@@Z
?getSlice@ArgList@JSC@@QBEXHAAV12@@Z
- ?getStackTrace@Interpreter@JSC@@SAXPAVJSGlobalData@2@HAAV?$Vector@UStackFrame@JSC@@$0A@@WTF@@@Z
?getString@JSCell@JSC@@QBE?AVUString@2@PAVExecState@2@@Z
?getString@JSCell@JSC@@QBE_NPAVExecState@2@AAVUString@2@@Z
?getter@PropertyDescriptor@JSC@@QBE?AVJSValue@2@XZ
#endif
#if ENABLE(INTERPRETER)
- UNUSED_PARAM(globalData);
m_pointer = exec->returnVPC();
m_mode = Interpreter;
#endif
#include "JSActivation.h"
#include "JSArray.h"
#include "JSByteArray.h"
+#include "JSFunction.h"
#include "JSNotAnObject.h"
#include "JSPropertyNameIterator.h"
#include "LiteralParser.h"
#include "Register.h"
#include "SamplingTool.h"
#include "StrictEvalActivation.h"
-#include "StrongInlines.h"
#include "UStringConcatenate.h"
#include <limits.h>
#include <stdio.h>
exception->putDirect(*globalData, globalData->propertyNames->message, jsString(globalData, message));
}
-static void getCallerLine(JSGlobalData* globalData, CallFrame* callFrame, int& lineNumber)
-{
- (void)globalData;
- unsigned bytecodeOffset;
- lineNumber = -1;
- callFrame = callFrame->removeHostCallFrameFlag();
-
- if (callFrame->callerFrame() == CallFrame::noCaller() || callFrame->callerFrame()->hasHostCallFrameFlag())
- return;
-
- CodeBlock* callerCodeBlock = callFrame->callerFrame()->removeHostCallFrameFlag()->codeBlock();
-
-#if ENABLE(INTERPRETER)
- if (!globalData->canUseJIT())
- bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnVPC());
-#if ENABLE(JIT)
- else
- bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnPC());
-#endif
-#else
- bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnPC());
-#endif
-
- lineNumber = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset - 1);
-}
-
-static ALWAYS_INLINE const UString getSourceURLFromCallFrame(CallFrame* callFrame)
-{
- if (callFrame->hasHostCallFrameFlag())
- return UString();
-#if ENABLE(INTERPRETER)
-#if ENABLE(JIT)
- if (callFrame->globalData().canUseJIT())
- return callFrame->codeBlock()->ownerExecutable()->sourceURL();
-#endif
- return callFrame->codeBlock()->source()->url();
-
-#else
- return callFrame->codeBlock()->ownerExecutable()->sourceURL();
-#endif
-}
-
-static StackFrameCodeType getStackFrameCodeType(CallFrame* callFrame)
-{
- if (callFrame->hasHostCallFrameFlag())
- return StackFrameNativeCode;
-
- switch (callFrame->codeBlock()->codeType()) {
- case EvalCode:
- return StackFrameEvalCode;
- case FunctionCode:
- return StackFrameFunctionCode;
- case GlobalCode:
- return StackFrameGlobalCode;
- }
- ASSERT_NOT_REACHED();
- return StackFrameGlobalCode;
-}
-
-void Interpreter::getStackTrace(JSGlobalData* globalData, int line, Vector<StackFrame>& results)
-{
- CallFrame* callFrame = globalData->topCallFrame->removeHostCallFrameFlag();
- if (!callFrame || callFrame == CallFrame::noCaller() || !callFrame->codeBlock())
- return;
- UString sourceURL;
- UString traceLevel;
-
- while (callFrame && callFrame != CallFrame::noCaller()) {
- if (callFrame->codeBlock()) {
- sourceURL = getSourceURLFromCallFrame(callFrame);
-
- StackFrame s = { Strong<JSObject>(*globalData, callFrame->callee()), getStackFrameCodeType(callFrame), Strong<ExecutableBase>(*globalData, callFrame->codeBlock()->ownerExecutable()), line, sourceURL};
-
- results.append(s);
- }
- getCallerLine(globalData, callFrame, line);
- callFrame = callFrame->callerFrame()->removeHostCallFrameFlag();
- }
-}
-
NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSValue& exceptionValue, unsigned bytecodeOffset)
{
CodeBlock* codeBlock = callFrame->codeBlock();
// FIXME: should only really be adding these properties to VM generated exceptions,
// but the inspector currently requires these for all thrown objects.
- Vector<StackFrame> stackTrace;
- getStackTrace(&callFrame->globalData(), codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), stackTrace);
- addErrorInfo(callFrame, exception, codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), codeBlock->ownerExecutable()->source(), stackTrace);
+ addErrorInfo(callFrame, exception, codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), codeBlock->ownerExecutable()->source());
}
isInterrupt = isInterruptedExecutionException(exception) || isTerminatedExecutionException(exception);
#include "ArgList.h"
#include "JSCell.h"
-#include "JSFunction.h"
#include "JSValue.h"
#include "JSObject.h"
#include "Opcode.h"
class CodeBlock;
class EvalExecutable;
- class ExecutableBase;
class FunctionExecutable;
+ class JSFunction;
class JSGlobalObject;
class ProgramExecutable;
class Register;
WillExecuteStatement
};
- enum StackFrameCodeType {
- StackFrameGlobalCode,
- StackFrameEvalCode,
- StackFrameFunctionCode,
- StackFrameNativeCode
- };
-
- struct StackFrame {
- Strong<JSObject> callee;
- StackFrameCodeType codeType;
- Strong<ExecutableBase> executable;
- int line;
- UString sourceURL;
- UString toString(CallFrame* callFrame) const
- {
- bool hasSourceURLInfo = !sourceURL.isNull() && !sourceURL.isEmpty();
- bool hasLineInfo = line > -1;
- String traceLine;
- JSObject* stackFrameCallee = callee.get();
-
- switch (codeType) {
- case StackFrameEvalCode:
- if (hasSourceURLInfo) {
- traceLine = hasLineInfo ? String::format("eval at %s:%d", sourceURL.ascii().data(), line)
- : String::format("eval at %s", sourceURL.ascii().data());
- } else
- traceLine = String::format("eval");
- break;
- case StackFrameNativeCode:
- traceLine = "Native code";
- break;
- case StackFrameFunctionCode:
- if (stackFrameCallee && stackFrameCallee->inherits(&JSFunction::s_info)) {
- UString functionName = asFunction(stackFrameCallee)->name(callFrame);
- if (hasSourceURLInfo) {
- traceLine = hasLineInfo ? String::format("%s at %s:%d", functionName.ascii().data(), sourceURL.ascii().data(), line)
- : String::format("%s at %s", functionName.ascii().data(), sourceURL.ascii().data());
- } else
- traceLine = String::format("%s\n", functionName.ascii().data());
- break;
- }
- case StackFrameGlobalCode:
- if (hasSourceURLInfo) {
- traceLine = hasLineInfo ? String::format("global code at %s:%d", sourceURL.ascii().data(), line)
- : String::format("global code at %s", sourceURL.ascii().data());
- } else
- traceLine = String::format("global code");
-
- }
- return traceLine.impl();
- }
- };
-
class TopCallFrameSetter {
public:
TopCallFrameSetter(JSGlobalData& global, CallFrame* callFrame)
NEVER_INLINE HandlerInfo* throwException(CallFrame*&, JSValue&, unsigned bytecodeOffset);
NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine);
- static const UString getTraceLine(CallFrame*, StackFrameCodeType, const UString&, int);
- JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, int line, Vector<StackFrame>& results);
void dumpSampleData(ExecState* exec);
void startSampling();
#include "CurrentTime.h"
#include "ExceptionHelpers.h"
#include "InitializeThreading.h"
-#include "Interpreter.h"
#include "JSArray.h"
#include "JSFunction.h"
#include "JSLock.h"
static EncodedJSValue JSC_HOST_CALL functionPrint(ExecState*);
static EncodedJSValue JSC_HOST_CALL functionDebug(ExecState*);
-static EncodedJSValue JSC_HOST_CALL functionJSCStack(ExecState*);
static EncodedJSValue JSC_HOST_CALL functionGC(ExecState*);
#ifndef NDEBUG
static EncodedJSValue JSC_HOST_CALL functionReleaseExecutableMemory(ExecState*);
addFunction(globalData, "run", functionRun, 1);
addFunction(globalData, "load", functionLoad, 1);
addFunction(globalData, "checkSyntax", functionCheckSyntax, 1);
- addFunction(globalData, "jscStack", functionJSCStack, 1);
addFunction(globalData, "readline", functionReadline, 0);
addFunction(globalData, "preciseTime", functionPreciseTime, 0);
#if ENABLE(SAMPLING_FLAGS)
return JSValue::encode(jsUndefined());
}
-EncodedJSValue JSC_HOST_CALL functionJSCStack(ExecState* exec)
-{
- String trace = "--> Stack trace:\n";
- Vector<StackFrame> stackTrace;
- Interpreter::getStackTrace(&exec->globalData(), -1, stackTrace);
- int i = 0;
-
- for (Vector<StackFrame>::iterator iter = stackTrace.begin(); iter < stackTrace.end(); iter++) {
- StackFrame level = *iter;
- trace += String::format(" %i %s\n", i, level.toString(exec).utf8().data());
- i++;
- }
- fprintf(stderr, "%s", trace.utf8().data());
- return JSValue::encode(jsUndefined());
-}
-
EncodedJSValue JSC_HOST_CALL functionGC(ExecState* exec)
{
JSLock lock(SilenceAssertionsOnly);
else if (isEvalNode<ParsedNode>())
*exception = createSyntaxError(lexicalGlobalObject, errMsg);
else
- *exception = addErrorInfo(&lexicalGlobalObject->globalData(), createSyntaxError(lexicalGlobalObject, errMsg), errLine, *m_source, Vector<StackFrame>());
+ *exception = addErrorInfo(&lexicalGlobalObject->globalData(), createSyntaxError(lexicalGlobalObject, errMsg), errLine, *m_source);
}
if (debugger && !ParsedNode::scopeIsFunction)
macro(prototype) \
macro(set) \
macro(source) \
- macro(stack) \
macro(test) \
macro(toExponential) \
macro(toFixed) \
#include "ConstructData.h"
#include "ErrorConstructor.h"
-#include "ExceptionHelpers.h"
#include "FunctionPrototype.h"
-#include "JSArray.h"
#include "JSFunction.h"
#include "JSGlobalObject.h"
#include "JSObject.h"
return createURIError(exec->lexicalGlobalObject(), message);
}
-JSObject* addErrorInfo(JSGlobalData* globalData, JSObject* error, int line, const SourceCode& source, const Vector<StackFrame>& stackTrace)
+JSObject* addErrorInfo(JSGlobalData* globalData, JSObject* error, int line, const SourceCode& source)
{
const UString& sourceURL = source.provider()->url();
error->putDirect(*globalData, Identifier(globalData, linePropertyName), jsNumber(line), ReadOnly | DontDelete);
if (!sourceURL.isNull())
error->putDirect(*globalData, Identifier(globalData, sourceURLPropertyName), jsString(globalData, sourceURL), ReadOnly | DontDelete);
- if (!stackTrace.isEmpty()) {
- JSGlobalObject* globalObject = 0;
- if (isTerminatedExecutionException(error) || isInterruptedExecutionException(error))
- globalObject = globalData->dynamicGlobalObject;
- else
- globalObject = error->globalObject();
- // We use the tryCreateUninitialized creation mechanism and related initialization
- // functions as they're the only mechanism we currently have that will guarantee we
- // don't call setters on the prototype. Technically it's faster than the alternative,
- // but the numerous allocations that take place in this loop makes that last bit
- // somewhat moot.
- JSArray* stackTraceArray = JSArray::tryCreateUninitialized(*globalData, globalObject->arrayStructure(), stackTrace.size());
- if (!stackTraceArray)
- return error;
- for (unsigned i = 0; i < stackTrace.size(); i++) {
- UString stackLevel = stackTrace[i].toString(globalObject->globalExec());
- stackTraceArray->initializeIndex(*globalData, i, jsString(globalData, stackLevel));
- }
- stackTraceArray->completeInitialization(stackTrace.size());
- error->putDirect(*globalData, globalData->propertyNames->stack, stackTraceArray, ReadOnly | DontDelete);
- }
return error;
}
-JSObject* addErrorInfo(ExecState* exec, JSObject* error, int line, const SourceCode& source, const Vector<StackFrame>& stackTrace)
+JSObject* addErrorInfo(ExecState* exec, JSObject* error, int line, const SourceCode& source)
{
- return addErrorInfo(&exec->globalData(), error, line, source, stackTrace);
+ return addErrorInfo(&exec->globalData(), error, line, source);
}
bool hasErrorInfo(ExecState* exec, JSObject* error)
#define Error_h
#include "InternalFunction.h"
-#include "Interpreter.h"
#include "JSObject.h"
#include <stdint.h>
// Methods to add
bool hasErrorInfo(ExecState*, JSObject* error);
- JSObject* addErrorInfo(JSGlobalData*, JSObject* error, int line, const SourceCode&, const Vector<StackFrame>&);
+ JSObject* addErrorInfo(JSGlobalData*, JSObject* error, int line, const SourceCode&);
// ExecState wrappers.
- JSObject* addErrorInfo(ExecState*, JSObject* error, int line, const SourceCode&, const Vector<StackFrame>&);
+ JSObject* addErrorInfo(ExecState*, JSObject* error, int line, const SourceCode&);
// Methods to throw Errors.
JS_EXPORT_PRIVATE JSValue throwError(ExecState*, JSValue);