Function.prototype.toString should not decompile the AST
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Mar 2015 20:12:10 +0000 (20:12 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Mar 2015 20:12:10 +0000 (20:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=142853

Reviewed by Sam Weinig.

Source/JavaScriptCore:

To recover the function parameter string, Function.prototype.toString
decompiles the function parameters from the AST. This is bad for a few
reasons:

(1) It requires us to keep pieces of the AST live forever. This is an
awkward design and a waste of memory.

(2) It doesn't match Firefox or Chrome (because it changes whitespace
and ES6 destructuring expressions).

(3) It doesn't scale to ES6 default argument parameters, which require
arbitrarily complex decompilation.

(4) It can counterfeit all the line numbers in a function (because
whitespace can include newlines).

(5) It's expensive, and we've seen cases where websites invoke
Function.prototype.toString a lot by accident.

The fix is to do what we do for the rest of the function: Just quote the
original source text.

Since this change inevitably changes some function stringification, I
took the opportunity to make our stringification match Firefox's and
Chrome's.

* API/tests/testapi.c:
(assertEqualsAsUTF8String): Be more informative when this fails.

(main): Updated to match new stringification rules.

* bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedFunctionExecutable::paramString): Deleted. Yay!
* bytecode/UnlinkedCodeBlock.h:

* parser/Nodes.h:
(JSC::StatementNode::isFuncDeclNode): New helper for constructing
anonymous functions.

* parser/SourceCode.h:
(JSC::SourceCode::SourceCode): Allow zero because WebCore wants it.

* runtime/CodeCache.cpp:
(JSC::CodeCache::getFunctionExecutableFromGlobalCode): Updated for use
of function declaration over function expression.

* runtime/Executable.cpp:
(JSC::FunctionExecutable::paramString): Deleted. Yay!
* runtime/Executable.h:
(JSC::FunctionExecutable::parameterCount):

* runtime/FunctionConstructor.cpp:
(JSC::constructFunctionSkippingEvalEnabledCheck): Added a newline after
the opening brace to match Firefox and Chrome, and a space after the comma
to match Firefox and WebKit coding style. Added the function name to
the text of the function so it would look right when stringify-ing. Switched
from parentheses to braces to produce a function declaration instead of
a function expression because we are required to exclude the function's
name from its scope, and that's what a function declaration does.

* runtime/FunctionPrototype.cpp:
(JSC::functionProtoFuncToString): Removed an old workaround because the
library it worked around doesn't really exist anymore, and the behavior
doesn't match Firefox or Chrome. Use type profiling offsets instead of
function body offsets because we want to include the function name and
the parameter string, rather than stitching them in manually by
decompiling the AST.

(JSC::insertSemicolonIfNeeded): Deleted.

* tests/mozilla/js1_2/function/tostring-1.js:
* tests/mozilla/js1_5/Scope/regress-185485.js:
(with.g): Updated these test results for formatting changes.

Source/WebCore:

* bindings/js/JSLazyEventListener.cpp:
(WebCore::JSLazyEventListener::initializeJSFunction): Adjust the line
number of attribute event listeners to account for the leading newline
now added by JavaScriptCore.

This solution is not perfect, but there are a lot of pre-existing problems
with line and column reporting for attribute event listeners, and this
preserves existing behavior with reasonable reliability.

LayoutTests:

Updated test results to match new rules for Function.prototype.toString.

* fast/dom/TreeWalker/acceptNode-filter-expected.txt: Removed a space
because it was not in the original source.

* fast/events/window-onerror2-expected.txt: Column number changed because
the event listener body starts on its own line now. This was a bit wrong
before and is still a bit wrong now in a different way.

* fast/profiler/dead-time-expected.txt:
* fast/profiler/inline-event-handler-expected.txt:
* fast/profiler/stop-profiling-after-setTimeout-expected.txt: Line number
changed because WebCore shifts line nubmers on attribute event listeners
by one.

* js/class-syntax-default-constructor-expected.txt: Constructor name
is not present now because it is not present in the source text. This
test failed before and it still fails now in a slightly different way.

* js/destructuring-assignment-expected.txt: Destructuring arguments now
match their source text faithfully.

* js/dfg-redundant-load-of-captured-variable-proven-constant-expected.txt:
Removed a space because it was not present in the original source text.

* js/dfg-resolve-global-specific-dictionary-expected.txt: Ditto.

* js/function-toString-semicolon-insertion-expected.txt: Removed.
* js/script-tests/function-toString-semicolon-insertion.js: Removed.
* js/function-toString-semicolon-insertion.html: Removed. This test checked
for a work-around that I have removed.

* js/object-literal-computed-methods-expected.txt:
* js/object-literal-methods-expected.txt: These tests fail because object
literal methods do not register their function names appropriately. This
was a pre-existing failure that is now more explicit.

* js/dom/JSON-parse-expected.txt:
* js/dom/JSON-stringify-expected.txt: Whitespace removed because it was
not present in the original.

* js/dom/dfg-strcat-over-objects-then-exit-on-it-expected.txt: Ditto.

* js/dom/function-prototype-expected.txt:
* js/dom/function-prototype.html: Ditto.

* js/dom/parse-error-external-script-in-new-Function-expected.txt: Line
changed by one due to new extra newline.

* js/dom/script-start-end-locations-expected.txt: Lines and columns
changed due to new extra newline.

* js/dom/toString-and-valueOf-override-expected.txt: Whitespace removed
because it was not present in the original.

* js/dom/script-tests/dfg-strcat-over-objects-then-exit-on-it.js: Ditto.

* js/kde/lval-exceptions-expected.txt: Ditto.

* js/script-tests/dfg-redundant-load-of-captured-variable-proven-constant.js: Ditto.

* js/script-tests/dfg-resolve-global-specific-dictionary.js: Ditto.

* platform/mac/http/tests/media/media-source/mediasource-sourcebuffer-mode-expected.txt: Ditto.

* storage/domstorage/localstorage/string-conversion-expected.txt: Ditto.

* storage/domstorage/sessionstorage/string-conversion-expected.txt: Ditto.

* userscripts/window-onerror-for-isolated-world-1-expected.txt:
* userscripts/window-onerror-for-isolated-world-2-expected.txt: Line numbers
changed because of new anonymous function formatting. These line numbers
were wrong before and they are still wrong now.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@181810 268f45cc-cd09-0410-ab3c-d52691b4dbfc

48 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/TreeWalker/acceptNode-filter-expected.txt
LayoutTests/fast/events/window-onerror2-expected.txt
LayoutTests/fast/profiler/dead-time-expected.txt
LayoutTests/fast/profiler/inline-event-handler-expected.txt
LayoutTests/fast/profiler/stop-profiling-after-setTimeout-expected.txt
LayoutTests/js/class-syntax-default-constructor-expected.txt
LayoutTests/js/destructuring-assignment-expected.txt
LayoutTests/js/dfg-redundant-load-of-captured-variable-proven-constant-expected.txt
LayoutTests/js/dfg-resolve-global-specific-dictionary-expected.txt
LayoutTests/js/dom/JSON-parse-expected.txt
LayoutTests/js/dom/JSON-stringify-expected.txt
LayoutTests/js/dom/dfg-strcat-over-objects-then-exit-on-it-expected.txt
LayoutTests/js/dom/function-prototype-expected.txt
LayoutTests/js/dom/function-prototype.html
LayoutTests/js/dom/parse-error-external-script-in-new-Function-expected.txt
LayoutTests/js/dom/script-start-end-locations-expected.txt
LayoutTests/js/dom/script-tests/dfg-strcat-over-objects-then-exit-on-it.js
LayoutTests/js/dom/toString-and-valueOf-override-expected.txt
LayoutTests/js/function-toString-semicolon-insertion-expected.txt [deleted file]
LayoutTests/js/function-toString-semicolon-insertion.html [deleted file]
LayoutTests/js/kde/lval-exceptions-expected.txt
LayoutTests/js/object-literal-computed-methods-expected.txt
LayoutTests/js/object-literal-methods-expected.txt
LayoutTests/js/script-tests/dfg-redundant-load-of-captured-variable-proven-constant.js
LayoutTests/js/script-tests/dfg-resolve-global-specific-dictionary.js
LayoutTests/js/script-tests/function-toString-semicolon-insertion.js [deleted file]
LayoutTests/platform/mac/http/tests/media/media-source/mediasource-sourcebuffer-mode-expected.txt
LayoutTests/storage/domstorage/localstorage/string-conversion-expected.txt
LayoutTests/storage/domstorage/sessionstorage/string-conversion-expected.txt
LayoutTests/userscripts/window-onerror-for-isolated-world-1-expected.txt
LayoutTests/userscripts/window-onerror-for-isolated-world-2-expected.txt
Source/JavaScriptCore/API/tests/testapi.c
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp
Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h
Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
Source/JavaScriptCore/parser/Nodes.h
Source/JavaScriptCore/parser/SourceCode.h
Source/JavaScriptCore/runtime/CodeCache.cpp
Source/JavaScriptCore/runtime/Executable.cpp
Source/JavaScriptCore/runtime/Executable.h
Source/JavaScriptCore/runtime/FunctionConstructor.cpp
Source/JavaScriptCore/runtime/FunctionPrototype.cpp
Source/JavaScriptCore/tests/mozilla/js1_2/function/tostring-1.js
Source/JavaScriptCore/tests/mozilla/js1_5/Scope/regress-185485.js
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSLazyEventListener.cpp

index 8cc8401..e756d10 100644 (file)
@@ -1,3 +1,84 @@
+2015-03-19  Geoffrey Garen  <ggaren@apple.com>
+
+        Function.prototype.toString should not decompile the AST
+        https://bugs.webkit.org/show_bug.cgi?id=142853
+
+        Reviewed by Sam Weinig.
+
+        Updated test results to match new rules for Function.prototype.toString.
+
+        * fast/dom/TreeWalker/acceptNode-filter-expected.txt: Removed a space
+        because it was not in the original source.
+
+        * fast/events/window-onerror2-expected.txt: Column number changed because
+        the event listener body starts on its own line now. This was a bit wrong
+        before and is still a bit wrong now in a different way.
+
+        * fast/profiler/dead-time-expected.txt:
+        * fast/profiler/inline-event-handler-expected.txt:
+        * fast/profiler/stop-profiling-after-setTimeout-expected.txt: Line number
+        changed because WebCore shifts line nubmers on attribute event listeners
+        by one.
+
+        * js/class-syntax-default-constructor-expected.txt: Constructor name 
+        is not present now because it is not present in the source text. This
+        test failed before and it still fails now in a slightly different way.
+
+        * js/destructuring-assignment-expected.txt: Destructuring arguments now
+        match their source text faithfully.
+
+        * js/dfg-redundant-load-of-captured-variable-proven-constant-expected.txt:
+        Removed a space because it was not present in the original source text.
+
+        * js/dfg-resolve-global-specific-dictionary-expected.txt: Ditto.
+
+        * js/function-toString-semicolon-insertion-expected.txt: Removed.
+        * js/script-tests/function-toString-semicolon-insertion.js: Removed.
+        * js/function-toString-semicolon-insertion.html: Removed. This test checked
+        for a work-around that I have removed.
+
+        * js/object-literal-computed-methods-expected.txt:
+        * js/object-literal-methods-expected.txt: These tests fail because object
+        literal methods do not register their function names appropriately. This
+        was a pre-existing failure that is now more explicit.
+
+        * js/dom/JSON-parse-expected.txt:
+        * js/dom/JSON-stringify-expected.txt: Whitespace removed because it was
+        not present in the original.
+
+        * js/dom/dfg-strcat-over-objects-then-exit-on-it-expected.txt: Ditto.
+
+        * js/dom/function-prototype-expected.txt:
+        * js/dom/function-prototype.html: Ditto.
+
+        * js/dom/parse-error-external-script-in-new-Function-expected.txt: Line
+        changed by one due to new extra newline.
+
+        * js/dom/script-start-end-locations-expected.txt: Lines and columns
+        changed due to new extra newline.
+
+        * js/dom/toString-and-valueOf-override-expected.txt: Whitespace removed
+        because it was not present in the original.
+
+        * js/dom/script-tests/dfg-strcat-over-objects-then-exit-on-it.js: Ditto.
+
+        * js/kde/lval-exceptions-expected.txt: Ditto.
+
+        * js/script-tests/dfg-redundant-load-of-captured-variable-proven-constant.js: Ditto.
+
+        * js/script-tests/dfg-resolve-global-specific-dictionary.js: Ditto.
+
+        * platform/mac/http/tests/media/media-source/mediasource-sourcebuffer-mode-expected.txt: Ditto.
+
+        * storage/domstorage/localstorage/string-conversion-expected.txt: Ditto.
+
+        * storage/domstorage/sessionstorage/string-conversion-expected.txt: Ditto.
+
+        * userscripts/window-onerror-for-isolated-world-1-expected.txt:
+        * userscripts/window-onerror-for-isolated-world-2-expected.txt: Line numbers
+        changed because of new anonymous function formatting. These line numbers
+        were wrong before and they are still wrong now.
+
 2015-03-20  Brent Fulgham  <bfulgham@apple.com>
 
         [Win] Add some skips to support EWS use.
index ca5da84..cce626d 100644 (file)
@@ -42,7 +42,7 @@ PASS walker.firstChild(); walker.currentNode.id is 'A1'
 PASS walker.nextNode(); walker.currentNode.id is 'B1'
 
 Testing acceptNode callee
-Callee: function (node) {
+Callee: function(node) {
     debug('Callee: ' + arguments.callee);
     return NodeFilter.FILTER_ACCEPT;
   }
index 3e81824..09cd787 100644 (file)
@@ -1,6 +1,6 @@
 Test that uncaught exceptions will be reported to the window.onerror handler. Bug 8519.
 
 Main frame window.onerror: Error: Inline script exception at window-onerror2.html, line: 34, column: 47
-Main frame window.onerror: Exception in onload at window-onerror2.html, line: 2, column: 167
+Main frame window.onerror: Exception in onload at window-onerror2.html, line: 2, column: 66
 Main frame window.onerror: Error: Exception in setTimeout at window-onerror2.html, line: 29, column: 47
 
index a3b5bcf..efdf99b 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Dead time in profile.
 Thread_1 (no file) (line 0:0)
-   onload dead-time.html (line 21:45)
+   onload dead-time.html (line 20:52)
       startTest dead-time.html (line 13:1)
          setTimeout (no file) (line 0:0)
    (program) dead-time.html (line 1:1)
index 4a5f8c7..ac41064 100644 (file)
@@ -7,7 +7,7 @@ Thread_1 (no file) (line 0:0)
    startTest inline-event-handler.html (line 11:1)
       getElementById (no file) (line 0:0)
       click (no file) (line 0:0)
-         onclick inline-event-handler.html (line 31:127)
+         onclick inline-event-handler.html (line 30:135)
             eventListener inline-event-handler.html (line 17:26)
                anonymousFunction profiler-test-JS-resources.js (line 29:37)
                   insertNewText profiler-test-JS-resources.js (line 17:26)
index 220b299..b618c5f 100644 (file)
@@ -4,7 +4,7 @@ To run this test manually, load it in the browser then load the WebInspector and
 
 Profile title: Stop profiling from a timeout
 Thread_1 (no file) (line 0:0)
-   onload stop-profiling-after-setTimeout.html (line 21:45)
+   onload stop-profiling-after-setTimeout.html (line 20:52)
       startTest stop-profiling-after-setTimeout.html (line 13:1)
          setTimeout (no file) (line 0:0)
    (program) stop-profiling-after-setTimeout.html (line 1:1)
index 8553d86..35d97d5 100644 (file)
@@ -11,7 +11,7 @@ PASS class B extends A { }; new B instanceof A; new B instanceof A is true
 PASS B() threw exception TypeError: Cannot call a class constructor.
 PASS B.prototype.constructor.name is "B"
 PASS A !== B is true
-FAIL A.prototype.constructor should be function B() { super(...arguments); }. Was function A() { }.
+FAIL A.prototype.constructor should be function () { super(...arguments); }. Was function () { }.
 PASS new (class extends (class { constructor(a, b) { return [a, b]; } }) {})(1, 2) is [1, 2]
 PASS successfullyParsed is true
 
index b59ee1a..411aad5 100644 (file)
@@ -6,75 +6,75 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS var [a,b]=['1','2']; var r=a+b; r is '12'
 Function as String: (function([a,b]) { return a+b;})
 PASS (function([a,b]) { return a+b;})(['1','2']) is '12'
-PASS (function ([a,b]) { return a+b;})(['1','2']) is '12'
+PASS (function([a,b]) { return a+b;})(['1','2']) is '12'
 PASS ([a,b]=['1','2']); var r=a+b; r is '12'
 PASS [a,b]=['1','2']; var r=a+b; r is '12'
 PASS var {a,b}={a:'1',b:'2'}; var r=a+b; r is '12'
 Function as String: (function({a,b}) { return a+b;})
 PASS (function({a,b}) { return a+b;})({a:'1',b:'2'}) is '12'
-PASS (function ({a:a,b:b}) { return a+b;})({a:'1',b:'2'}) is '12'
+PASS (function({a,b}) { return a+b;})({a:'1',b:'2'}) is '12'
 PASS ({a,b}={a:'1',b:'2'}); var r=a+b; r is '12'
 PASS var {c:a,d:b}={c:'1',d:'2'}; var r=a+b; r is '12'
 Function as String: (function({c:a,d:b}) { return a+b;})
 PASS (function({c:a,d:b}) { return a+b;})({c:'1',d:'2'}) is '12'
-PASS (function ({c:a,d:b}) { return a+b;})({c:'1',d:'2'}) is '12'
+PASS (function({c:a,d:b}) { return a+b;})({c:'1',d:'2'}) is '12'
 PASS ({c:a,d:b}={c:'1',d:'2'}); var r=a+b; r is '12'
 PASS var {c:b,d:a}={c:'1',d:'2'}; var r=a+b; r is '21'
 Function as String: (function({c:b,d:a}) { return a+b;})
 PASS (function({c:b,d:a}) { return a+b;})({c:'1',d:'2'}) is '21'
-PASS (function ({c:b,d:a}) { return a+b;})({c:'1',d:'2'}) is '21'
+PASS (function({c:b,d:a}) { return a+b;})({c:'1',d:'2'}) is '21'
 PASS ({c:b,d:a}={c:'1',d:'2'}); var r=a+b; r is '21'
 PASS var {true:a,false:b,undefined:c,null:d,in:e,for:f,1.5:g,'foo bar':h}={true:'a',false:'b',undefined:'c',null:'d',in:'e',for:'f',1.5:'g','foo bar':'h'}; var r=a+b+c+d+e+f+g+h; r is 'abcdefgh'
 Function as String: (function({true:a,false:b,undefined:c,null:d,in:e,for:f,1.5:g,'foo bar':h}) { return a+b+c+d+e+f+g+h;})
 PASS (function({true:a,false:b,undefined:c,null:d,in:e,for:f,1.5:g,'foo bar':h}) { return a+b+c+d+e+f+g+h;})({true:'a',false:'b',undefined:'c',null:'d',in:'e',for:'f',1.5:'g','foo bar':'h'}) is 'abcdefgh'
-PASS (function ({true:a,false:b,undefined:c,null:d,in:e,for:f,1.5:g,"foo bar":h}) { return a+b+c+d+e+f+g+h;})({true:'a',false:'b',undefined:'c',null:'d',in:'e',for:'f',1.5:'g','foo bar':'h'}) is 'abcdefgh'
+PASS (function({true:a,false:b,undefined:c,null:d,in:e,for:f,1.5:g,'foo bar':h}) { return a+b+c+d+e+f+g+h;})({true:'a',false:'b',undefined:'c',null:'d',in:'e',for:'f',1.5:'g','foo bar':'h'}) is 'abcdefgh'
 PASS ({true:a,false:b,undefined:c,null:d,in:e,for:f,1.5:g,'foo bar':h}={true:'a',false:'b',undefined:'c',null:'d',in:'e',for:'f',1.5:'g','foo bar':'h'}); var r=a+b+c+d+e+f+g+h; r is 'abcdefgh'
 PASS var [{c:a,d:b}]=[{c:'1',d:'2'}]; var r=a+b; r is '12'
 Function as String: (function([{c:a,d:b}]) { return a+b;})
 PASS (function([{c:a,d:b}]) { return a+b;})([{c:'1',d:'2'}]) is '12'
-PASS (function ([{c:a,d:b}]) { return a+b;})([{c:'1',d:'2'}]) is '12'
+PASS (function([{c:a,d:b}]) { return a+b;})([{c:'1',d:'2'}]) is '12'
 PASS ([{c:a,d:b}]=[{c:'1',d:'2'}]); var r=a+b; r is '12'
 PASS [{c:a,d:b}]=[{c:'1',d:'2'}]; var r=a+b; r is '12'
 PASS var {x:[{c:a,d:b}]}={x:[{c:'1',d:'2'}]}; var r=a+b; r is '12'
 Function as String: (function({x:[{c:a,d:b}]}) { return a+b;})
 PASS (function({x:[{c:a,d:b}]}) { return a+b;})({x:[{c:'1',d:'2'}]}) is '12'
-PASS (function ({x:[{c:a,d:b}]}) { return a+b;})({x:[{c:'1',d:'2'}]}) is '12'
+PASS (function({x:[{c:a,d:b}]}) { return a+b;})({x:[{c:'1',d:'2'}]}) is '12'
 PASS ({x:[{c:a,d:b}]}={x:[{c:'1',d:'2'}]}); var r=a+b; r is '12'
 PASS var [a,b]=anArray; var r=a+b; r is '12'
 Function as String: (function([a,b]) { return a+b;})
 PASS (function([a,b]) { return a+b;})(anArray) is '12'
-PASS (function ([a,b]) { return a+b;})(anArray) is '12'
+PASS (function([a,b]) { return a+b;})(anArray) is '12'
 PASS ([a,b]=anArray); var r=a+b; r is '12'
 PASS [a,b]=anArray; var r=a+b; r is '12'
 PASS var {a,b}=anArray; var r=a+b; r is '34'
 Function as String: (function({a,b}) { return a+b;})
 PASS (function({a,b}) { return a+b;})(anArray) is '34'
-PASS (function ({a:a,b:b}) { return a+b;})(anArray) is '34'
+PASS (function({a,b}) { return a+b;})(anArray) is '34'
 PASS ({a,b}=anArray); var r=a+b; r is '34'
 PASS var {a:a,b:b}=anArray; var r=a+b; r is '34'
 Function as String: (function({a:a,b:b}) { return a+b;})
 PASS (function({a:a,b:b}) { return a+b;})(anArray) is '34'
-PASS (function ({a:a,b:b}) { return a+b;})(anArray) is '34'
+PASS (function({a:a,b:b}) { return a+b;})(anArray) is '34'
 PASS ({a:a,b:b}=anArray); var r=a+b; r is '34'
 PASS var {a,b}=anObject; var r=a+b; r is '12'
 Function as String: (function({a,b}) { return a+b;})
 PASS (function({a,b}) { return a+b;})(anObject) is '12'
-PASS (function ({a:a,b:b}) { return a+b;})(anObject) is '12'
+PASS (function({a,b}) { return a+b;})(anObject) is '12'
 PASS ({a,b}=anObject); var r=a+b; r is '12'
 PASS var {a:a,b:b}=anObject; var r=a+b; r is '12'
 Function as String: (function({a:a,b:b}) { return a+b;})
 PASS (function({a:a,b:b}) { return a+b;})(anObject) is '12'
-PASS (function ({a:a,b:b}) { return a+b;})(anObject) is '12'
+PASS (function({a:a,b:b}) { return a+b;})(anObject) is '12'
 PASS ({a:a,b:b}=anObject); var r=a+b; r is '12'
 PASS var {0:a,1:b}=anObject; var r=a+b; r is '34'
 Function as String: (function({0:a,1:b}) { return a+b;})
 PASS (function({0:a,1:b}) { return a+b;})(anObject) is '34'
-PASS (function ({0:a,1:b}) { return a+b;})(anObject) is '34'
+PASS (function({0:a,1:b}) { return a+b;})(anObject) is '34'
 PASS ({0:a,1:b}=anObject); var r=a+b; r is '34'
 PASS var {'a':a,'b':b}=anObject; var r=a+b; r is '12'
 Function as String: (function({'a':a,'b':b}) { return a+b;})
 PASS (function({'a':a,'b':b}) { return a+b;})(anObject) is '12'
-PASS (function ({"a":a,"b":b}) { return a+b;})(anObject) is '12'
+PASS (function({'a':a,'b':b}) { return a+b;})(anObject) is '12'
 PASS ({'a':a,'b':b}=anObject); var r=a+b; r is '12'
 PASS a+b is '1122'
 PASS a+b is '2211'
index c4c36ae..88e7cd5 100644 (file)
@@ -3,106 +3,106 @@ Tests that a redundant load of a captured variable that was proven to be a const
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
-PASS "" + foo(o, i % 2) is "function () { return 32; },function () { return 32; }"
-PASS "" + foo(o, i % 2) is "function () { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
+PASS "" + foo(o, i % 2) is "function() { return 32; },function() { return 32; }"
+PASS "" + foo(o, i % 2) is "function() { return x; }"
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 4d140f9..37ccab2 100644 (file)
@@ -3,206 +3,206 @@ Tests that the specific value optimization does not break when the relevant stru
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
-PASS "" + foo() is "function () { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
+PASS "" + foo() is "function() { }"
 PASS "" + foo() is "42"
 PASS "" + foo() is "42"
 PASS "" + foo() is "42"
index 352baa3..af0c426 100644 (file)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse();
     }
 PASS tests[i](nativeJSON) threw exception Error: JSON.parse requires at least one parameter.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected EOF.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('1');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('-1');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('Infinity');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected identifier "Infinity".
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('NaN');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected identifier "NaN".
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('null');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('undefined');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected identifier "undefined".
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{}');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('({})');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected token '('.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{a}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Expected '}'.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{a:}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Expected '}'.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{a:5}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Expected '}'.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{a:5,}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Expected '}'.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"a"}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Expected ':' before value in object property definition.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"a":}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected token '}'.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"a":5}');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"__proto__":5}');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"a":5,}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Property name must be a string literal.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"a":5,,}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Property name must be a string literal.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"a":5,"a",}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Expected ':'.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"a":(5,"a"),}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected token '('.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('[]');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('[1]');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('[1,]');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected comma at the end of array expression.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('[1,2]');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('[1,2,,]');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected token ','.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('[1,2,,4]');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unexpected token ','.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('""');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"\'"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\"');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unterminated string.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\z"');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Invalid escape character z.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\\z"');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Invalid escape character z.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\\\z"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\tz"');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unterminated string.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\tz"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\nz"');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unterminated string.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\nz"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\rz"');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unterminated string.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\rz"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\/z"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\/z"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\bz"');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unterminated string.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\bz"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\rz"');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unterminated string.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\rz"');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\uz"     ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\uz"  " is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u0z"    ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u0z" " is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u00z"   ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u00z"" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u000z"  ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u000z" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u0000z" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u000Az" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u000az" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u000Gz" ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u000G" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u000gz" ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u000g" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u00A0z" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u00a0z" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u00G0z" ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u00G0" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u00g0z" ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u00g0" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u0A00z" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u0a00z" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u0G00z" ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u0G00" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\u0g00z" ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\u0g00" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\uA000z" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\ua000z" ');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\uG000z" ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\uG000" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a\\ug000z" ');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: "\ug000" is not a valid unicode escape.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('00');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unable to parse JSON string.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('01');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unable to parse JSON string.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('0.a');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Invalid digits after decimal point.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('0x0');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unable to parse JSON string.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('2e1.3');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unable to parse JSON string.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('2e-+10');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Exponent symbols should be followed by an optional '+' or '-' and then by at least one number.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('2e+-10');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Exponent symbols should be followed by an optional '+' or '-' and then by at least one number.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('2e3e4');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unable to parse JSON string.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('-01.0');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unable to parse JSON string.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('-01');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unable to parse JSON string.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('-01.a');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Invalid digits after decimal point.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('1.e1');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Invalid digits after decimal point.
 json2.js did not throw for a test we expect to throw.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{/* block comments are not allowed */}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unrecognized token '/'.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{// line comments are not allowed \n}');
     }
 PASS tests[i](nativeJSON) threw exception SyntaxError: JSON Parse error: Unrecognized token '/'.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('true');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('false');
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(simpleObject));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(simpleObject,null,100));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject,null,100));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject,null,100));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(simpleObject,null," "));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject,null," "));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject,null," "));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(simpleObject,null,"\t"));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject,null,"\t"));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject,null,"\t"));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(simpleObject,null,"\n"));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject,null,"\n"));
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse("true", log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse("false", log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse("null", log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse("1", log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse("1.5", log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('"a string"', log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(simpleArray), log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexArray), log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(simpleObject), log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(complexObject), log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse('{"__proto__":{"a":5}}', log);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse("true", logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse("false", logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse("null", logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse("1", logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse("1.5", logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse('"a string"', logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse(JSON.stringify(simpleArray), logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse(JSON.stringify(complexArray), logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse(JSON.stringify(simpleObject), logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         return jsonObject.parse(JSON.stringify(complexObject), logOrder);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse("true", logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse("false", logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse("null", logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse("1", logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse("1.5", logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse('"a string"', logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse(JSON.stringify(simpleArray), logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse(JSON.stringify(complexArray), logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse(JSON.stringify(simpleObject), logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         logOrderString = "";
         jsonObject.parse(JSON.stringify(complexObject), logOrder);
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         callCount = 0;
         logOrderString = "";
         return jsonObject.parse(JSON.stringify(complexArray), throwAfterFifthCall);
     }
 PASS tests[i](nativeJSON) threw exception from reviver.
-function (jsonObject) {
+function(jsonObject){
         callCount = 0;
         logOrderString = "";
         return jsonObject.parse(JSON.stringify(simpleObject), throwAfterFifthCall);
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         callCount = 0;
         logOrderString = "";
         return jsonObject.parse(JSON.stringify(complexObject), throwAfterFifthCall);
     }
 PASS tests[i](nativeJSON) threw exception from reviver.
-function (jsonObject) {
+function(jsonObject){
         callCount = 0;
         logOrderString = "";
         try { jsonObject.parse(JSON.stringify(complexArray), throwAfterFifthCall); } catch (e) {}
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         callCount = 0;
         logOrderString = "";
         try { jsonObject.parse(JSON.stringify(simpleObject), throwAfterFifthCall); } catch (e) {}
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         callCount = 0;
         logOrderString = "";
         try { jsonObject.parse(JSON.stringify(complexObject), throwAfterFifthCall); } catch (e) {}
         return logOrderString;
     }
 PASS JSON.stringify(tests[i](nativeJSON)) is JSON.stringify(tests[i](JSON))
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.parse(JSON.stringify(unicode));
     }
 PASS tests[i](nativeJSON) is tests[i].unstringifiedExpected
index 3044d3d..d93d218 100644 (file)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(1);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(1.5);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(-1);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(-1.5);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(null);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify("string");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new Number(0));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new Number(1));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new Number(1.5));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new Number(-1));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new Number(-1.5));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new String("a string object"));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new Boolean(true));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var value = new Number(1);
         value.valueOf = function() { return 2; }
         return jsonObject.stringify(value);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         var value = new Boolean(true);
         value.valueOf = function() { return 2; }
         return jsonObject.stringify(value);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         var value = new String("fail");
         value.toString = function() { return "converted string"; }
         return jsonObject.stringify(value);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(true);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(false);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new Date(0));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({toJSON: Date.prototype.toJSON});
     }
 PASS tests[i](nativeJSON) threw exception TypeError: toISOString is not a function.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return "custom toISOString"; }});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return {}; }});
     }
 PASS tests[i](nativeJSON) threw exception TypeError: toISOString did not return a primitive value.
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ throw "An exception"; }});
     }
 PASS tests[i](nativeJSON) threw exception An exception.
-function (jsonObject) {
+function(jsonObject){
         var d = new Date(0);
         d.toISOString = null;
         return jsonObject.stringify(d);
     }
 PASS tests[i](nativeJSON) threw exception TypeError: toISOString is not a function.
-function (jsonObject) {
+function(jsonObject){
         var d = new Date(0);
         d.toJSON = undefined;
         return jsonObject.stringify(d);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({get Foo() { return "bar"; }});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({get Foo() { this.foo="wibble"; return "bar"; }});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var count = 0;
         jsonObject.stringify({get Foo() { count++; return "bar"; }});
         return count;
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var count = 0;
         return jsonObject.stringify({get Foo() { count++; delete this.bar; return "bar"; }, bar: "wibble"});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var count = 0;
         return jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7}, function(k,v){allString = allString && (typeof k == "string"); return v});
         return allString;
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         jsonObject.stringify([1,2,3,4,5], function(k,v){allString = allString && (typeof k == "string"); return v});
         return allString;
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = [];
         return jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7}, array);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = ["a"];
         return jsonObject.stringify({get a(){return 1;array[1]="b";array[2]="c"}, b:"2", c:"3"}, array);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
         return jsonObject.stringify(simpleObject, array);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
         return jsonObject.stringify(simpleObjectWithProto, array);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = [1, new Number(2), NaN, Infinity, -Infinity, new String("str")];
         return jsonObject.stringify({"1":"1","2":"2","NaN":"NaN","Infinity":"Infinity","-Infinity":"-Infinity","str":"str"}, array);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = ["1","2","3"];
         return jsonObject.stringify({1:'a', 2:'b', 3:'c'}, array);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = ["1","2","3"];
         return jsonObject.stringify(simpleArray, array);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleArray, null, "  ");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleArray, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleArray, null, "ab");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleArray, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObject, null, "  ");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObject, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObject, null, "ab");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObject, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObject, null, 10);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObject, null, 11);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObject, null, "          ");
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObject, null, "           ");
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexArray, null, "  ");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexArray, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexArray, null, "ab");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexArray, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexObject, null, "  ");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexObject, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexObject, null, "ab");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexObject, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = ["1","2","3"];
         return jsonObject.stringify(simpleArrayWithProto, array);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleArrayWithProto, null, "  ");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleArrayWithProto, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleArrayWithProto, null, "ab");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleArrayWithProto, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObjectWithProto, null, "  ");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObjectWithProto, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObjectWithProto, null, "ab");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObjectWithProto, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObjectWithProto, null, 10);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObjectWithProto, null, 11);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObjectWithProto, null, "          ");
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(simpleObjectWithProto, null, "           ");
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexArrayWithProto, null, "  ");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexArrayWithProto, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexArrayWithProto, null, "ab");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexArrayWithProto, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexObjectWithProto, null, "  ");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexObjectWithProto, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexObjectWithProto, null, "ab");
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(complexObjectWithProto, null, 4);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
             return jsonObject.stringify(clientRect);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(objectWithSideEffectGetter);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(objectWithSideEffectGetter);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(objectWithSideEffectGetterAndProto);
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(objectWithSideEffectGetterAndProto);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(arrayWithSideEffectGetter);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(arrayWithSideEffectGetterAndProto);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         replaceTracker = "";
         jsonObject.stringify([1,2,3,,,,4,5,6], replaceFunc);
         return replaceTracker;
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         replaceTracker = "";
         jsonObject.stringify({a:"a", b:"b", c:"c", 3: "d", 2: "e", 1: "f"}, replaceFunc);
         return replaceTracker;
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         var count = 0;
         var array = [{toString:function(){count++; array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
         jsonObject.stringify(simpleObject, array);
         return count;
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var allString = true;
         var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}, 'b', 'c'];
         return jsonObject.stringify(simpleObject, array);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var count = 0;
         var array = [{toString:function(){count++; array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}, 'b', 'c'];
         jsonObject.stringify(simpleObject, array);
         return count;
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({a:"1", get b() { this.a="foo"; return "getter"; }, c:"3"});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({a:"1", get b() { this.c="foo"; return "getter"; }, c:"3"});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var setterCalled = false;
         jsonObject.stringify({a:"1", set b(s) { setterCalled = true; return "setter"; }, c:"3"});
         return setterCalled;
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({a:"1", get b(){ return "getter"; }, set b(s) { return "setter"; }, c:"3"});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(new Array(10));
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify([undefined,,null,0,false]);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({p1:undefined,p2:null,p3:0,p4:false});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         cycleTracker = "";
         return jsonObject.stringify(cyclicObject);
     }
 PASS tests[i](nativeJSON) threw exception TypeError: JSON.stringify cannot serialize cyclic structures..
-function (jsonObject) {
+function(jsonObject){
         cycleTracker = "";
         try { jsonObject.stringify(cyclicObject); } catch(e) { cycleTracker += " -> exception" }
         return cycleTracker;
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         cycleTracker = "";
         return jsonObject.stringify(cyclicArray);
     }
 PASS tests[i](nativeJSON) threw exception TypeError: JSON.stringify cannot serialize cyclic structures..
-function (jsonObject) {
+function(jsonObject){
         cycleTracker = "";
         try { jsonObject.stringify(cyclicArray); } catch(e) { cycleTracker += " -> exception" }
         return cycleTracker;
     }
 PASS tests[i](nativeJSON) is tests[i].expected
-function (jsonObject) {
+function(jsonObject){
         getterCalls = 0;
         return jsonObject.stringify(magicObject) + " :: getter calls = " + getterCalls;
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(undefined);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(null);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({toJSON:function(){ return undefined; }});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({toJSON:function(){ return null; }});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify([{toJSON:function(){ return undefined; }}]);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify([{toJSON:function(){ return null; }}]);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({a:{toJSON:function(){ return undefined; }}});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({a:{toJSON:function(){ return null; }}});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({a:{toJSON:function(){ return function(){}; }}});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify({a:function(){}});
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var deepObject = {};
         for (var i = 0; i < 2048; i++)
             deepObject = {next:deepObject};
         return jsonObject.stringify(deepObject);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var deepArray = [];
         for (var i = 0; i < 2048; i++)
             deepArray = [deepArray];
         return jsonObject.stringify(deepArray);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var depth = 0;
         function toDeepVirtualJSONObject() {
             if (++depth >= 2048)
@@ -535,7 +535,7 @@ function (jsonObject) {
         return jsonObject.stringify(toDeepVirtualJSONObject());
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
-function (jsonObject) {
+function(jsonObject){
         var depth = 0;
         function toDeepVirtualJSONArray() {
             if (++depth >= 2048)
@@ -546,7 +546,7 @@ function (jsonObject) {
         }
         return jsonObject.stringify(toDeepVirtualJSONArray());
     }
-function (jsonObject) {
+function(jsonObject){
         return jsonObject.stringify(fullCharsetString);
     }
 PASS tests[i](nativeJSON) is tests[i](JSON)
index 09aba97..450779c 100644 (file)
@@ -3,706 +3,706 @@ Tests what happens when you do string concatentations on objects and then OSR ex
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
-PASS bar() is "function () { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
+PASS bar() is "function() { }"
 PASS bar() is "42"
 PASS bar() is "42"
 PASS bar() is "42"
index 70b55d5..393fd15 100644 (file)
@@ -3,7 +3,7 @@ Tests Bugzilla Bug 9815: JavaScript TypeError loading Dean Edwards' JS compresso
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS actual is 'function () { }'
+PASS actual is 'function() { }'
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 40c09e7..d76b10a 100644 (file)
@@ -28,7 +28,7 @@ MyClass.func.prototype =
 }
 
 var actual = "" + MyClass.runTest();
-shouldBe("actual", "'function () { }'");
+shouldBe("actual", "'function() { }'");
 </script>
 <script src="../../resources/js-test-post.js"></script>
 </body>
index 560d327..2a57050 100644 (file)
@@ -1,2 +1,2 @@
-CONSOLE MESSAGE: line 3: SyntaxError: Unexpected identifier 'error'
+CONSOLE MESSAGE: line 4: SyntaxError: Unexpected identifier 'error'
 This tests that a line number and error message is printed for a parse error in a separate source file using new Function().
index b615808..279a6f8 100644 (file)
@@ -243,35 +243,35 @@ function "exi2b" { 1:141 - 1:221 }
 eval { 1:1 - 1:56 }
 
   new Function Object:
-function "" { 1:16 - 1:245 }
-function "nf1a" { 1:77 - 1:236 }
-function "nf1b" { 1:107 - 1:226 }
-function "nf1c" { 1:137 - 1:216 }
-eval { 1:1 - 1:56 }
-function "" { 1:16 - 17:8 }
-function "nf2a" { 4:21 - 15:5 }
-function "nf2b" { 6:25 - 13:9 }
-function "nf2c" { 8:29 - 11:13 }
-eval { 1:1 - 1:56 }
-function "" { 1:16 - 1:245 }
-function "nf1a" { 1:77 - 1:236 }
-function "nf1b" { 1:107 - 1:226 }
-function "nf1c" { 1:137 - 1:216 }
-eval { 1:1 - 1:56 }
-function "" { 1:16 - 1:254 }
-function "nfi1a" { 1:78 - 1:244 }
-function "nfi1b" { 1:110 - 1:233 }
-function "nfi1c" { 1:142 - 1:222 }
-eval { 1:1 - 1:56 }
-function "" { 1:16 - 17:8 }
-function "nf2a" { 4:21 - 15:5 }
-function "nf2b" { 6:25 - 13:9 }
-function "nf2c" { 8:29 - 11:13 }
-eval { 1:1 - 1:56 }
-function "" { 1:16 - 17:9 }
-function "nfi2a" { 4:22 - 15:5 }
-function "nfi2b" { 6:26 - 13:9 }
-function "nfi2c" { 8:30 - 11:13 }
+function "anonymous" { 1:27 - 2:228 }
+function "nf1a" { 2:60 - 2:219 }
+function "nf1b" { 2:90 - 2:209 }
+function "nf1c" { 2:120 - 2:199 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:27 - 18:8 }
+function "nf2a" { 5:21 - 16:5 }
+function "nf2b" { 7:25 - 14:9 }
+function "nf2c" { 9:29 - 12:13 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:27 - 2:228 }
+function "nf1a" { 2:60 - 2:219 }
+function "nf1b" { 2:90 - 2:209 }
+function "nf1c" { 2:120 - 2:199 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:27 - 2:237 }
+function "nfi1a" { 2:61 - 2:227 }
+function "nfi1b" { 2:93 - 2:216 }
+function "nfi1c" { 2:125 - 2:205 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:27 - 18:8 }
+function "nf2a" { 5:21 - 16:5 }
+function "nf2b" { 7:25 - 14:9 }
+function "nf2c" { 9:29 - 12:13 }
+eval { 1:1 - 1:56 }
+function "anonymous" { 1:27 - 18:9 }
+function "nfi2a" { 5:22 - 16:5 }
+function "nfi2b" { 7:26 - 14:9 }
+function "nfi2c" { 9:30 - 12:13 }
 eval { 1:1 - 1:56 }
 
 PASS successfullyParsed is true
index 1504796..ea0ddd4 100644 (file)
@@ -12,7 +12,7 @@ function bar() {
 
 var x = function() { };
 
-var expected = "\"function () { }\"";
+var expected = "\"function() { }\"";
 var blah = this;
 for (var i = 0; i < 1000; ++i) {
     blah["i" + i] = i;
index c3a5205..5a6dc58 100644 (file)
@@ -15,7 +15,7 @@ span : valueOf
 [span] : toString
 String(span) : toString
 String([span]) : toString
-span.toString : function () { return "toString"; }
+span.toString : function() { return "toString" }
 span.toString() (cached in variable) : toString
 span.toString() : toString
 [span].toString() : toString
@@ -27,7 +27,7 @@ span : valueOf
 [span] : valueOf
 String(span) : valueOf
 String([span]) : valueOf
-span.toString : function () { return new Object(); }
+span.toString : function() { return new Object(); }
 span.toString() (cached in variable) : [object Object]
 span.toString() : [object Object]
 [span].toString() : valueOf
@@ -39,7 +39,7 @@ span : toString
 [span] : toString
 String(span) : toString
 String([span]) : toString
-span.toString : function () { return 'toString'; }
+span.toString : function() { return 'toString'; }
 span.toString() (cached in variable) : toString
 span.toString() : toString
 [span].toString() : toString
@@ -51,7 +51,7 @@ TypeError: No default value
 TypeError: No default value
 TypeError: No default value
 TypeError: No default value
-span.toString : function () { return new Object(); }
+span.toString : function() { return new Object(); }
 span.toString() (cached in variable) : [object Object]
 span.toString() : [object Object]
 TypeError: No default value
@@ -63,7 +63,7 @@ span : valueOf
 Exception
 Exception
 Exception
-span.toString : function () { throw "Exception"; }
+span.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -75,7 +75,7 @@ Exception
 [span] : toString
 String(span) : toString
 String([span]) : toString
-span.toString : function () { return 'toString'; }
+span.toString : function() { return 'toString'; }
 span.toString() (cached in variable) : toString
 span.toString() : toString
 [span].toString() : toString
@@ -87,7 +87,7 @@ Exception
 Exception
 Exception
 Exception
-span.toString : function () { throw "Exception"; }
+span.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -112,7 +112,7 @@ window : valueOf
 [window] : toString
 String(window) : toString
 String([window]) : toString
-window.toString : function () { return "toString"; }
+window.toString : function() { return "toString" }
 window.toString() (cached in variable) : toString
 window.toString() : toString
 [window].toString() : toString
@@ -124,7 +124,7 @@ window : valueOf
 [window] : valueOf
 String(window) : valueOf
 String([window]) : valueOf
-window.toString : function () { return new Object(); }
+window.toString : function() { return new Object(); }
 window.toString() (cached in variable) : [object Object]
 window.toString() : [object Object]
 [window].toString() : valueOf
@@ -136,7 +136,7 @@ window : toString
 [window] : toString
 String(window) : toString
 String([window]) : toString
-window.toString : function () { return 'toString'; }
+window.toString : function() { return 'toString'; }
 window.toString() (cached in variable) : toString
 window.toString() : toString
 [window].toString() : toString
@@ -148,7 +148,7 @@ TypeError: No default value
 TypeError: No default value
 TypeError: No default value
 TypeError: No default value
-window.toString : function () { return new Object(); }
+window.toString : function() { return new Object(); }
 window.toString() (cached in variable) : [object Object]
 window.toString() : [object Object]
 TypeError: No default value
@@ -160,7 +160,7 @@ window : valueOf
 Exception
 Exception
 Exception
-window.toString : function () { throw "Exception"; }
+window.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -172,7 +172,7 @@ Exception
 [window] : toString
 String(window) : toString
 String([window]) : toString
-window.toString : function () { return 'toString'; }
+window.toString : function() { return 'toString'; }
 window.toString() (cached in variable) : toString
 window.toString() : toString
 [window].toString() : toString
@@ -184,7 +184,7 @@ Exception
 Exception
 Exception
 Exception
-window.toString : function () { throw "Exception"; }
+window.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -209,7 +209,7 @@ Navigator : valueOf
 [Navigator] : toString
 String(Navigator) : toString
 String([Navigator]) : toString
-Navigator.toString : function () { return "toString"; }
+Navigator.toString : function() { return "toString" }
 Navigator.toString() (cached in variable) : toString
 Navigator.toString() : toString
 [Navigator].toString() : toString
@@ -221,7 +221,7 @@ Navigator : valueOf
 [Navigator] : valueOf
 String(Navigator) : valueOf
 String([Navigator]) : valueOf
-Navigator.toString : function () { return new Object(); }
+Navigator.toString : function() { return new Object(); }
 Navigator.toString() (cached in variable) : [object Object]
 Navigator.toString() : [object Object]
 [Navigator].toString() : valueOf
@@ -233,7 +233,7 @@ Navigator : toString
 [Navigator] : toString
 String(Navigator) : toString
 String([Navigator]) : toString
-Navigator.toString : function () { return 'toString'; }
+Navigator.toString : function() { return 'toString'; }
 Navigator.toString() (cached in variable) : toString
 Navigator.toString() : toString
 [Navigator].toString() : toString
@@ -245,7 +245,7 @@ TypeError: No default value
 TypeError: No default value
 TypeError: No default value
 TypeError: No default value
-Navigator.toString : function () { return new Object(); }
+Navigator.toString : function() { return new Object(); }
 Navigator.toString() (cached in variable) : [object Object]
 Navigator.toString() : [object Object]
 TypeError: No default value
@@ -257,7 +257,7 @@ Navigator : valueOf
 Exception
 Exception
 Exception
-Navigator.toString : function () { throw "Exception"; }
+Navigator.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -269,7 +269,7 @@ Exception
 [Navigator] : toString
 String(Navigator) : toString
 String([Navigator]) : toString
-Navigator.toString : function () { return 'toString'; }
+Navigator.toString : function() { return 'toString'; }
 Navigator.toString() (cached in variable) : toString
 Navigator.toString() : toString
 [Navigator].toString() : toString
@@ -281,7 +281,7 @@ Exception
 Exception
 Exception
 Exception
-Navigator.toString : function () { throw "Exception"; }
+Navigator.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -306,7 +306,7 @@ History : valueOf
 [History] : toString
 String(History) : toString
 String([History]) : toString
-History.toString : function () { return "toString"; }
+History.toString : function() { return "toString" }
 History.toString() (cached in variable) : toString
 History.toString() : toString
 [History].toString() : toString
@@ -318,7 +318,7 @@ History : valueOf
 [History] : valueOf
 String(History) : valueOf
 String([History]) : valueOf
-History.toString : function () { return new Object(); }
+History.toString : function() { return new Object(); }
 History.toString() (cached in variable) : [object Object]
 History.toString() : [object Object]
 [History].toString() : valueOf
@@ -330,7 +330,7 @@ History : toString
 [History] : toString
 String(History) : toString
 String([History]) : toString
-History.toString : function () { return 'toString'; }
+History.toString : function() { return 'toString'; }
 History.toString() (cached in variable) : toString
 History.toString() : toString
 [History].toString() : toString
@@ -342,7 +342,7 @@ TypeError: No default value
 TypeError: No default value
 TypeError: No default value
 TypeError: No default value
-History.toString : function () { return new Object(); }
+History.toString : function() { return new Object(); }
 History.toString() (cached in variable) : [object Object]
 History.toString() : [object Object]
 TypeError: No default value
@@ -354,7 +354,7 @@ History : valueOf
 Exception
 Exception
 Exception
-History.toString : function () { throw "Exception"; }
+History.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -366,7 +366,7 @@ Exception
 [History] : toString
 String(History) : toString
 String([History]) : toString
-History.toString : function () { return 'toString'; }
+History.toString : function() { return 'toString'; }
 History.toString() (cached in variable) : toString
 History.toString() : toString
 [History].toString() : toString
@@ -378,7 +378,7 @@ Exception
 Exception
 Exception
 Exception
-History.toString : function () { throw "Exception"; }
+History.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -403,7 +403,7 @@ Selection : valueOf
 [Selection] : toString
 String(Selection) : toString
 String([Selection]) : toString
-Selection.toString : function () { return "toString"; }
+Selection.toString : function() { return "toString" }
 Selection.toString() (cached in variable) : toString
 Selection.toString() : toString
 [Selection].toString() : toString
@@ -415,7 +415,7 @@ Selection : valueOf
 [Selection] : valueOf
 String(Selection) : valueOf
 String([Selection]) : valueOf
-Selection.toString : function () { return new Object(); }
+Selection.toString : function() { return new Object(); }
 Selection.toString() (cached in variable) : [object Object]
 Selection.toString() : [object Object]
 [Selection].toString() : valueOf
@@ -427,7 +427,7 @@ Selection : toString
 [Selection] : toString
 String(Selection) : toString
 String([Selection]) : toString
-Selection.toString : function () { return 'toString'; }
+Selection.toString : function() { return 'toString'; }
 Selection.toString() (cached in variable) : toString
 Selection.toString() : toString
 [Selection].toString() : toString
@@ -439,7 +439,7 @@ TypeError: No default value
 TypeError: No default value
 TypeError: No default value
 TypeError: No default value
-Selection.toString : function () { return new Object(); }
+Selection.toString : function() { return new Object(); }
 Selection.toString() (cached in variable) : [object Object]
 Selection.toString() : [object Object]
 TypeError: No default value
@@ -451,7 +451,7 @@ Selection : valueOf
 Exception
 Exception
 Exception
-Selection.toString : function () { throw "Exception"; }
+Selection.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
@@ -463,7 +463,7 @@ Exception
 [Selection] : toString
 String(Selection) : toString
 String([Selection]) : toString
-Selection.toString : function () { return 'toString'; }
+Selection.toString : function() { return 'toString'; }
 Selection.toString() (cached in variable) : toString
 Selection.toString() : toString
 [Selection].toString() : toString
@@ -475,7 +475,7 @@ Exception
 Exception
 Exception
 Exception
-Selection.toString : function () { throw "Exception"; }
+Selection.toString : function() { throw "Exception"; }
 Exception
 Exception
 Exception
diff --git a/LayoutTests/js/function-toString-semicolon-insertion-expected.txt b/LayoutTests/js/function-toString-semicolon-insertion-expected.txt
deleted file mode 100644 (file)
index ae27eb7..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-This test checks that functions re-string-ify in a way that is syntactically compatible with concatenation.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS (function(){return}).toString() is 'function () {return;}'
-PASS (function(){return }).toString() is 'function () {return; }'
-PASS (function(){return
-}).toString() is 'function () {return;\n}'
-PASS (function(){}).toString() is 'function () {}'
-PASS (function(){ }).toString() is 'function () { }'
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/LayoutTests/js/function-toString-semicolon-insertion.html b/LayoutTests/js/function-toString-semicolon-insertion.html
deleted file mode 100644 (file)
index 36ce473..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
-<script src="../resources/js-test-pre.js"></script>
-</head>
-<body>
-<script src="script-tests/function-toString-semicolon-insertion.js"></script>
-<script src="../resources/js-test-post.js"></script>
-</body>
-</html>
index d7466ba..6ceaccc 100644 (file)
@@ -3,14 +3,14 @@ KDE JS Test
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS function () { a = x; } threw exception ReferenceError: Can't find variable: x.
-PASS function () { x += "foo"; } threw exception ReferenceError: Can't find variable: x.
-PASS function () { b = a.x; } did not throw an exception
-PASS function () { b = a['x']; } did not throw an exception
-PASS function () { a['x'] += 'baz'; } did not throw an exception
+PASS function() { a = x; } threw exception ReferenceError: Can't find variable: x.
+PASS function() { x += "foo"; } threw exception ReferenceError: Can't find variable: x.
+PASS function() { b = a.x; } did not throw an exception
+PASS function() { b = a['x']; } did not throw an exception
+PASS function() { a['x'] += 'baz'; } did not throw an exception
 PASS a['x'] is "undefinedbaz"
-PASS function () { b = a.y; } did not throw an exception
-PASS function () { a.y += 'glarch'; } did not throw an exception
+PASS function() { b = a.y; } did not throw an exception
+PASS function() { a.y += 'glarch'; } did not throw an exception
 PASS a['y'] is "undefinedglarch"
 PASS successfullyParsed is true
 
index 286a05c..50e4042 100644 (file)
@@ -8,7 +8,7 @@ PASS o.foo() is 10
 PASS typeof o.foo is 'function'
 PASS o.foo.length is 0
 PASS o.foo.name is ''
-PASS o.foo.toString() is 'function () { return 10; }'
+FAIL o.foo.toString() should be function () { return 10; }. Was () { return 10; }.
 PASS Object.getOwnPropertyDescriptor(o, 'foo').value is o.foo
 PASS Object.getOwnPropertyDescriptor(o, 'foo').enumerable is true
 PASS Object.getOwnPropertyDescriptor(o, 'foo').configurable is true
@@ -18,7 +18,7 @@ PASS o.add(42, -10) is 32
 PASS typeof o.add is 'function'
 PASS o.add.length is 2
 PASS o.add.name is ''
-PASS o.add.toString() is 'function (x, y) { return x + y; }'
+FAIL o.add.toString() should be function (x, y) { return x + y; }. Was (x, y) { return x + y; }.
 PASS o = { [ (function() { return 'method'; })() ](x, y) { return x + y; } }; did not throw exception.
 PASS o.method(142, -10) is 132
 PASS o = { [10*10]() { return 100; } }; did not throw exception.
index 3318df1..6fc4d3a 100644 (file)
@@ -8,7 +8,7 @@ PASS o.foo() is 10
 PASS typeof o.foo is 'function'
 PASS o.foo.length is 0
 PASS o.foo.name is 'foo'
-PASS o.foo.toString() is 'function foo() { return 10; }'
+FAIL o.foo.toString() should be function foo() { return 10; }. Was () { return 10; }.
 PASS Object.getOwnPropertyDescriptor(o, 'foo').value is o.foo
 PASS Object.getOwnPropertyDescriptor(o, 'foo').enumerable is true
 PASS Object.getOwnPropertyDescriptor(o, 'foo').configurable is true
@@ -18,7 +18,7 @@ PASS o.add(42, -10) is 32
 PASS typeof o.add is 'function'
 PASS o.add.length is 2
 PASS o.add.name is 'add'
-PASS o.add.toString() is 'function add(x, y) { return x + y; }'
+FAIL o.add.toString() should be function add(x, y) { return x + y; }. Was (x, y) { return x + y; }.
 PASS o = { 'add'(a, b, c) { return a + b + c; } }; did not throw exception.
 PASS o.add(1, 2, 3) is 6
 PASS o = { 'a(d)d'(a, b, c) { return a + b + c; } }; did not throw exception.
index 5dfbd8d..6e996f6 100644 (file)
@@ -18,8 +18,8 @@ var o = {f:function() { return 32; }};
 for (var i = 0; i < 100; ++i) {
     var expected;
     if (i % 2)
-        expected = "\"function () { return x; }\"";
+        expected = "\"function() { return x; }\"";
     else
-        expected = "\"function () { return 32; },function () { return 32; }\"";
+        expected = "\"function() { return 32; },function() { return 32; }\"";
     shouldBe("\"\" + foo(o, i % 2)", expected);
 }
index dba61d0..c3fc19c 100644 (file)
@@ -8,7 +8,7 @@ function foo() {
 
 x = function() { };
 
-var expected = "\"function () { }\"";
+var expected = "\"function() { }\"";
 
 for (var i = 0; i < 1000; ++i) {
     eval("i" + i + " = " + i);
diff --git a/LayoutTests/js/script-tests/function-toString-semicolon-insertion.js b/LayoutTests/js/script-tests/function-toString-semicolon-insertion.js
deleted file mode 100644 (file)
index 3ea1475..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-description(
-"This test checks that functions re-string-ify in a way that is syntactically " +
-"compatible with concatenation."
-);
-
-shouldBe("(function(){return}).toString()", "'function () {return;}'");
-shouldBe("(function(){return }).toString()", "'function () {return; }'");
-shouldBe("(function(){return" + "\n" + "}).toString()", "'function () {return;" + "\\n" + "}'");
-shouldBe("(function(){}).toString()", "'function () {}'");
-shouldBe("(function(){ }).toString()", "'function () { }'");
index b3719fa..a0b72e1 100644 (file)
@@ -4,7 +4,7 @@ PASS Test setting SourceBuffer.mode
 PASS Test setting a removed SourceBuffer's mode 
 PASS Test setting SourceBuffer.mode while still updating 
 PASS Test setting SourceBuffer.mode triggers parent MediaSource 'ended' to 'open' transition. 
-FAIL Test setting SourceBuffer.mode and SourceBuffer.timestampOffset while parsing media segment. assert_throws: Setting valid sourceBuffer.mode while still parsing media segment threw InvalidStateError. function "function () { sourceBuffer.mode = 'segments'; }" did not throw(stack: assert@http://127.0.0.1:8000/w3c/resources/testharness.js:2061:73
+FAIL Test setting SourceBuffer.mode and SourceBuffer.timestampOffset while parsing media segment. assert_throws: Setting valid sourceBuffer.mode while still parsing media segment threw InvalidStateError. function "function() { sourceBuffer.mode = 'segments'; }" did not throw(stack: assert@http://127.0.0.1:8000/w3c/resources/testharness.js:2061:73
 assert_throws@http://127.0.0.1:8000/w3c/resources/testharness.js:947:19
 http://127.0.0.1:8000/media/media-source/mediasource-sourcebuffer-mode.html:114:32
 handleWaitCallback_@http://127.0.0.1:8000/media/media-source/mediasource-util.js:97:17
index 81ca1fa..21174ff 100644 (file)
@@ -3,13 +3,13 @@ Length is 0
 Testing implicit setters
 Type/value for null is string/null
 Type/value for 0 is string/0
-Type/value for function(){} is string/function () {}
+Type/value for function(){} is string/function(){}
 Testing explicit setters
 Type/value for null is string/null
 Type/value for 0 is string/0
-Type/value for function(){} is string/function () {}
+Type/value for function(){} is string/function(){}
 Testing index setters
 Type/value for null is string/null
 Type/value for 0 is string/0
-Type/value for function(){} is string/function () {}
+Type/value for function(){} is string/function(){}
 
index 65dcb2c..bf12d74 100644 (file)
@@ -3,13 +3,13 @@ Length is 0
 Testing implicit setters
 Type/value for null is string/null
 Type/value for 0 is string/0
-Type/value for function(){} is string/function () {}
+Type/value for function(){} is string/function(){}
 Testing explicit setters
 Type/value for null is string/null
 Type/value for 0 is string/0
-Type/value for function(){} is string/function () {}
+Type/value for function(){} is string/function(){}
 Testing index setters
 Type/value for null is string/null
 Type/value for 0 is string/0
-Type/value for function(){} is string/function () {}
+Type/value for function(){} is string/function(){}
 
index 2cf1180..8204b47 100644 (file)
@@ -2,13 +2,13 @@ Test that window.onerror and "error" event listeners from main world are invoked
 
 Main world window.onerror: Error: Error in main world inline script. at window-onerror-for-isolated-world-1.html:55
 Main world error event listener: Error: Error in main world inline script. at window-onerror-for-isolated-world-1.html:55
-Main world window.onerror: Error: Error in user script inline script. at undefined:11
-Main world error event listener: Error: Error in user script inline script. at undefined:11
+Main world window.onerror: Error: Error in user script inline script. at undefined:12
+Main world error event listener: Error: Error in user script inline script. at undefined:12
 Main world window.onerror: Error: Error in main world load handler. at window-onerror-for-isolated-world-1.html:51
 Main world error event listener: Error: Error in main world load handler. at window-onerror-for-isolated-world-1.html:51
-Main world window.onerror: Error: Error in user script load handler. at undefined:7
-Main world error event listener: Error: Error in user script load handler. at undefined:7
+Main world window.onerror: Error: Error in user script load handler. at undefined:8
+Main world error event listener: Error: Error in user script load handler. at undefined:8
 Main world window.onerror: Error: Error in main world setTimeout callback. at window-onerror-for-isolated-world-1.html:49
 Main world error event listener: Error: Error in main world setTimeout callback. at window-onerror-for-isolated-world-1.html:49
-Main world window.onerror: Error: Error in user script setTimeout callback. at undefined:5
-Main world error event listener: Error: Error in user script setTimeout callback. at undefined:5
+Main world window.onerror: Error: Error in user script setTimeout callback. at undefined:6
+Main world error event listener: Error: Error in user script setTimeout callback. at undefined:6
index cdd8fec..30720d0 100644 (file)
@@ -1,13 +1,13 @@
 CONSOLE MESSAGE: line 30: Error: Error in main world inline script.
 Test that window.onerror and "error" event listeners from isolated world are invoked for uncaught exceptions in user scripts running in isolate worlds as well as for exceptions in the main world.Bug 8519.
 
-user script window.onerror: Error: Error in user script inline script. at undefined:31
-user script error event listener: Error: Error in user script inline script. at undefined:31
+user script window.onerror: Error: Error in user script inline script. at undefined:33
+user script error event listener: Error: Error in user script inline script. at undefined:33
 user script window.onerror: Error: Error in main world load handler. at window-onerror-for-isolated-world-2.html:27
 user script error event listener: Error: Error in main world load handler. at window-onerror-for-isolated-world-2.html:27
-user script window.onerror: Error: Error in user script load handler. at undefined:28
-user script error event listener: Error: Error in user script load handler. at undefined:28
+user script window.onerror: Error: Error in user script load handler. at undefined:30
+user script error event listener: Error: Error in user script load handler. at undefined:30
 user script window.onerror: Error: Error in main world setTimeout callback. at window-onerror-for-isolated-world-2.html:25
 user script error event listener: Error: Error in main world setTimeout callback. at window-onerror-for-isolated-world-2.html:25
-user script window.onerror: Error: Error in user script setTimeout callback. at undefined:26
-user script error event listener: Error: Error in user script setTimeout callback. at undefined:26
+user script window.onerror: Error: Error in user script setTimeout callback. at undefined:28
+user script error event listener: Error: Error in user script setTimeout callback. at undefined:28
index 4516d3c..0ecd19a 100644 (file)
@@ -84,11 +84,13 @@ static void assertEqualsAsUTF8String(JSValueRef value, const char* expectedValue
     size_t jsSize = JSStringGetMaximumUTF8CStringSize(valueAsString);
     char* jsBuffer = (char*)malloc(jsSize);
     JSStringGetUTF8CString(valueAsString, jsBuffer, jsSize);
-    
+
     unsigned i;
     for (i = 0; jsBuffer[i]; i++) {
         if (jsBuffer[i] != expectedValue[i]) {
             fprintf(stderr, "assertEqualsAsUTF8String failed at character %d: %c(%d) != %c(%d)\n", i, jsBuffer[i], jsBuffer[i], expectedValue[i], expectedValue[i]);
+            fprintf(stderr, "value: %s\n", jsBuffer);
+            fprintf(stderr, "expectedValue: %s\n", expectedValue);
             failed = 1;
         }
     }
@@ -1590,7 +1592,7 @@ int main(int argc, char* argv[])
     ASSERT(!JSObjectMakeFunction(context, NULL, 0, NULL, functionBody, NULL, 1, &exception));
     ASSERT(JSValueIsObject(context, exception));
     v = JSObjectGetProperty(context, JSValueToObject(context, exception, NULL), line, NULL);
-    assertEqualsAsNumber(v, 1);
+    assertEqualsAsNumber(v, 2);
     JSStringRelease(functionBody);
     JSStringRelease(line);
 
@@ -1600,7 +1602,7 @@ int main(int argc, char* argv[])
     ASSERT(!JSObjectMakeFunction(context, NULL, 0, NULL, functionBody, NULL, -42, &exception));
     ASSERT(JSValueIsObject(context, exception));
     v = JSObjectGetProperty(context, JSValueToObject(context, exception, NULL), line, NULL);
-    assertEqualsAsNumber(v, 1);
+    assertEqualsAsNumber(v, 2);
     JSStringRelease(functionBody);
     JSStringRelease(line);
 
@@ -1610,7 +1612,7 @@ int main(int argc, char* argv[])
     ASSERT(!JSObjectMakeFunction(context, NULL, 0, NULL, functionBody, NULL, 1, &exception));
     ASSERT(JSValueIsObject(context, exception));
     v = JSObjectGetProperty(context, JSValueToObject(context, exception, NULL), line, NULL);
-    assertEqualsAsNumber(v, 2);
+    assertEqualsAsNumber(v, 3);
     JSStringRelease(functionBody);
     JSStringRelease(line);
 
@@ -1644,7 +1646,7 @@ int main(int argc, char* argv[])
     JSStringRelease(functionBody);
     
     string = JSValueToStringCopy(context, function, NULL);
-    assertEqualsAsUTF8String(JSValueMakeString(context, string), "function foo(foo) { return foo;\n}");
+    assertEqualsAsUTF8String(JSValueMakeString(context, string), "function foo(foo) {\nreturn foo;\n}");
     JSStringRelease(string);
 
     JSStringRef print = JSStringCreateWithUTF8CString("print");
index dd5368c..3f11430 100644 (file)
@@ -1,3 +1,84 @@
+2015-03-18  Geoffrey Garen  <ggaren@apple.com>
+
+        Function.prototype.toString should not decompile the AST
+        https://bugs.webkit.org/show_bug.cgi?id=142853
+
+        Reviewed by Sam Weinig.
+
+        To recover the function parameter string, Function.prototype.toString
+        decompiles the function parameters from the AST. This is bad for a few
+        reasons:
+
+        (1) It requires us to keep pieces of the AST live forever. This is an
+        awkward design and a waste of memory.
+
+        (2) It doesn't match Firefox or Chrome (because it changes whitespace
+        and ES6 destructuring expressions).
+
+        (3) It doesn't scale to ES6 default argument parameters, which require
+        arbitrarily complex decompilation.
+
+        (4) It can counterfeit all the line numbers in a function (because
+        whitespace can include newlines).
+
+        (5) It's expensive, and we've seen cases where websites invoke
+        Function.prototype.toString a lot by accident.
+
+        The fix is to do what we do for the rest of the function: Just quote the
+        original source text.
+
+        Since this change inevitably changes some function stringification, I
+        took the opportunity to make our stringification match Firefox's and
+        Chrome's.
+
+        * API/tests/testapi.c:
+        (assertEqualsAsUTF8String): Be more informative when this fails.
+
+        (main): Updated to match new stringification rules.
+
+        * bytecode/UnlinkedCodeBlock.cpp:
+        (JSC::UnlinkedFunctionExecutable::paramString): Deleted. Yay!
+        * bytecode/UnlinkedCodeBlock.h:
+
+        * parser/Nodes.h:
+        (JSC::StatementNode::isFuncDeclNode): New helper for constructing
+        anonymous functions.
+
+        * parser/SourceCode.h:
+        (JSC::SourceCode::SourceCode): Allow zero because WebCore wants it.
+
+        * runtime/CodeCache.cpp:
+        (JSC::CodeCache::getFunctionExecutableFromGlobalCode): Updated for use
+        of function declaration over function expression.
+
+        * runtime/Executable.cpp:
+        (JSC::FunctionExecutable::paramString): Deleted. Yay!
+        * runtime/Executable.h:
+        (JSC::FunctionExecutable::parameterCount):
+
+        * runtime/FunctionConstructor.cpp:
+        (JSC::constructFunctionSkippingEvalEnabledCheck): Added a newline after
+        the opening brace to match Firefox and Chrome, and a space after the comma
+        to match Firefox and WebKit coding style. Added the function name to
+        the text of the function so it would look right when stringify-ing. Switched
+        from parentheses to braces to produce a function declaration instead of
+        a function expression because we are required to exclude the function's
+        name from its scope, and that's what a function declaration does.
+
+        * runtime/FunctionPrototype.cpp:
+        (JSC::functionProtoFuncToString): Removed an old workaround because the
+        library it worked around doesn't really exist anymore, and the behavior
+        doesn't match Firefox or Chrome. Use type profiling offsets instead of
+        function body offsets because we want to include the function name and
+        the parameter string, rather than stitching them in manually by
+        decompiling the AST.
+
+        (JSC::insertSemicolonIfNeeded): Deleted.
+
+        * tests/mozilla/js1_2/function/tostring-1.js:
+        * tests/mozilla/js1_5/Scope/regress-185485.js:
+        (with.g): Updated these test results for formatting changes.
+
 2015-03-20  Joseph Pecoraro  <pecoraro@apple.com>
 
         SyntaxChecker assertion is trapped with computed property name and getter
index f3a4fa8..560d734 100644 (file)
@@ -200,18 +200,6 @@ UnlinkedFunctionCodeBlock* UnlinkedFunctionExecutable::codeBlockFor(
     return result;
 }
 
-String UnlinkedFunctionExecutable::paramString() const
-{
-    FunctionParameters& parameters = *m_parameters;
-    StringBuilder builder;
-    for (size_t pos = 0; pos < parameters.size(); ++pos) {
-        if (!builder.isEmpty())
-            builder.appendLiteral(", ");
-        parameters.at(pos)->toString(builder);
-    }
-    return builder.toString();
-}
-
 UnlinkedCodeBlock::UnlinkedCodeBlock(VM* vm, Structure* structure, CodeType codeType, const ExecutableInfo& info)
     : Base(*vm, structure)
     , m_numVars(0)
index 0b1a0c6..25ffee7 100644 (file)
@@ -131,8 +131,6 @@ public:
     unsigned typeProfilingStartOffset() const { return m_typeProfilingStartOffset; }
     unsigned typeProfilingEndOffset() const { return m_typeProfilingEndOffset; }
 
-    String paramString() const;
-
     UnlinkedFunctionCodeBlock* codeBlockFor(
         VM&, const SourceCode&, CodeSpecializationKind, DebuggerMode, ProfilerMode, 
         ParserError&);
index d562917..abed72c 100644 (file)
@@ -1852,7 +1852,7 @@ inline StatementNode* BlockNode::lastStatement() const
     return m_statements ? m_statements->lastStatement() : 0;
 }
 
-inline StatementNode* BlockNode::singleStatement() const
+StatementNode* BlockNode::singleStatement() const
 {
     return m_statements ? m_statements->singleStatement() : 0;
 }
index d0bbe80..594c2f6 100644 (file)
@@ -196,6 +196,7 @@ namespace JSC {
         virtual bool isBreak() const { return false; }
         virtual bool isContinue() const { return false; }
         virtual bool isBlock() const { return false; }
+        virtual bool isFuncDeclNode() const { return false; }
 
     protected:
         StatementNode* m_next;
@@ -1769,6 +1770,7 @@ namespace JSC {
     public:
         FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
 
+        virtual bool isFuncDeclNode() const override { return true; }
         FunctionBodyNode* body() { return m_body; }
 
     private:
index 73d23db..792c19e 100644 (file)
@@ -63,8 +63,8 @@ namespace JSC {
             : m_provider(provider)
             , m_startChar(0)
             , m_endChar(m_provider->source().length())
-            , m_firstLine(std::max(firstLine, 1))
-            , m_startColumn(std::max(startColumn, 1))
+            , m_firstLine(std::max(firstLine, 0))
+            , m_startColumn(std::max(startColumn, 0))
         {
         }
 
@@ -72,8 +72,8 @@ namespace JSC {
             : m_provider(provider)
             , m_startChar(start)
             , m_endChar(end)
-            , m_firstLine(std::max(firstLine, 1))
-            , m_startColumn(std::max(startColumn, 1))
+            , m_firstLine(std::max(firstLine, 0))
+            , m_startColumn(std::max(startColumn, 0))
         {
         }
 
index 95621e4..3e67a27 100644 (file)
@@ -130,6 +130,7 @@ UnlinkedEvalCodeBlock* CodeCache::getEvalCodeBlock(VM& vm, EvalExecutable* execu
     return getGlobalCodeBlock<UnlinkedEvalCodeBlock>(vm, executable, source, builtinMode, strictMode, debuggerMode, profilerMode, error);
 }
 
+// FIXME: There's no need to add the function's name to the key here. It's already in the source code.
 UnlinkedFunctionExecutable* CodeCache::getFunctionExecutableFromGlobalCode(VM& vm, const Identifier& name, const SourceCode& source, ParserError& error)
 {
     SourceCodeKey key = SourceCodeKey(
@@ -150,20 +151,25 @@ UnlinkedFunctionExecutable* CodeCache::getFunctionExecutableFromGlobalCode(VM& v
         return nullptr;
     }
 
-    // This function assumes an input string that would result in a single anonymous function expression.
-    StatementNode* exprStatement = program->singleStatement();
-    RELEASE_ASSERT(exprStatement);
-    RELEASE_ASSERT(exprStatement->isExprStatement());
-    ExpressionNode* funcExpr = static_cast<ExprStatementNode*>(exprStatement)->expr();
-    RELEASE_ASSERT(funcExpr);
-    RELEASE_ASSERT(funcExpr->isFuncExprNode());
-    FunctionBodyNode* body = static_cast<FuncExprNode*>(funcExpr)->body();
-    RELEASE_ASSERT(!program->hasCapturedVariables());
+    // This function assumes an input string that would result in a single function declaration.
+    StatementNode* statement = program->singleStatement();
+    ASSERT(statement);
+    ASSERT(statement->isBlock());
+    if (!statement || !statement->isBlock())
+        return nullptr;
+
+    StatementNode* funcDecl = static_cast<BlockNode*>(statement)->singleStatement();
+    ASSERT(funcDecl);
+    ASSERT(funcDecl->isFuncDeclNode());
+    if (!funcDecl || !funcDecl->isFuncDeclNode())
+        return nullptr;
+
+    FunctionBodyNode* body = static_cast<FuncDeclNode*>(funcDecl)->body();
+    ASSERT(body);
+    if (!body)
+        return nullptr;
     
     body->setEndPosition(positionBeforeLastNewline);
-    RELEASE_ASSERT(body);
-    RELEASE_ASSERT(body->ident().isNull());
-
     UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&vm, source, body, UnlinkedNormalFunction);
     functionExecutable->m_nameValue.set(vm, functionExecutable, jsString(&vm, name.string()));
 
index 0906fa3..19daa98 100644 (file)
@@ -615,11 +615,6 @@ FunctionExecutable* FunctionExecutable::fromGlobalCode(const Identifier& name, E
     return unlinkedExecutable->link(exec.vm(), source);
 }
 
-String FunctionExecutable::paramString() const
-{
-    return m_unlinkedExecutable->paramString();
-}
-
 void ExecutableBase::dump(PrintStream& out) const
 {
     ExecutableBase* realThis = const_cast<ExecutableBase*>(this);
index ed8e9b6..3cfce13 100644 (file)
@@ -625,7 +625,6 @@ public:
     const Identifier& inferredName() { return m_unlinkedExecutable->inferredName(); }
     JSString* nameValue() const { return m_unlinkedExecutable->nameValue(); }
     size_t parameterCount() const { return m_unlinkedExecutable->parameterCount(); } // Excluding 'this'!
-    String paramString() const;
     SymbolTable* symbolTable(CodeSpecializationKind);
 
     void clearCodeIfNotCompiling();
index dbca868..76a7140 100644 (file)
@@ -88,25 +88,26 @@ JSObject* constructFunction(ExecState* exec, JSGlobalObject* globalObject, const
 
 JSObject* constructFunctionSkippingEvalEnabledCheck(ExecState* exec, JSGlobalObject* globalObject, const ArgList& args, const Identifier& functionName, const String& sourceURL, const TextPosition& position)
 {
-    // Functions need to have a space following the opening { due to for web compatibility
-    // see https://bugs.webkit.org/show_bug.cgi?id=24350
-    // We also need \n before the closing } to handle // comments at the end of the last line
+    // How we stringify functions is sometimes important for web compatibility.
+    // See https://bugs.webkit.org/show_bug.cgi?id=24350.
     String program;
     if (args.isEmpty())
-        program = ASCIILiteral("(function() { \n})");
+        program = makeString("{function ", functionName.string(), "() {\n\n}}");
     else if (args.size() == 1)
-        program = makeString("(function() { ", args.at(0).toString(exec)->value(exec), "\n})");
+        program = makeString("{function ", functionName.string(), "() {\n", args.at(0).toString(exec)->value(exec), "\n}}");
     else {
         StringBuilder builder;
-        builder.appendLiteral("(function(");
+        builder.appendLiteral("{function ");
+        builder.append(functionName.string());
+        builder.append("(");
         builder.append(args.at(0).toString(exec)->value(exec));
         for (size_t i = 1; i < args.size() - 1; i++) {
-            builder.append(',');
+            builder.append(", ");
             builder.append(args.at(i).toString(exec)->value(exec));
         }
-        builder.appendLiteral(") { ");
+        builder.appendLiteral(") {\n");
         builder.append(args.at(args.size() - 1).toString(exec)->value(exec));
-        builder.appendLiteral("\n})");
+        builder.appendLiteral("\n}}");
         program = builder.toString();
     }
 
index 488fc1e..10cdb57 100644 (file)
@@ -79,24 +79,6 @@ CallType FunctionPrototype::getCallData(JSCell*, CallData& callData)
     return CallTypeHost;
 }
 
-// Functions
-
-// Compatibility hack for the Optimost JavaScript library. (See <rdar://problem/6595040>.)
-static inline void insertSemicolonIfNeeded(String& functionBody)
-{
-    ASSERT(functionBody[0] == '{');
-    ASSERT(functionBody[functionBody.length() - 1] == '}');
-
-    for (size_t i = functionBody.length() - 2; i > 0; --i) {
-        UChar ch = functionBody[i];
-        if (!Lexer<UChar>::isWhiteSpace(ch) && !Lexer<UChar>::isLineTerminator(ch)) {
-            if (ch != ';' && ch != '}')
-                functionBody = makeString(functionBody.substringSharingImpl(0, i + 1), ';', functionBody.substringSharingImpl(i + 1, functionBody.length() - (i + 1)));
-            return;
-        }
-    }
-}
-
 EncodedJSValue JSC_HOST_CALL functionProtoFuncToString(ExecState* exec)
 {
     JSValue thisValue = exec->thisValue();
@@ -104,10 +86,12 @@ EncodedJSValue JSC_HOST_CALL functionProtoFuncToString(ExecState* exec)
         JSFunction* function = jsCast<JSFunction*>(thisValue);
         if (function->isHostOrBuiltinFunction())
             return JSValue::encode(jsMakeNontrivialString(exec, "function ", function->name(exec), "() {\n    [native code]\n}"));
+
         FunctionExecutable* executable = function->jsExecutable();
-        String sourceString = executable->source().toString();
-        insertSemicolonIfNeeded(sourceString);
-        return JSValue::encode(jsMakeNontrivialString(exec, "function ", function->name(exec), "(", executable->paramString(), ") ", sourceString));
+        String source = executable->source().provider()->getRange(
+            executable->typeProfilingStartOffset(),
+            executable->typeProfilingEndOffset() + 1); // Type profiling end offset is the character before the '}'.
+        return JSValue::encode(jsMakeNontrivialString(exec, source));
     }
 
     if (thisValue.inherits(InternalFunction::info())) {
index cf83f48..8e152cc 100644 (file)
@@ -65,7 +65,7 @@ function simplify(str)
 
     t5 = new TestFunction( "anonymous", "", tab+"return \"hello!\";" );
 
-    var f = new Function( "return \"hello!\"");
+    var f = new Function( "return \"hello!\";");
 
     testcases[tc++] = new TestCase( SECTION,
                                     "stub.toString()",
index a940b55..1e8f94f 100644 (file)
@@ -119,7 +119,7 @@ addThis();
  */
 with (x)
 {
-  var g = function() {}
+  var g = function () {}
 }
 status = inSection(5);
 actual = x.g.toString();
index fec540f..dd448cc 100644 (file)
@@ -1,3 +1,19 @@
+2015-03-19  Geoffrey Garen  <ggaren@apple.com>
+
+        Function.prototype.toString should not decompile the AST
+        https://bugs.webkit.org/show_bug.cgi?id=142853
+
+        Reviewed by Sam Weinig.
+
+        * bindings/js/JSLazyEventListener.cpp:
+        (WebCore::JSLazyEventListener::initializeJSFunction): Adjust the line
+        number of attribute event listeners to account for the leading newline
+        now added by JavaScriptCore.
+
+        This solution is not perfect, but there are a lot of pre-existing problems
+        with line and column reporting for attribute event listeners, and this
+        preserves existing behavior with reasonable reliability.
+
 2015-03-20  Alex Christensen  <achristensen@webkit.org>
 
         Progress towards CMake on Mac.
index 6dde510..c3ab825 100644 (file)
@@ -103,7 +103,16 @@ JSObject* JSLazyEventListener::initializeJSFunction(ScriptExecutionContext* exec
     args.append(jsNontrivialString(exec, m_eventParameterName));
     args.append(jsStringWithCache(exec, m_code));
 
-    JSObject* jsFunction = constructFunctionSkippingEvalEnabledCheck(exec, exec->lexicalGlobalObject(), args, Identifier(exec, m_functionName), m_sourceURL, m_position); // FIXME: is globalExec ok?
+    // Move our text position backward one line. Creating an anonymous function
+    // will add a line for a function declaration, but we want our line number
+    // to match up with where the attribute was declared.
+    TextPosition position(
+        OrdinalNumber::fromOneBasedInt(
+            m_position.m_line.oneBasedInt() - 1), m_position.m_column);
+    JSObject* jsFunction = constructFunctionSkippingEvalEnabledCheck(
+        exec, exec->lexicalGlobalObject(), args, Identifier(exec, m_functionName), 
+        m_sourceURL, position);
+
     if (exec->hadException()) {
         reportCurrentException(exec);
         exec->clearException();