summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/extensions
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /js/src/tests/non262/extensions
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/tests/non262/extensions')
-rw-r--r--js/src/tests/non262/extensions/15.9.4.2.js56
-rw-r--r--js/src/tests/non262/extensions/8.12.5-01.js70
-rw-r--r--js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js80
-rw-r--r--js/src/tests/non262/extensions/Boolean-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js80
-rw-r--r--js/src/tests/non262/extensions/DataView-set-arguments-detaching.js84
-rw-r--r--js/src/tests/non262/extensions/Number-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js11
-rw-r--r--js/src/tests/non262/extensions/String-match-flags.js27
-rw-r--r--js/src/tests/non262/extensions/String-methods-infinite-recursion.js36
-rw-r--r--js/src/tests/non262/extensions/String-toSource.js16
-rw-r--r--js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js55
-rw-r--r--js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js111
-rw-r--r--js/src/tests/non262/extensions/__proto__.js53
-rw-r--r--js/src/tests/non262/extensions/arguments-property-access-in-function.js58
-rw-r--r--js/src/tests/non262/extensions/array-inherited-__proto__.js32
-rw-r--r--js/src/tests/non262/extensions/array-isArray-proxy-recursion.js41
-rw-r--r--js/src/tests/non262/extensions/array-length-protochange.js35
-rw-r--r--js/src/tests/non262/extensions/array-pop-proxy.js24
-rw-r--r--js/src/tests/non262/extensions/array-toString-recursion.js46
-rw-r--r--js/src/tests/non262/extensions/arraybuffer-prototype.js28
-rw-r--r--js/src/tests/non262/extensions/bad-regexp-data-clone.js20
-rw-r--r--js/src/tests/non262/extensions/basic-for-each.js58
-rw-r--r--js/src/tests/non262/extensions/basic-for-in.js46
-rw-r--r--js/src/tests/non262/extensions/browser.js6
-rw-r--r--js/src/tests/non262/extensions/bug472534.js30
-rw-r--r--js/src/tests/non262/extensions/builtin-function-arguments-caller.js60
-rw-r--r--js/src/tests/non262/extensions/censor-strict-caller.js15
-rw-r--r--js/src/tests/non262/extensions/clone-bigint.js20
-rw-r--r--js/src/tests/non262/extensions/clone-complex-object.js313
-rw-r--r--js/src/tests/non262/extensions/clone-errors.js110
-rw-r--r--js/src/tests/non262/extensions/clone-forge.js39
-rw-r--r--js/src/tests/non262/extensions/clone-invalid-property-key.js22
-rw-r--r--js/src/tests/non262/extensions/clone-leaf-object.js68
-rw-r--r--js/src/tests/non262/extensions/clone-many-transferables.js25
-rw-r--r--js/src/tests/non262/extensions/clone-object-deep.js25
-rw-r--r--js/src/tests/non262/extensions/clone-object.js143
-rw-r--r--js/src/tests/non262/extensions/clone-regexp.js36
-rw-r--r--js/src/tests/non262/extensions/clone-sab-failure.js39
-rw-r--r--js/src/tests/non262/extensions/clone-sab.js31
-rw-r--r--js/src/tests/non262/extensions/clone-simple.js33
-rw-r--r--js/src/tests/non262/extensions/clone-transferables.js129
-rw-r--r--js/src/tests/non262/extensions/clone-typed-array.js104
-rw-r--r--js/src/tests/non262/extensions/clone-v1-typed-array-data.dat32
-rw-r--r--js/src/tests/non262/extensions/clone-v1-typed-array.js130
-rw-r--r--js/src/tests/non262/extensions/collect-gray.js153
-rw-r--r--js/src/tests/non262/extensions/column-numbers.js10
-rw-r--r--js/src/tests/non262/extensions/cross-global-eval-is-indirect.js60
-rw-r--r--js/src/tests/non262/extensions/cross-global-getPrototypeOf.js55
-rw-r--r--js/src/tests/non262/extensions/dataview.js1647
-rw-r--r--js/src/tests/non262/extensions/decompile-for-of.js27
-rw-r--r--js/src/tests/non262/extensions/destructure-accessor.js75
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js49
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js49
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js50
-rw-r--r--js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js85
-rw-r--r--js/src/tests/non262/extensions/destructuring-order.js150
-rw-r--r--js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js35
-rw-r--r--js/src/tests/non262/extensions/empty.txt0
-rw-r--r--js/src/tests/non262/extensions/error-tostring-function.js45
-rw-r--r--js/src/tests/non262/extensions/errorcolumnblame.js79
-rw-r--r--js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js281
-rw-r--r--js/src/tests/non262/extensions/eval-native-callback-is-indirect.js33
-rw-r--r--js/src/tests/non262/extensions/expression-closure-syntax.js62
-rw-r--r--js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js105
-rw-r--r--js/src/tests/non262/extensions/file-mapped-arraybuffers.js48
-rw-r--r--js/src/tests/non262/extensions/file-mapped-arraybuffers.txt1
-rw-r--r--js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js130
-rw-r--r--js/src/tests/non262/extensions/function-caller-skips-eval-frames.js34
-rw-r--r--js/src/tests/non262/extensions/function-caller-strict-cross-global.js16
-rw-r--r--js/src/tests/non262/extensions/function-definition-with.js56
-rw-r--r--js/src/tests/non262/extensions/function-properties.js21
-rw-r--r--js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js26
-rw-r--r--js/src/tests/non262/extensions/getset-001.js49
-rw-r--r--js/src/tests/non262/extensions/getset-003.js186
-rw-r--r--js/src/tests/non262/extensions/getset-004.js174
-rw-r--r--js/src/tests/non262/extensions/getset-005.js183
-rw-r--r--js/src/tests/non262/extensions/getset-006.js157
-rw-r--r--js/src/tests/non262/extensions/inc-dec-functioncall.js90
-rw-r--r--js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js99
-rw-r--r--js/src/tests/non262/extensions/keyword-unescaped-requirement.js43
-rw-r--r--js/src/tests/non262/extensions/mutable-proto-special-form.js91
-rw-r--r--js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js85
-rw-r--r--js/src/tests/non262/extensions/new-cross-compartment.js39
-rw-r--r--js/src/tests/non262/extensions/new-parenthesization.js21
-rw-r--r--js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js94
-rw-r--r--js/src/tests/non262/extensions/non_syntactic.js39
-rw-r--r--js/src/tests/non262/extensions/object-toSource-override-on-getter.js14
-rw-r--r--js/src/tests/non262/extensions/object-toSource-undefined-getter.js11
-rw-r--r--js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js16
-rw-r--r--js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js27
-rw-r--r--js/src/tests/non262/extensions/preventExtensions-cross-global.js49
-rw-r--r--js/src/tests/non262/extensions/proxy-array-target-length-definition.js55
-rw-r--r--js/src/tests/non262/extensions/proxy-enumeration.js4
-rw-r--r--js/src/tests/non262/extensions/proxy-proto-setter.js50
-rw-r--r--js/src/tests/non262/extensions/proxy-strict.js12
-rw-r--r--js/src/tests/non262/extensions/quote-string-for-nul-character.js94
-rw-r--r--js/src/tests/non262/extensions/recursion.js60
-rw-r--r--js/src/tests/non262/extensions/redeclaration-of-catch-warning.js37
-rw-r--r--js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js41
-rw-r--r--js/src/tests/non262/extensions/regress-103087.js141
-rw-r--r--js/src/tests/non262/extensions/regress-104077.js195
-rw-r--r--js/src/tests/non262/extensions/regress-178722.js90
-rw-r--r--js/src/tests/non262/extensions/regress-188206-01.js71
-rw-r--r--js/src/tests/non262/extensions/regress-188206-02.js121
-rw-r--r--js/src/tests/non262/extensions/regress-192465.js122
-rw-r--r--js/src/tests/non262/extensions/regress-220367-002.js75
-rw-r--r--js/src/tests/non262/extensions/regress-226078.js33
-rw-r--r--js/src/tests/non262/extensions/regress-228087.js316
-rw-r--r--js/src/tests/non262/extensions/regress-245148.js20
-rw-r--r--js/src/tests/non262/extensions/regress-255245.js29
-rw-r--r--js/src/tests/non262/extensions/regress-274152.js48
-rw-r--r--js/src/tests/non262/extensions/regress-300079.js42
-rw-r--r--js/src/tests/non262/extensions/regress-311161.js1440
-rw-r--r--js/src/tests/non262/extensions/regress-311792-01.js26
-rw-r--r--js/src/tests/non262/extensions/regress-311792-02.js40
-rw-r--r--js/src/tests/non262/extensions/regress-313763.js46
-rw-r--r--js/src/tests/non262/extensions/regress-314874.js35
-rw-r--r--js/src/tests/non262/extensions/regress-315509-02.js42
-rw-r--r--js/src/tests/non262/extensions/regress-319683.js31
-rw-r--r--js/src/tests/non262/extensions/regress-320854.js20
-rw-r--r--js/src/tests/non262/extensions/regress-327170.js25
-rw-r--r--js/src/tests/non262/extensions/regress-327608.js42
-rw-r--r--js/src/tests/non262/extensions/regress-328443.js32
-rw-r--r--js/src/tests/non262/extensions/regress-330569.js91
-rw-r--r--js/src/tests/non262/extensions/regress-333541.js59
-rw-r--r--js/src/tests/non262/extensions/regress-336409-1.js50
-rw-r--r--js/src/tests/non262/extensions/regress-336409-2.js49
-rw-r--r--js/src/tests/non262/extensions/regress-336410-1.js50
-rw-r--r--js/src/tests/non262/extensions/regress-336410-2.js49
-rw-r--r--js/src/tests/non262/extensions/regress-339685.js27
-rw-r--r--js/src/tests/non262/extensions/regress-341956-01.js65
-rw-r--r--js/src/tests/non262/extensions/regress-341956-02.js52
-rw-r--r--js/src/tests/non262/extensions/regress-341956-03.js69
-rw-r--r--js/src/tests/non262/extensions/regress-342960.js43
-rw-r--r--js/src/tests/non262/extensions/regress-345967.js65
-rw-r--r--js/src/tests/non262/extensions/regress-346642-06.js59
-rw-r--r--js/src/tests/non262/extensions/regress-346773.js49
-rw-r--r--js/src/tests/non262/extensions/regress-350312-01.js43
-rw-r--r--js/src/tests/non262/extensions/regress-350312.js66
-rw-r--r--js/src/tests/non262/extensions/regress-351070-02.js65
-rw-r--r--js/src/tests/non262/extensions/regress-351448.js59
-rw-r--r--js/src/tests/non262/extensions/regress-351463-01.js250
-rw-r--r--js/src/tests/non262/extensions/regress-351973.js50
-rw-r--r--js/src/tests/non262/extensions/regress-352291.js38
-rw-r--r--js/src/tests/non262/extensions/regress-352372.js62
-rw-r--r--js/src/tests/non262/extensions/regress-352604.js30
-rw-r--r--js/src/tests/non262/extensions/regress-353116.js75
-rw-r--r--js/src/tests/non262/extensions/regress-353214-02.js27
-rw-r--r--js/src/tests/non262/extensions/regress-354297.js27
-rw-r--r--js/src/tests/non262/extensions/regress-355052-01.js34
-rw-r--r--js/src/tests/non262/extensions/regress-355052-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-355052-03.js40
-rw-r--r--js/src/tests/non262/extensions/regress-355410.js37
-rw-r--r--js/src/tests/non262/extensions/regress-355497.js58
-rw-r--r--js/src/tests/non262/extensions/regress-363040-01.js62
-rw-r--r--js/src/tests/non262/extensions/regress-363040-02.js61
-rw-r--r--js/src/tests/non262/extensions/regress-363258.js45
-rw-r--r--js/src/tests/non262/extensions/regress-363988.js44
-rw-r--r--js/src/tests/non262/extensions/regress-365527.js63
-rw-r--r--js/src/tests/non262/extensions/regress-365692.js40
-rw-r--r--js/src/tests/non262/extensions/regress-365869.js35
-rw-r--r--js/src/tests/non262/extensions/regress-366288.js18
-rw-r--r--js/src/tests/non262/extensions/regress-366292.js19
-rw-r--r--js/src/tests/non262/extensions/regress-366396.js17
-rw-r--r--js/src/tests/non262/extensions/regress-366668-01.js28
-rw-r--r--js/src/tests/non262/extensions/regress-367501-01.js32
-rw-r--r--js/src/tests/non262/extensions/regress-367501-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-367501-03.js35
-rw-r--r--js/src/tests/non262/extensions/regress-367501-04.js35
-rw-r--r--js/src/tests/non262/extensions/regress-367589.js39
-rw-r--r--js/src/tests/non262/extensions/regress-368213.js17
-rw-r--r--js/src/tests/non262/extensions/regress-368224.js25
-rw-r--r--js/src/tests/non262/extensions/regress-368516.js41
-rw-r--r--js/src/tests/non262/extensions/regress-369404.js39
-rw-r--r--js/src/tests/non262/extensions/regress-369696-01.js30
-rw-r--r--js/src/tests/non262/extensions/regress-369696-02.js57
-rw-r--r--js/src/tests/non262/extensions/regress-369696-03.js46
-rw-r--r--js/src/tests/non262/extensions/regress-372309.js37
-rw-r--r--js/src/tests/non262/extensions/regress-375183.js59
-rw-r--r--js/src/tests/non262/extensions/regress-375344.js34
-rw-r--r--js/src/tests/non262/extensions/regress-379566.js44
-rw-r--r--js/src/tests/non262/extensions/regress-380889.js37
-rw-r--r--js/src/tests/non262/extensions/regress-381303.js34
-rw-r--r--js/src/tests/non262/extensions/regress-381304.js69
-rw-r--r--js/src/tests/non262/extensions/regress-385393-02.js31
-rw-r--r--js/src/tests/non262/extensions/regress-385393-08.js25
-rw-r--r--js/src/tests/non262/extensions/regress-390598.js31
-rw-r--r--js/src/tests/non262/extensions/regress-394967.js39
-rw-r--r--js/src/tests/non262/extensions/regress-396326-01.js34
-rw-r--r--js/src/tests/non262/extensions/regress-396326.js45
-rw-r--r--js/src/tests/non262/extensions/regress-406572.js47
-rw-r--r--js/src/tests/non262/extensions/regress-407501.js39
-rw-r--r--js/src/tests/non262/extensions/regress-407720.js44
-rw-r--r--js/src/tests/non262/extensions/regress-412926.js54
-rw-r--r--js/src/tests/non262/extensions/regress-414098.js34
-rw-r--r--js/src/tests/non262/extensions/regress-414755.js51
-rw-r--r--js/src/tests/non262/extensions/regress-416354.js45
-rw-r--r--js/src/tests/non262/extensions/regress-416460.js27
-rw-r--r--js/src/tests/non262/extensions/regress-416834.js20
-rw-r--r--js/src/tests/non262/extensions/regress-420869-01.js37
-rw-r--r--js/src/tests/non262/extensions/regress-422592.js65
-rw-r--r--js/src/tests/non262/extensions/regress-424683-01.js33
-rw-r--r--js/src/tests/non262/extensions/regress-426711.js31
-rw-r--r--js/src/tests/non262/extensions/regress-427196-01.js37
-rw-r--r--js/src/tests/non262/extensions/regress-427196-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-427196-03.js28
-rw-r--r--js/src/tests/non262/extensions/regress-429739.js33
-rw-r--r--js/src/tests/non262/extensions/regress-430740.js36
-rw-r--r--js/src/tests/non262/extensions/regress-434837-01.js87
-rw-r--r--js/src/tests/non262/extensions/regress-435497-01.js31
-rw-r--r--js/src/tests/non262/extensions/regress-435497-02.js31
-rw-r--r--js/src/tests/non262/extensions/regress-435497-03.js31
-rw-r--r--js/src/tests/non262/extensions/regress-436741.js32
-rw-r--r--js/src/tests/non262/extensions/regress-437288-01.js32
-rw-r--r--js/src/tests/non262/extensions/regress-44009.js51
-rw-r--r--js/src/tests/non262/extensions/regress-443569.js35
-rw-r--r--js/src/tests/non262/extensions/regress-446386.js44
-rw-r--r--js/src/tests/non262/extensions/regress-452168.js39
-rw-r--r--js/src/tests/non262/extensions/regress-452178.js27
-rw-r--r--js/src/tests/non262/extensions/regress-452329.js24
-rw-r--r--js/src/tests/non262/extensions/regress-452338.js26
-rw-r--r--js/src/tests/non262/extensions/regress-452498-162.js24
-rw-r--r--js/src/tests/non262/extensions/regress-452498-196.js32
-rw-r--r--js/src/tests/non262/extensions/regress-452565.js19
-rw-r--r--js/src/tests/non262/extensions/regress-452913.js18
-rw-r--r--js/src/tests/non262/extensions/regress-453249.js21
-rw-r--r--js/src/tests/non262/extensions/regress-454744.js32
-rw-r--r--js/src/tests/non262/extensions/regress-455380.js60
-rw-r--r--js/src/tests/non262/extensions/regress-455408.js26
-rw-r--r--js/src/tests/non262/extensions/regress-456826.js126
-rw-r--r--js/src/tests/non262/extensions/regress-459606.js26
-rw-r--r--js/src/tests/non262/extensions/regress-462734-02.js26
-rw-r--r--js/src/tests/non262/extensions/regress-462734-03.js25
-rw-r--r--js/src/tests/non262/extensions/regress-462734-04.js29
-rw-r--r--js/src/tests/non262/extensions/regress-465276.js29
-rw-r--r--js/src/tests/non262/extensions/regress-465337.js28
-rw-r--r--js/src/tests/non262/extensions/regress-465443.js36
-rw-r--r--js/src/tests/non262/extensions/regress-465453.js38
-rw-r--r--js/src/tests/non262/extensions/regress-466905-04.js46
-rw-r--r--js/src/tests/non262/extensions/regress-469234.js27
-rw-r--r--js/src/tests/non262/extensions/regress-469405-01.js27
-rw-r--r--js/src/tests/non262/extensions/regress-469405-02.js25
-rw-r--r--js/src/tests/non262/extensions/regress-469625-01.js39
-rw-r--r--js/src/tests/non262/extensions/regress-469625.js28
-rw-r--r--js/src/tests/non262/extensions/regress-469761.js28
-rw-r--r--js/src/tests/non262/extensions/regress-470300-01.js27
-rw-r--r--js/src/tests/non262/extensions/regress-470300-02.js27
-rw-r--r--js/src/tests/non262/extensions/regress-470310.js30
-rw-r--r--js/src/tests/non262/extensions/regress-472450-03.js31
-rw-r--r--js/src/tests/non262/extensions/regress-472450-04.js33
-rw-r--r--js/src/tests/non262/extensions/regress-472599.js29
-rw-r--r--js/src/tests/non262/extensions/regress-473040.js25
-rw-r--r--js/src/tests/non262/extensions/regress-474771-01.js29
-rw-r--r--js/src/tests/non262/extensions/regress-474771-02.js20
-rw-r--r--js/src/tests/non262/extensions/regress-476414-01.js61
-rw-r--r--js/src/tests/non262/extensions/regress-476414-02.js61
-rw-r--r--js/src/tests/non262/extensions/regress-476447.js30
-rw-r--r--js/src/tests/non262/extensions/regress-476653.js33
-rw-r--r--js/src/tests/non262/extensions/regress-476869.js42
-rw-r--r--js/src/tests/non262/extensions/regress-477158.js28
-rw-r--r--js/src/tests/non262/extensions/regress-477187.js38
-rw-r--r--js/src/tests/non262/extensions/regress-479487.js41
-rw-r--r--js/src/tests/non262/extensions/regress-479551.js39
-rw-r--r--js/src/tests/non262/extensions/regress-480579.js35
-rw-r--r--js/src/tests/non262/extensions/regress-481516.js38
-rw-r--r--js/src/tests/non262/extensions/regress-482263.js26
-rw-r--r--js/src/tests/non262/extensions/regress-50447-1.js179
-rw-r--r--js/src/tests/non262/extensions/regress-543839.js36
-rw-r--r--js/src/tests/non262/extensions/regress-591450.js12
-rw-r--r--js/src/tests/non262/extensions/regress-636818.js9
-rw-r--r--js/src/tests/non262/extensions/regress-645160.js8
-rw-r--r--js/src/tests/non262/extensions/regress-650753.js8
-rw-r--r--js/src/tests/non262/extensions/regress-696109.js13
-rw-r--r--js/src/tests/non262/extensions/regress-90596-001.js264
-rw-r--r--js/src/tests/non262/extensions/regress-96284-001.js147
-rw-r--r--js/src/tests/non262/extensions/regress-bug607284.js16
-rw-r--r--js/src/tests/non262/extensions/regress-bug629723.js16
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js39
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js46
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array.js39
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js56
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js60
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object.js56
-rw-r--r--js/src/tests/non262/extensions/scope-001.js84
-rw-r--r--js/src/tests/non262/extensions/set-property-non-extensible.js30
-rw-r--r--js/src/tests/non262/extensions/setImmutablePrototype.js196
-rw-r--r--js/src/tests/non262/extensions/shareddataview.js43
-rw-r--r--js/src/tests/non262/extensions/sharedtypedarray.js273
-rw-r--r--js/src/tests/non262/extensions/shell.js345
-rw-r--r--js/src/tests/non262/extensions/sps-generators.js39
-rw-r--r--js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js34
-rw-r--r--js/src/tests/non262/extensions/toLength.js41
-rw-r--r--js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js31
-rw-r--r--js/src/tests/non262/extensions/toSource-infinite-recursion.js36
-rw-r--r--js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js54
-rw-r--r--js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js111
-rw-r--r--js/src/tests/non262/extensions/typedarray-set-neutering.js45
-rw-r--r--js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js33
-rw-r--r--js/src/tests/non262/extensions/typedarray.js657
-rw-r--r--js/src/tests/non262/extensions/uneval/bug496985.js14
-rw-r--r--js/src/tests/non262/extensions/uneval/bug566661.js8
-rw-r--r--js/src/tests/non262/extensions/uneval/function-bind.js32
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-231518.js99
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-245795.js33
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-254375.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-304897.js22
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-306738.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-311583.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-313803.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-322957.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-328556.js21
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-01.js31
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-02.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-03.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-04.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-05.js31
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-06.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-367629.js45
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-375801.js35
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-380581.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-380933.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-381211.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-381301.js39
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-385393-03.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-385729.js58
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-082.js33
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-101.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-117.js35
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-621814.js15
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-624199.js19
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-90596-002.js264
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-96284-002.js147
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-bug567606.js21
-rw-r--r--js/src/tests/non262/extensions/uneval/strict-function-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/uneval/symbol-uneval.js15
-rw-r--r--js/src/tests/non262/extensions/uneval/toSource-0.js16
-rw-r--r--js/src/tests/non262/extensions/unterminated-literal-error-location.js119
-rw-r--r--js/src/tests/non262/extensions/weakmap.js121
339 files changed, 21405 insertions, 0 deletions
diff --git a/js/src/tests/non262/extensions/15.9.4.2.js b/js/src/tests/non262/extensions/15.9.4.2.js
new file mode 100644
index 0000000000..91e794d259
--- /dev/null
+++ b/js/src/tests/non262/extensions/15.9.4.2.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 682754;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function iso(d)
+{
+ return new Date(d).toISOString();
+}
+
+function check(s, millis){
+ description = "Date.parse('"+s+"') == '"+iso(millis)+"'";
+ expected = millis;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function checkInvalid(s)
+{
+ description = "Date.parse('"+s+"') produces invalid date";
+ expected = NaN;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function dd(year, month, day, hour, minute, second, millis){
+ return Date.UTC(year, month-1, day, hour, minute, second, millis);
+}
+
+function TZAtDate(d){
+ return d.getTimezoneOffset() * 60000;
+}
+
+function TZInMonth(month){
+ return TZAtDate(new Date(dd(2009,month,1,0,0,0,0)));
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+
+ JanTZ = TZInMonth(1);
+ JulTZ = TZInMonth(7);
+ CurrTZ = TZAtDate(new Date());
+
+ // Allow non-standard "-0700" as timezone, not just "-07:00"
+ check("2009-07-23T00:53:21.001-0700", dd(2009,7,23,7,53,21,1));
+}
diff --git a/js/src/tests/non262/extensions/8.12.5-01.js b/js/src/tests/non262/extensions/8.12.5-01.js
new file mode 100644
index 0000000000..b7563a8edb
--- /dev/null
+++ b/js/src/tests/non262/extensions/8.12.5-01.js
@@ -0,0 +1,70 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jason Orendorff
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 523846;
+var summary =
+ "Assignments to a property that has a getter but not a setter should not " +
+ "throw a TypeError per ES5 (at least not until strict mode is supported)";
+var actual = "Early failure";
+var expect = "No errors";
+
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var o = { get p() { return "a"; } };
+
+function test1()
+{
+ o.p = "b"; // strict-mode violation here
+ assertEq(o.p, "a");
+}
+
+function test2()
+{
+ function T() {}
+ T.prototype = o;
+ y = new T();
+ y.p = "b"; // strict-mode violation here
+ assertEq(y.p, "a");
+}
+
+
+var errors = [];
+try
+{
+ try
+ {
+ test1();
+ }
+ catch (e)
+ {
+ errors.push(e);
+ }
+
+ try
+ {
+ test2();
+ }
+ catch (e)
+ {
+ errors.push(e);
+ }
+}
+catch (e)
+{
+ errors.push("Unexpected error: " + e);
+}
+finally
+{
+ actual = errors.length > 0 ? errors.join(", ") : "No errors";
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js b/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js
new file mode 100644
index 0000000000..07cec18aa9
--- /dev/null
+++ b/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js
@@ -0,0 +1,80 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "ArrayBuffer-slice-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "ArrayBuffer.prototype.slice shouldn't misbehave horribly if " +
+ "index-argument conversion detaches the ArrayBuffer being sliced";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testStart()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var start =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ ab.slice(start);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testStart();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x1000;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ ab.slice(0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteLength weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteLength weirdness");
+}
+testEnd();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/Boolean-toSource.js b/js/src/tests/non262/extensions/Boolean-toSource.js
new file mode 100644
index 0000000000..b73b21ae5d
--- /dev/null
+++ b/js/src/tests/non262/extensions/Boolean-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!Boolean.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(42)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call("")'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(new String())'), true);
+
+assertEq(completesNormally('Boolean.prototype.toSource.call(true)'), true);
+assertEq(completesNormally('Boolean.prototype.toSource.call(new Boolean(true))'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js b/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js
new file mode 100644
index 0000000000..b542816ee8
--- /dev/null
+++ b/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js
@@ -0,0 +1,80 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "DataView-construct-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "new DataView(...) shouldn't misbehave horribly if index-argument " +
+ "conversion detaches the ArrayBuffer to be viewed";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testByteOffset()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var start =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ new DataView(ab, start);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteOffset weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteOffset weirdness");
+}
+testByteOffset();
+
+function testByteLength()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var len =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ new DataView(ab, 0x800, len);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteLength weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteLength weirdness");
+}
+testByteLength();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js b/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js
new file mode 100644
index 0000000000..0f1df608f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js
@@ -0,0 +1,84 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "DataView-set-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "DataView.prototype.set* methods shouldn't misbehave horribly if " +
+ "index-argument conversion detaches the ArrayBuffer being modified";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testIndex()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var dv = new DataView(ab);
+
+ var start =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0xFFF;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ dv.setUint8(start, 0x42);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "should have thrown");
+ assertEq(ab.byteLength, 0, "should have been detached correctly");
+}
+testIndex();
+
+function testValue()
+{
+ var ab = new ArrayBuffer(0x100000);
+
+ var dv = new DataView(ab);
+
+ var value =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x42;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ dv.setUint8(0xFFFFF, value);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "should have thrown");
+ assertEq(ab.byteLength, 0, "should have been detached correctly");
+}
+testValue();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/Number-toSource.js b/js/src/tests/non262/extensions/Number-toSource.js
new file mode 100644
index 0000000000..e52a92828c
--- /dev/null
+++ b/js/src/tests/non262/extensions/Number-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!Number.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call("")'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(true)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(new Boolean(true))'), true);
+
+assertEq(completesNormally('Number.prototype.toSource.call(42)'), true);
+assertEq(completesNormally('Number.prototype.toSource.call(new Number(42))'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js b/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js
new file mode 100644
index 0000000000..fd45717476
--- /dev/null
+++ b/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js
@@ -0,0 +1,11 @@
+for (let name of ["test", Symbol.match, Symbol.replace, Symbol.search]) {
+ try {
+ RegExp.prototype[name].call({});
+ } catch (e) {
+ let methodName = typeof name === "symbol" ? `[${name.description}]` : name;
+ assertEq(e.message, `${methodName} method called on incompatible Object`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/String-match-flags.js b/js/src/tests/non262/extensions/String-match-flags.js
new file mode 100644
index 0000000000..b1a382fdfe
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-match-flags.js
@@ -0,0 +1,27 @@
+var BUGNUMBER = 1263139;
+var summary = "String.prototype.match with non-string non-standard flags argument.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called;
+var flags = {
+ toString() {
+ called = true;
+ return "";
+ }
+};
+
+called = false;
+"a".match("a", flags);
+assertEq(called, false);
+
+called = false;
+"a".search("a", flags);
+assertEq(called, false);
+
+called = false;
+"a".replace("a", "b", flags);
+assertEq(called, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/String-methods-infinite-recursion.js b/js/src/tests/non262/extensions/String-methods-infinite-recursion.js
new file mode 100644
index 0000000000..a5972d8c38
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-methods-infinite-recursion.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 657585;
+var summary =
+ 'Guard against infinite recursion when converting |this| to string for the ' +
+ 'String.prototype.* methods';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var obj = {};
+ obj.toString = String.prototype.charAt;
+ "" + obj;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown InternalError for over-recursion, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/String-toSource.js b/js/src/tests/non262/extensions/String-toSource.js
new file mode 100644
index 0000000000..ef872a96f3
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-toSource.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!String.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(42)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(true)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(undefined)'), true);
+assertEq(completesNormally('String.prototype.toSource.call("")'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js b/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js
new file mode 100644
index 0000000000..66e539b99d
--- /dev/null
+++ b/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "set-object-funky-length-detaches.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "%TypedArray%.prototype.set(object w/funky length property, offset) " +
+ "shouldn't misbehave if the funky length property detaches this typed " +
+ "array's buffer";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var ctors = [Int8Array, Uint8Array, Uint8ClampedArray,
+ Int16Array, Uint16Array,
+ Int32Array, Uint32Array,
+ Float32Array, Float64Array];
+ctors.forEach(function(TypedArray) {
+ var buf = new ArrayBuffer(512 * 1024);
+ var ta = new TypedArray(buf);
+
+ var arraylike =
+ {
+ 0: 17,
+ 1: 42,
+ 2: 3,
+ 3: 99,
+ 4: 37,
+ 5: 9,
+ 6: 72,
+ 7: 31,
+ 8: 22,
+ 9: 0,
+ get length()
+ {
+ detachArrayBuffer(buf);
+ return 10;
+ }
+ };
+
+ ta.set(arraylike, 0x1234);
+});
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js b/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js
new file mode 100644
index 0000000000..04c12c6423
--- /dev/null
+++ b/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js
@@ -0,0 +1,111 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "TypedArray-subarray-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "%TypedArray.prototype.subarray shouldn't misbehave horribly if " +
+ "index-argument conversion detaches the underlying ArrayBuffer";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testBegin()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var begin =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(begin);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBegin();
+
+function testBeginWithEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var begin =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(begin, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBeginWithEnd();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x1000;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testEnd();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/__proto__.js b/js/src/tests/non262/extensions/__proto__.js
new file mode 100644
index 0000000000..aa6d608766
--- /dev/null
+++ b/js/src/tests/non262/extensions/__proto__.js
@@ -0,0 +1,53 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = '__proto__.js';
+var BUGNUMBER = 770344;
+var summary = "__proto__ as accessor";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var protoDesc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
+assertEq(protoDesc !== null, true);
+assertEq(typeof protoDesc, "object");
+assertEq(protoDesc.hasOwnProperty("get"), true);
+assertEq(protoDesc.hasOwnProperty("set"), true);
+assertEq(protoDesc.hasOwnProperty("enumerable"), true);
+assertEq(protoDesc.hasOwnProperty("configurable"), true);
+assertEq(protoDesc.hasOwnProperty("value"), false);
+assertEq(protoDesc.hasOwnProperty("writable"), false);
+
+assertEq(protoDesc.configurable, true);
+assertEq(protoDesc.enumerable, false);
+assertEq(typeof protoDesc.get, "function", protoDesc.get + "");
+assertEq(typeof protoDesc.set, "function", protoDesc.set + "");
+
+assertEq(delete Object.prototype.__proto__, true);
+assertEq(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"),
+ undefined);
+
+var obj = {};
+obj.__proto__ = 5;
+assertEq(Object.getPrototypeOf(obj), Object.prototype);
+assertEq(obj.hasOwnProperty("__proto__"), true);
+
+var desc = Object.getOwnPropertyDescriptor(obj, "__proto__");
+assertEq(desc !== null, true);
+assertEq(typeof desc, "object");
+assertEq(desc.value, 5);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/arguments-property-access-in-function.js b/js/src/tests/non262/extensions/arguments-property-access-in-function.js
new file mode 100644
index 0000000000..f8c7e97f16
--- /dev/null
+++ b/js/src/tests/non262/extensions/arguments-property-access-in-function.js
@@ -0,0 +1,58 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 721322;
+var summary =
+ 'f.arguments must trigger an arguments object in non-strict mode functions';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj =
+ {
+ test: function()
+ {
+ var args = obj.test.arguments;
+ assertEq(args !== null, true);
+ assertEq(args[0], 5);
+ assertEq(args[1], undefined);
+ assertEq(args.length, 2);
+ }
+ };
+obj.test(5, undefined);
+
+var sobj =
+ {
+ test: function()
+ {
+ "use strict";
+
+ try
+ {
+ var args = sobj.test.arguments;
+ throw new Error("access to arguments property of strict mode " +
+ "function didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "should have thrown TypeError, instead got: " + e);
+ }
+ }
+ };
+sobj.test(5, undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-inherited-__proto__.js b/js/src/tests/non262/extensions/array-inherited-__proto__.js
new file mode 100644
index 0000000000..0409d47575
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-inherited-__proto__.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'array-inherited-__proto__.js';
+var BUGNUMBER = 769041;
+var summary =
+ "The [[Prototype]] of an object whose prototype chain contains an array " +
+ "isn't that array's [[Prototype]]";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [];
+assertEq(Array.isArray(arr), true);
+var objWithArrPrototype = Object.create(arr);
+assertEq(!Array.isArray(objWithArrPrototype), true);
+assertEq(objWithArrPrototype.__proto__, arr);
+var objWithArrGrandPrototype = Object.create(objWithArrPrototype);
+assertEq(!Array.isArray(objWithArrGrandPrototype), true);
+assertEq(objWithArrGrandPrototype.__proto__, objWithArrPrototype);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js b/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js
new file mode 100644
index 0000000000..ca2907a99a
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1282047;
+var summary = 'Infinite recursion via Array.isArray on a proxy';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var proxy = Proxy.revocable([], {}).proxy;
+
+// A depth of 100000 ought to be enough for any platform to consume its entire
+// stack, hopefully without making any recalcitrant platforms time out. If no
+// timeout happens, the assertEq checks for the proper expected value.
+for (var i = 0; i < 1e5; i++)
+ proxy = new Proxy(proxy, {});
+
+try
+{
+ assertEq(Array.isArray(proxy), true);
+
+ // If we reach here, it's cool, we just didn't consume the entire stack.
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-length-protochange.js b/js/src/tests/non262/extensions/array-length-protochange.js
new file mode 100644
index 0000000000..aeec8e9a22
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-length-protochange.js
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 548671;
+var summary =
+ "Don't use a shared-permanent inherited property to implement " +
+ "[].length or (function(){}).length";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var a = [1, 2, 3];
+a.__proto__ = null;
+reportCompare("length" in a, true, "length should be own property of array");
+reportCompare(Object.hasOwnProperty.call(a, "length"), true,
+ "length should be own property of array");
+reportCompare(a.length, 3, "array length should be 3");
+
+var a = [], b = [];
+b.__proto__ = a;
+reportCompare(b.hasOwnProperty("length"), true,
+ "length should be own property of array");
+b.length = 42;
+reportCompare(b.length, 42, "should have mutated b's (own) length");
+reportCompare(a.length, 0, "should not have mutated a's (own) length");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/array-pop-proxy.js b/js/src/tests/non262/extensions/array-pop-proxy.js
new file mode 100644
index 0000000000..15c230977a
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-pop-proxy.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'array-pop-proxy.js';
+var BUGNUMBER = 858381;
+var summary = "Behavior of [].pop on proxies";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var p = new Proxy([0, 1, 2], {});
+Array.prototype.pop.call(p);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-toString-recursion.js b/js/src/tests/non262/extensions/array-toString-recursion.js
new file mode 100644
index 0000000000..aa5d856c3b
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-toString-recursion.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 635389;
+var summary = 'Infinite recursion via [].{toString,toLocaleString,join}';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var x = [];
+ x.join = Array.prototype.toString;
+ "" + x;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+try
+{
+ var x = { toString: Array.prototype.toString, join: Array.prototype.toString };
+ "" + x;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/arraybuffer-prototype.js b/js/src/tests/non262/extensions/arraybuffer-prototype.js
new file mode 100644
index 0000000000..c61b317762
--- /dev/null
+++ b/js/src/tests/non262/extensions/arraybuffer-prototype.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 665961;
+var summary =
+ "ArrayBuffer cannot access properties defined on the prototype chain.";
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+ArrayBuffer.prototype.prop = "on prototype";
+var b = new ArrayBuffer([]);
+assertEq(b.prop, "on prototype");
+
+var c = new ArrayBuffer([]);
+assertEq(c.prop, "on prototype");
+c.prop = "direct";
+assertEq(c.prop, "direct");
+
+assertEq(ArrayBuffer.prototype.prop, "on prototype");
+assertEq(new ArrayBuffer([]).prop, "on prototype");
+
+assertEq(c.nonexistent, undefined);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/bad-regexp-data-clone.js b/js/src/tests/non262/extensions/bad-regexp-data-clone.js
new file mode 100644
index 0000000000..70ed427a6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/bad-regexp-data-clone.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+let data = new Uint8Array([
+ 104,97,108,101,6,0,255,255,95,98,
+ 0,0,0,0,0,104,97,108,101,9,0,255,
+ 255,95,98,115,0,0,0,0,0,0,65,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0
+]);
+let cloneBuffer = serialize(null);
+cloneBuffer.clonebuffer = data.buffer;
+
+// One of the bytes above encodes a JS::RegExpFlags, but that byte contains bits
+// outside of JS::RegExpFlag::AllFlags and so will trigger an error.
+assertThrowsInstanceOf(() => deserialize(cloneBuffer), InternalError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/basic-for-each.js b/js/src/tests/non262/extensions/basic-for-each.js
new file mode 100644
index 0000000000..851faf4193
--- /dev/null
+++ b/js/src/tests/non262/extensions/basic-for-each.js
@@ -0,0 +1,58 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "346582";
+var summary = "Basic support for iterable objects and for-each";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+var iterable = { persistedProp: 17 };
+
+function Array_equals(a, b)
+{
+ if (!(a instanceof Array) || !(b instanceof Array))
+ throw new Error("Arguments not both of type Array");
+ if (a.length != b.length)
+ return false;
+ for (var i = 0, sz = a.length; i < sz; i++)
+ if (a[i] !== b[i])
+ return false;
+ return true;
+}
+
+try
+{
+ // nothing unusual so far -- verify basic properties
+ for (var i in iterable)
+ {
+ if (i != "persistedProp")
+ throw "no persistedProp!";
+ if (iterable[i] != 17)
+ throw "iterable[\"persistedProp\"] == 17";
+ }
+
+ if (iterable.persistedProp != 17)
+ throw "iterable.persistedProp not persisted!";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/basic-for-in.js b/js/src/tests/non262/extensions/basic-for-in.js
new file mode 100644
index 0000000000..f1476c65c5
--- /dev/null
+++ b/js/src/tests/non262/extensions/basic-for-in.js
@@ -0,0 +1,46 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "346582";
+var summary = "Basic support for iterable objects and for-in";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+var iterable = { persistedProp: 17 };
+
+try
+{
+ // nothing unusual so far -- verify basic properties
+ for (var i in iterable)
+ {
+ if (i != "persistedProp")
+ throw "no persistedProp!";
+ if (iterable[i] != 17)
+ throw "iterable[\"persistedProp\"] == 17";
+ }
+
+ if (iterable.persistedProp != 17)
+ throw "iterable.persistedProp not persisted!";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/browser.js b/js/src/tests/non262/extensions/browser.js
new file mode 100644
index 0000000000..6cd01ab6f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/browser.js
@@ -0,0 +1,6 @@
+// The page loaded in the browser is jsreftest.html, which is located in
+// js/src/tests. That makes Worker script URLs resolve relative to the wrong
+// directory. workerDir is the workaround.
+workerDir = (document.location.href.replace(/\/[^/?]*(\?.*)?$/, '/') +
+ 'non262/extensions/');
+
diff --git a/js/src/tests/non262/extensions/bug472534.js b/js/src/tests/non262/extensions/bug472534.js
new file mode 100644
index 0000000000..0c7d5f3ecb
--- /dev/null
+++ b/js/src/tests/non262/extensions/bug472534.js
@@ -0,0 +1,30 @@
+function monthNames () {
+ return [
+ /jan(uar(y)?)?/, 0,
+ /feb(ruar(y)?)?/, 1,
+ /m\u00e4r|mar|m\u00e4rz|maerz|march/, 2,
+ /apr(il)?/, 3,
+ /ma(i|y)/, 4,
+ /jun(i|o|e)?/, 5,
+ /jul(i|y)?/, 6,
+ /aug(ust)?/, 7,
+ /sep((t)?(ember))?/, 8,
+ /o(c|k)t(ober)?/, 9,
+ /nov(ember)?/, 10,
+ /de(c|z)(ember)?/, 11
+ ];
+};
+
+var actual = '';
+var expected = '(jan(uar(y)?)?)|(feb(ruar(y)?)?)|(m\\u00e4r|mar|m\\u00e4rz|maerz|march)|(apr(il)?)|(ma(i|y))|(jun(i|o|e)?)|(jul(i|y)?)|(aug(ust)?)|(sep((t)?(ember))?)|(o(c|k)t(ober)?)|(nov(ember)?)|(de(c|z)(ember)?)';
+var mn = monthNames();
+for (var i = 0; i < mn.length; ++i) {
+ if (actual)
+ actual += '|';
+ actual += '(' + mn[i++].source + ')';
+}
+
+assertEq(actual, expected);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/builtin-function-arguments-caller.js b/js/src/tests/non262/extensions/builtin-function-arguments-caller.js
new file mode 100644
index 0000000000..2acf5f452f
--- /dev/null
+++ b/js/src/tests/non262/extensions/builtin-function-arguments-caller.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'builtin-function-arguments-caller.js';
+var BUGNUMBER = 929642;
+var summary =
+ "Built-in functions defined in ECMAScript pick up arguments/caller " +
+ "properties from Function.prototype";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectNoProperty(obj, prop)
+{
+ var desc = Object.getOwnPropertyDescriptor(obj, prop);
+ assertEq(desc, undefined,
+ "should be no '" + prop + "' property on " + obj);
+}
+
+// Test a builtin that's native.
+expectNoProperty(Object, "arguments");
+expectNoProperty(Object, "caller");
+
+// Also test a builtin that's self-hosted.
+expectNoProperty(Array.prototype.indexOf, "arguments");
+expectNoProperty(Array.prototype.indexOf, "caller");
+
+// Test the Function construct for good measure, because it's so intricately
+// invovled in bootstrapping.
+expectNoProperty(Function, "arguments");
+expectNoProperty(Function, "caller");
+
+var argsDesc = Object.getOwnPropertyDescriptor(Function.prototype, "arguments");
+var callerDesc = Object.getOwnPropertyDescriptor(Function.prototype, "caller");
+
+var argsGet = argsDesc.get, argsSet = argsDesc.set;
+
+expectNoProperty(argsGet, "arguments");
+expectNoProperty(argsGet, "caller");
+expectNoProperty(argsSet, "arguments");
+expectNoProperty(argsSet, "caller");
+
+var callerGet = callerDesc.get, callerSet = callerDesc.set;
+
+expectNoProperty(callerGet, "arguments");
+expectNoProperty(callerGet, "caller");
+expectNoProperty(callerSet, "arguments");
+expectNoProperty(callerSet, "caller");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/censor-strict-caller.js b/js/src/tests/non262/extensions/censor-strict-caller.js
new file mode 100644
index 0000000000..b23469953d
--- /dev/null
+++ b/js/src/tests/non262/extensions/censor-strict-caller.js
@@ -0,0 +1,15 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+
+function nonstrict() { return nonstrict.caller; }
+function strict() { "use strict"; return nonstrict(); }
+
+assertEq(strict(), null);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/clone-bigint.js b/js/src/tests/non262/extensions/clone-bigint.js
new file mode 100644
index 0000000000..a40bbed8f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-bigint.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testBigInt(b) {
+ var a = deserialize(serialize(b));
+ assertEq(typeof b, "bigint");
+ assertEq(typeof a, "bigint");
+ assertEq(a, b);
+}
+
+testBigInt(0n);
+testBigInt(-1n);
+testBigInt(1n);
+
+testBigInt(0xffffFFFFffffFFFFffffFFFFffffFFFFn);
+testBigInt(-0xffffFFFFffffFFFFffffFFFFffffFFFFn);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-complex-object.js b/js/src/tests/non262/extensions/clone-complex-object.js
new file mode 100644
index 0000000000..869a7d805f
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-complex-object.js
@@ -0,0 +1,313 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Set of properties on a cloned object that are legitimately non-enumerable,
+// grouped by object type.
+var non_enumerable = { 'Array': [ 'length' ],
+ 'String': [ 'length' ] };
+
+// Set of properties on a cloned object that are legitimately non-configurable,
+// grouped by object type. The property name '0' stands in for any indexed
+// property.
+var non_configurable = { 'String': [ 0 ],
+ '(typed array)': [ 0 ] };
+
+// Set of properties on a cloned object that are legitimately non-writable,
+// grouped by object type. The property name '0' stands in for any indexed
+// property.
+var non_writable = { 'String': [ 0 ] };
+
+function classOf(obj) {
+ var classString = Object.prototype.toString.call(obj);
+ var [ all, classname ] = classString.match(/\[object (\w+)/);
+ return classname;
+}
+
+function isIndex(p) {
+ var u = p >>> 0;
+ return ("" + u == p && u != 0xffffffff);
+}
+
+function notIndex(p) {
+ return !isIndex(p);
+}
+
+function tableContains(table, cls, prop) {
+ if (isIndex(prop))
+ prop = 0;
+ if (cls.match(/\wArray$/))
+ cls = "(typed array)";
+ var exceptionalProps = table[cls] || [];
+ return exceptionalProps.indexOf(prop) != -1;
+}
+
+function shouldBeConfigurable(cls, prop) {
+ return !tableContains(non_configurable, cls, prop);
+}
+
+function shouldBeWritable(cls, prop) {
+ return !tableContains(non_writable, cls, prop);
+}
+
+function ownProperties(obj) {
+ return Object.getOwnPropertyNames(obj).
+ map(function (p) { return [p, Object.getOwnPropertyDescriptor(obj, p)]; });
+}
+
+function isCloneable(pair) {
+ return typeof pair[0] === 'string' && pair[1].enumerable;
+}
+
+function compareProperties(a, b, stack, path) {
+ var ca = classOf(a);
+
+ // 'b', the original object, may have non-enumerable or XMLName properties;
+ // ignore them. 'a', the clone, should not have any non-enumerable
+ // properties (except .length, if it's an Array or String) or XMLName
+ // properties.
+ var pb = ownProperties(b).filter(isCloneable);
+ var pa = ownProperties(a);
+ for (var i = 0; i < pa.length; i++) {
+ var propname = pa[i][0];
+ assertEq(typeof propname, "string", "clone should not have E4X properties " + path);
+ if (!pa[i][1].enumerable) {
+ if (tableContains(non_enumerable, ca, propname)) {
+ // remove it so that the comparisons below will work
+ pa.splice(i, 1);
+ i--;
+ } else {
+ throw new Error("non-enumerable clone property " + propname + " " + path);
+ }
+ }
+ }
+
+ // Check that, apart from properties whose names are array indexes,
+ // the enumerable properties appear in the same order.
+ var aNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex);
+ var bNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex);
+ assertEq(aNames.join(","), bNames.join(","), path);
+
+ // Check that the lists are the same when including array indexes.
+ function byName(a, b) { a = a[0]; b = b[0]; return a < b ? -1 : a === b ? 0 : 1; }
+ pa.sort(byName);
+ pb.sort(byName);
+ assertEq(pa.length, pb.length, "should see the same number of properties " + path);
+ for (var i = 0; i < pa.length; i++) {
+ var aName = pa[i][0];
+ var bName = pb[i][0];
+ assertEq(aName, bName, path);
+
+ var path2 = isIndex(aName) ? path + "[" + aName + "]" : path + "." + aName;
+ var da = pa[i][1];
+ var db = pb[i][1];
+ assertEq(da.configurable, shouldBeConfigurable(ca, aName), path2);
+ assertEq(da.writable, shouldBeWritable(ca, aName), path2);
+ assertEq("value" in da, true, path2);
+ var va = da.value;
+ var vb = b[pb[i][0]];
+ stack.push([va, vb, path2]);
+ }
+}
+
+function isClone(a, b) {
+ var stack = [[a, b, 'obj']];
+ var memory = new WeakMap();
+ var rmemory = new WeakMap();
+
+ while (stack.length > 0) {
+ var pair = stack.pop();
+ var x = pair[0], y = pair[1], path = pair[2];
+ if (typeof x !== "object" || x === null) {
+ // x is primitive.
+ assertEq(x, y, "equal primitives");
+ } else if (x instanceof Date) {
+ assertEq(x.getTime(), y.getTime(), "equal times for cloned Dates");
+ } else if (memory.has(x)) {
+ // x is an object we have seen before in a.
+ assertEq(y, memory.get(x), "repeated object the same");
+ assertEq(rmemory.get(y), x, "repeated object's clone already seen");
+ } else {
+ // x is an object we have not seen before.
+ // Check that we have not seen y before either.
+ assertEq(rmemory.has(y), false);
+
+ var xcls = classOf(x);
+ var ycls = classOf(y);
+ assertEq(xcls, ycls, "same [[Class]]");
+
+ // clone objects should have the default prototype of the class
+ assertEq(Object.getPrototypeOf(x), this[xcls].prototype);
+
+ compareProperties(x, y, stack, path);
+
+ // Record that we have seen this pair of objects.
+ memory.set(x, y);
+ rmemory.set(y, x);
+ }
+ }
+ return true;
+}
+
+function check(val) {
+ var clone = deserialize(serialize(val));
+ assertEq(isClone(val, clone), true);
+ return clone;
+}
+
+// Various recursive objects
+
+// Recursive array.
+var a = [];
+a[0] = a;
+check(a);
+
+// Recursive Object.
+var b = {};
+b.next = b;
+check(b);
+
+// Mutually recursive objects.
+var a = [];
+var b = {};
+var c = {};
+a[0] = b;
+a[1] = b;
+a[2] = b;
+b.next = a;
+check(a);
+check(b);
+
+// A date
+check(new Date);
+
+// A recursive object that is very large.
+a = [];
+b = a;
+for (var i = 0; i < 10000; i++) {
+ b[0] = {};
+ b[1] = [];
+ b = b[1];
+}
+b[0] = {owner: a};
+b[1] = [];
+check(a);
+
+// Date objects should not be identical even if representing the same date
+var ar = [ new Date(1000), new Date(1000) ];
+var clone = check(ar);
+assertEq(clone[0] === clone[1], false);
+
+// Identity preservation for various types of objects
+
+function checkSimpleIdentity(v)
+{
+ a = check([ v, v ]);
+ assertEq(a[0] === a[1], true);
+ return a;
+}
+
+var v = new Boolean(true);
+checkSimpleIdentity(v);
+
+v = new Number(17);
+checkSimpleIdentity(v);
+
+v = new String("yo");
+checkSimpleIdentity(v);
+
+v = "fish";
+checkSimpleIdentity(v);
+
+v = new Int8Array([ 10, 20 ]);
+checkSimpleIdentity(v);
+
+v = new ArrayBuffer(7);
+checkSimpleIdentity(v);
+
+v = new Date(1000);
+b = [ v, v, { 'date': v } ];
+clone = check(b);
+assertEq(clone[0] === clone[1], true);
+assertEq(clone[0], clone[2]['date']);
+assertEq(clone[0] === v, false);
+
+// Reduced and modified from postMessage_structured_clone test
+let foo = { };
+let baz = { };
+let obj = { 'foo': foo,
+ 'bar': { 'foo': foo },
+ 'expando': { 'expando': baz },
+ 'baz': baz };
+check(obj);
+
+for (obj of getTestContent())
+ check(obj);
+
+// Stolen wholesale from postMessage_structured_clone_helper.js
+function* getTestContent()
+{
+ yield "hello";
+ yield 2+3;
+ yield 12;
+ yield null;
+ yield "complex" + "string";
+ yield new Object();
+ yield new Date(1306113544);
+ yield [1, 2, 3, 4, 5];
+ let obj = new Object();
+ obj.foo = 3;
+ obj.bar = "hi";
+ obj.baz = new Date(1306113544);
+ obj.boo = obj;
+ yield obj;
+
+ let recursiveobj = new Object();
+ recursiveobj.a = recursiveobj;
+ recursiveobj.foo = new Object();
+ recursiveobj.foo.bar = "bar";
+ recursiveobj.foo.backref = recursiveobj;
+ recursiveobj.foo.baz = 84;
+ recursiveobj.foo.backref2 = recursiveobj;
+ recursiveobj.bar = new Object();
+ recursiveobj.bar.foo = "foo";
+ recursiveobj.bar.backref = recursiveobj;
+ recursiveobj.bar.baz = new Date(1306113544);
+ recursiveobj.bar.backref2 = recursiveobj;
+ recursiveobj.expando = recursiveobj;
+ yield recursiveobj;
+
+ obj = new Object();
+ obj.expando1 = 1;
+ obj.foo = new Object();
+ obj.foo.bar = 2;
+ obj.bar = new Object();
+ obj.bar.foo = obj.foo;
+ obj.expando = new Object();
+ obj.expando.expando = new Object();
+ obj.expando.expando.obj = obj;
+ obj.expando2 = 4;
+ obj.baz = obj.expando.expando;
+ obj.blah = obj.bar;
+ obj.foo.baz = obj.blah;
+ obj.foo.blah = obj.blah;
+ yield obj;
+
+ let diamond = new Object();
+ obj = new Object();
+ obj.foo = "foo";
+ obj.bar = 92;
+ obj.backref = diamond;
+ diamond.ref1 = obj;
+ diamond.ref2 = obj;
+ yield diamond;
+
+ let doubleref = new Object();
+ obj = new Object();
+ doubleref.ref1 = obj;
+ doubleref.ref2 = obj;
+ yield doubleref;
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-errors.js b/js/src/tests/non262/extensions/clone-errors.js
new file mode 100644
index 0000000000..38e0e78a6f
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-errors.js
@@ -0,0 +1,110 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function check(v) {
+ try {
+ serialize(v);
+ } catch (exc) {
+ return;
+ }
+ throw new Error("serializing " + JSON.stringify(v) + " should have failed with an exception");
+}
+
+// Unsupported object types.
+check(this);
+check(Math);
+check(function () {});
+check(new Proxy({}, {}));
+
+// A failing getter.
+check({get x() { throw new Error("fail"); }});
+
+// Mismatched scopes.
+for (let [write_scope, read_scope] of [['SameProcess', 'DifferentProcessForIndexedDB'],
+ ['SameProcess', 'DifferentProcess']])
+{
+ var ab = new ArrayBuffer(12);
+ var buffer = serialize(ab, [ab], { scope: write_scope });
+ var caught = false;
+ try {
+ deserialize(buffer, { scope: read_scope });
+ } catch (exc) {
+ caught = true;
+ }
+ assertEq(caught, true, `${write_scope} clone buffer should not be deserializable as ${read_scope}`);
+}
+
+// Extra data. This is not checked in #define FUZZING builds.
+const fuzzing = getBuildConfiguration()['fuzzing-defined'];
+const shouldThrow = fuzzing === false;
+
+var clone = serialize({foo: 7}, undefined, {scope: 'DifferentProcess'});
+deserialize(clone);
+clone.clonebuffer = clone.clonebuffer + "\0\0\0\0\0\0\0\0";
+var exc = {message: 'no error'};
+try {
+ deserialize(clone);
+} catch (e) {
+ exc = e;
+}
+if (shouldThrow) {
+ assertEq(exc.message.includes("bad serialized structured data"), true);
+ assertEq(exc.message.includes("extra data"), true);
+}
+
+// Extra data between the main body and "tail" of the clone data.
+function dumpData(data) {
+ data.forEach((x, i) => print(`[${i}] 0x${(i*8).toString(16)} : 0x${x.toString(16)}`));
+}
+
+function testInnerExtraData() {
+ const ab = new ArrayBuffer(8);
+ (new BigUint64Array(ab))[0] = 0xdeadbeefn;
+ const clone = serialize({ABC: 7, CBA: ab}, [ab], {scope: 'DifferentProcess'});
+
+ const data = [...new BigUint64Array(clone.arraybuffer)];
+ dumpData(data);
+
+ const fake = new ArrayBuffer(clone.arraybuffer.byteLength + 24);
+ const view = new BigUint64Array(fake);
+ view.set(new BigUint64Array(clone.arraybuffer), 0);
+ view[1] = view[1] & ~1n; // SCTAG_TRANSFER_MAP_HEADER with SCTAG_TM_UNREAD
+ view[5] += 24n; // Make space for another ArrayBuffer clone at the end
+ view[9] = 0xffff00030000000dn; // Change the constant 7 to 13
+ view[16] = 0xfeeddeadbeef2dadn; // Change stored ArrayBuffer contents
+ view[17] = view[14]; // SCTAG_ARRAY_BUFFER_OBJECT_V2
+ view[18] = view[15]; // 8 bytes long
+ view[19] = 0x1cedc0ffeen; // Content
+
+ dumpData(view);
+ clone.arraybuffer = fake;
+
+ let d;
+ let exc;
+ try {
+ d = deserialize(clone);
+ print(JSON.stringify(d));
+ print(new BigUint64Array(d.CBA)[0].toString(16));
+ } catch (e) {
+ exc = e;
+ }
+
+ const fuzzing = getBuildConfiguration()['fuzzing-defined'];
+ const shouldThrow = fuzzing === false;
+
+ if (shouldThrow) {
+ assertEq(Boolean(exc), true);
+ assertEq(exc.message.includes("extra data"), true);
+ print(`PASS with FUZZING: Found expected exception "${exc.message}"`);
+ } else {
+ assertEq(new BigUint64Array(d.CBA)[0].toString(16), "1cedc0ffee");
+ assertEq(d.ABC, 13);
+ print("PASS without FUZZING");
+ }
+}
+
+testInnerExtraData();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/clone-forge.js b/js/src/tests/non262/extensions/clone-forge.js
new file mode 100644
index 0000000000..3cdb0ea0df
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-forge.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function assertThrows(f) {
+ var ok = false;
+ try {
+ f();
+ } catch (exc) {
+ ok = true;
+ }
+ if (!ok)
+ throw new TypeError("Assertion failed: " + f + " did not throw as expected");
+}
+
+function byteArray(str) {
+ return str.split('').map(c => c.charCodeAt(0));
+}
+
+// Don't allow forging bogus Date objects.
+var mutated = byteArray(serialize(new Date(NaN)).clonebuffer);
+
+var a = [1/0, -1/0,
+ Number.MIN_VALUE, -Number.MIN_VALUE,
+ Math.PI, 1286523948674.5,
+ Number.MAX_VALUE, -Number.MAX_VALUE,
+ 8.64e15 + 1, -(8.64e15 + 1)];
+for (var i = 0; i < a.length; i++) {
+ var n = a[i];
+ var nbuf = serialize(n);
+ var data = byteArray(nbuf.clonebuffer);
+ for (var j = 0; j < 8; j++)
+ mutated[j+8] = data[j];
+ nbuf.clonebuffer = String.fromCharCode.apply(null, mutated);
+ assertThrows(function () { deserialize(nbuf); });
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-invalid-property-key.js b/js/src/tests/non262/extensions/clone-invalid-property-key.js
new file mode 100644
index 0000000000..9b0347586c
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-invalid-property-key.js
@@ -0,0 +1,22 @@
+// Don't allow serialized data to use objects as property keys.
+
+if (typeof serialize === "function") {
+ let data = new Uint8Array([
+ 104,97,108,101,7,0,255,255,95,98,0,0,0,0,0,104,97,108,101,9,0,255,255,95,98,
+ 115,10,109,97,120,95,108,101,110,0,0,0,0,109,97,120,95,108,101,110,0,0,0,0,0,
+ 0,0,0,0,246,0,0,0,42,4,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,0,0,
+ 191,190,190,184,65,65,65,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,97,108,101,9,0,
+ 255,255,95,98,115,10,109,97,120,95,110,100,108,213,95,175,175,175,175,175,0,
+ 0,0,0,0,2,0,0,0,0,0,13,0,255,255,96,125,115,135,109,97,120,110,0,0,32,0,8,0,
+ 0,0
+ ]);
+ let cloneBuffer = serialize(null);
+ cloneBuffer.clonebuffer = data.buffer;
+ try {
+ let obj = deserialize(cloneBuffer);
+ } catch(exc1) {}
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-leaf-object.js b/js/src/tests/non262/extensions/clone-leaf-object.js
new file mode 100644
index 0000000000..081a9b666e
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-leaf-object.js
@@ -0,0 +1,68 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var a = [new Boolean(true),
+ new Boolean(false),
+ new Number(0),
+ new Number(-0),
+ new Number(Math.PI),
+ new Number(0x7fffffff),
+ new Number(-0x7fffffff),
+ new Number(0x80000000),
+ new Number(-0x80000000),
+ new Number(0xffffffff),
+ new Number(-0xffffffff),
+ new Number(0x100000000),
+ new Number(-0x100000000),
+ new Number(Number.MIN_VALUE),
+ new Number(-Number.MIN_VALUE),
+ new Number(Number.MAX_VALUE),
+ new Number(-Number.MAX_VALUE),
+ new Number(1/0),
+ new Number(-1/0),
+ new Number(0/0),
+ new String(""),
+ new String("\0123\u4567"),
+ new Date(0),
+ new Date(-0),
+ new Date(0x7fffffff),
+ new Date(-0x7fffffff),
+ new Date(0x80000000),
+ new Date(-0x80000000),
+ new Date(0xffffffff),
+ new Date(-0xffffffff),
+ new Date(0x100000000),
+ new Date(-0x100000000),
+ new Date(1286523948674),
+ new Date(8.64e15), // hard-coded in ES5 spec, hard-coded here
+ new Date(-8.64e15),
+ new Date(NaN)];
+
+function primitive(a) {
+ return a instanceof Date ? +a : a.constructor(a);
+}
+
+for (var i = 0; i < a.length; i++) {
+ var x = a[i];
+ if (x.toSource) {
+ var expectedSource = x.toSource();
+ }
+ var expectedPrimitive = primitive(x);
+ var expectedProto = x.__proto__;
+ var expectedString = Object.prototype.toString.call(x);
+ x.expando = 1;
+ x.__proto__ = {};
+
+ var y = deserialize(serialize(x));
+ if (x.toSource) {
+ assertEq(y.toSource(), expectedSource);
+ }
+ assertEq(primitive(y), expectedPrimitive);
+ assertEq(y.__proto__, expectedProto);
+ assertEq(Object.prototype.toString.call(y), expectedString);
+ assertEq("expando" in y, false);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-many-transferables.js b/js/src/tests/non262/extensions/clone-many-transferables.js
new file mode 100644
index 0000000000..463dc74ee7
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-many-transferables.js
@@ -0,0 +1,25 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- requires serialize()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test()
+{
+ // On my system, with an unfixed build where transfer-list processing is
+ // quadratic, 5e5 elements makes this test take ~70s in a shell opt build.
+ // Debug build is well into timeout-land at 300+s. As long as at least *one*
+ // platform times out for a quadratic algorithm, a regression should be
+ // obvious. (Time to run the test in even a debug shell is ~17s, well short
+ // of timing out.)
+ var transfers = [];
+ for (var i = 0; i < 5e5; i++)
+ transfers.push(new ArrayBuffer());
+
+ // If serialization is quadratic in the length of |transfers|, the test will
+ // time out. If the test doesn't time out, it passed.
+ serialize({}, transfers);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-object-deep.js b/js/src/tests/non262/extensions/clone-object-deep.js
new file mode 100644
index 0000000000..685577b924
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-object-deep.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test() {
+ var check = clone_object_check;
+
+ // Invoke with the simple parameter to compile the function before doing
+ // deep clone, on --ion-eager case, to avoid timeout.
+ check({x: null, y: undefined});
+
+ // Try cloning a deep object. Don't fail with "too much recursion".
+ var b = {};
+ var current = b;
+ for (var i = 0; i < 10000; i++) {
+ var next = {};
+ current['x' + i] = next;
+ current = next;
+ }
+ check(b, "deepObject"); // takes 2 seconds :-\
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-object.js b/js/src/tests/non262/extensions/clone-object.js
new file mode 100644
index 0000000000..56a2166bec
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-object.js
@@ -0,0 +1,143 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test() {
+ var check = clone_object_check;
+
+ check({});
+ check([]);
+ check({x: 0});
+ check({x: 0.7, p: "forty-two", y: null, z: undefined});
+ check(Array.prototype);
+ check(Object.prototype);
+
+ // before and after
+ var b, a;
+
+ // Slow array.
+ b = [, 1, 2, 3];
+ b.expando = true;
+ b[5] = 5;
+ b[0] = 0;
+ b[4] = 4;
+ delete b[2];
+ check(b);
+
+ // Check cloning properties other than basic data properties. (check()
+ // asserts that the properties of the clone are configurable, writable,
+ // enumerable data properties.)
+ b = {};
+ Object.defineProperties(b, {
+ x: {enumerable: true, get: function () { return 12479; }},
+ y: {enumerable: true, configurable: true, writable: false, value: 0},
+ z: {enumerable: true, configurable: false, writable: true, value: 0},
+ hidden: {enumerable:false, value: 1334}});
+ check(b);
+
+ // Check corner cases involving property names.
+ b = {"-1": -1,
+ 0xffffffff: null,
+ 0x100000000: null,
+ "": 0,
+ "\xff\x7f\u7fff\uffff\ufeff\ufffe": 1, // random unicode id
+ "\ud800 \udbff \udc00 \udfff": 2}; // busted surrogate pairs
+ check(b);
+
+ b = [];
+ b[-1] = -1;
+ b[0xffffffff] = null;
+ b[0x100000000] = null;
+ b[""] = 0;
+ b["\xff\x7f\u7fff\uffff\ufeff\ufffe"] = 1;
+ b["\ud800 \udbff \udc00 \udfff"] = 2;
+ check(b);
+
+ // Check that array's .length property is cloned.
+ b = Array(5);
+ assertEq(b.length, 5);
+ a = check(b);
+ assertEq(a.length, 5);
+
+ b = Array(0);
+ b[1] = "ok";
+ a = check(b);
+ assertEq(a.length, 2);
+
+ // Check that prototypes are not cloned, per spec.
+ b = Object.create({x:1});
+ b.y = 2;
+ b.z = 3;
+ check(b);
+
+ // Check that cloning does not separate merge points in the tree.
+ var same = {};
+ b = {one: same, two: same};
+ a = check(b);
+ assertEq(a.one === a.two, true);
+
+ b = [same, same];
+ a = check(b);
+ assertEq(a[0] === a[1], true);
+
+ /*
+ XXX TODO spin this out into its own test
+ // This fails quickly with an OOM error. An exception would be nicer.
+ function Infinitree() {
+ return { get left() { return new Infinitree; },
+ get right() { return new Infinitree; }};
+ }
+ var threw = false;
+ try {
+ serialize(new Infinitree);
+ } catch (exc) {
+ threw = true;
+ }
+ assertEq(threw, true);
+ */
+
+ // Clone an array with holes.
+ check([0, 1, 2, , 4, 5, 6]);
+
+ // Array holes should not take up space.
+ b = [];
+ b[255] = 1;
+ check(b);
+ assertEq(serialize(b).clonebuffer.length < 255, true);
+
+ // Check that trailing holes in an array are preserved.
+ b = [1,2,3,,];
+ assertEq(b.length, 4);
+ a = check(b);
+ assertEq(a.length, 4);
+ assertEq(a.toString(), "1,2,3,");
+
+ b = [1,2,3,,,];
+ assertEq(b.length, 5);
+ a = check(b);
+ assertEq(a.length, 5);
+ assertEq(a.toString(), "1,2,3,,");
+
+ // Self-modifying object.
+ // This should never read through to b's prototype.
+ b = Object.create({y: 2},
+ {x: {enumerable: true,
+ configurable: true,
+ get: function() { if (this.hasOwnProperty("y")) delete this.y; return 1; }},
+ y: {enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 3}});
+ check(b, "selfModifyingObject");
+
+ // Ignore properties with object-ids.
+ var uri = "http://example.net";
+ b = {x: 1, y: 2};
+ Object.defineProperty(b, Array(uri, "x"), {enumerable: true, value: 3});
+ Object.defineProperty(b, Array(uri, "y"), {enumerable: true, value: 5});
+ check(b);
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-regexp.js b/js/src/tests/non262/extensions/clone-regexp.js
new file mode 100644
index 0000000000..8541dae98c
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-regexp.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testRegExp(b, c=b) {
+ var a = deserialize(serialize(b));
+ assertEq(a === b, false);
+ assertEq(Object.getPrototypeOf(a), RegExp.prototype);
+ assertEq(Object.prototype.toString.call(a), "[object RegExp]");
+ for (p in a)
+ throw new Error("cloned RegExp should have no enumerable properties");
+
+ assertEq(a.source, c.source);
+ assertEq(a.global, c.global);
+ assertEq(a.ignoreCase, c.ignoreCase);
+ assertEq(a.multiline, c.multiline);
+ assertEq(a.sticky, c.sticky);
+ assertEq("expando" in a, false);
+}
+
+testRegExp(RegExp(""));
+testRegExp(/(?:)/);
+testRegExp(/^(.*)$/gimy);
+
+var re = /\bx\b/gi;
+re.expando = true;
+testRegExp(re);
+// `source` and the flag accessors are defined on RegExp.prototype, so they're
+// not available after re.__proto__ has been changed. We solve that by passing
+// in an additional copy of the same RegExp to compare the
+// serialized-then-deserialized clone with."
+re.__proto__ = {};
+testRegExp(re, /\bx\b/gi);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-sab-failure.js b/js/src/tests/non262/extensions/clone-sab-failure.js
new file mode 100644
index 0000000000..ff24dcb9e5
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-sab-failure.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Failure to serialize an object containing a SAB should not leave the SAB's
+// rawbuffer's reference count incremented.
+
+if (!this.SharedArrayBuffer || !this.sharedArrayRawBufferRefcount) {
+ reportCompare(true,true);
+ quit(0);
+}
+
+let x = new SharedArrayBuffer(1);
+
+// Initially the reference count is 1.
+assertEq(sharedArrayRawBufferRefcount(x), 1);
+
+let y = serialize(x, [], {SharedArrayBuffer: 'allow'});
+
+// Serializing it successfully increments the reference count.
+assertEq(sharedArrayRawBufferRefcount(x), 2);
+
+// Serializing something containing a function should throw.
+var failed = false;
+try {
+ serialize([x, function () {}]);
+}
+catch (e) {
+ failed = true;
+}
+assertEq(failed, true);
+
+// Serializing the SAB unsuccessfully does not increment the reference count.
+assertEq(sharedArrayRawBufferRefcount(x), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/clone-sab.js b/js/src/tests/non262/extensions/clone-sab.js
new file mode 100644
index 0000000000..3b35f90abc
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-sab.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Deserialize a serialization buffer containing a reference to a
+// SharedArrayBuffer buffer object enough times and we will crash because of a
+// reference counting bug.
+
+if (!this.SharedArrayBuffer) {
+ reportCompare(true,true);
+ quit(0);
+}
+
+let x = new SharedArrayBuffer(1);
+let y = serialize(x, [], {SharedArrayBuffer: 'allow'});
+x = null;
+
+// If the bug is present this loop usually crashes quickly during
+// deserialization because the memory has become unmapped.
+
+for (let i=0 ; i < 50 ; i++ ) {
+ let obj = deserialize(y, {SharedArrayBuffer: 'allow'});
+ let z = new Int8Array(obj);
+ z[0] = 0;
+}
+
+reportCompare(true, true);
+
diff --git a/js/src/tests/non262/extensions/clone-simple.js b/js/src/tests/non262/extensions/clone-simple.js
new file mode 100644
index 0000000000..b7684dd02a
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-simple.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testEq(b) {
+ var a = deserialize(serialize(b));
+ assertEq(a, b);
+}
+
+testEq(void 0);
+testEq(null);
+
+testEq(true);
+testEq(false);
+
+testEq(0);
+testEq(-0);
+testEq(1/0);
+testEq(-1/0);
+testEq(0/0);
+testEq(Math.PI);
+
+testEq("");
+testEq("\0");
+testEq("a"); // unit string
+testEq("ab"); // length-2 string
+testEq("abc\0123\r\n"); // nested null character
+testEq("\xff\x7f\u7fff\uffff\ufeff\ufffe"); // random unicode stuff
+testEq("\ud800 \udbff \udc00 \udfff"); // busted surrogate pairs
+testEq(Array(1024).join(Array(1024).join("x"))); // 2MB string
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-transferables.js b/js/src/tests/non262/extensions/clone-transferables.js
new file mode 100644
index 0000000000..6b3ff99079
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-transferables.js
@@ -0,0 +1,129 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function* buffer_options() {
+ for (var scope of ["SameProcess",
+ "DifferentProcess",
+ "DifferentProcessForIndexedDB"])
+ {
+ for (var size of [0, 8, 16, 200, 1000, 4096, 8192, 65536]) {
+ yield { scope, size };
+ }
+ }
+}
+
+
+function test() {
+ for (var {scope, size} of buffer_options()) {
+ var old = new ArrayBuffer(size);
+ var copy = deserialize(serialize([old, old], [old], { scope }), { scope });
+ assertEq(old.byteLength, 0);
+ assertEq(copy[0] === copy[1], true);
+ copy = copy[0];
+ assertEq(copy.byteLength, size);
+
+ var constructors = [ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray,
+ DataView ];
+
+ for (var ctor of constructors) {
+ var dataview = (ctor === DataView);
+
+ var buf = new ArrayBuffer(size);
+ var old_arr = new ctor(buf);
+ assertEq(buf.byteLength, size);
+ assertEq(buf, old_arr.buffer);
+ if (!dataview)
+ assertEq(old_arr.length, size / old_arr.BYTES_PER_ELEMENT);
+
+ var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope });
+ assertEq(buf.byteLength, 0,
+ "donor array buffer should be detached");
+ if (!dataview) {
+ assertEq(old_arr.length, 0,
+ "donor typed array should be detached");
+ }
+ assertEq(copy_arr.buffer.byteLength == size, true);
+ if (!dataview)
+ assertEq(copy_arr.length, size / old_arr.BYTES_PER_ELEMENT);
+
+ buf = null;
+ old_arr = null;
+ gc(); // Tickle the ArrayBuffer -> view management
+ }
+
+ for (var ctor of constructors) {
+ var dataview = (ctor === DataView);
+
+ var buf = new ArrayBuffer(size);
+ var old_arr = new ctor(buf);
+ var dv = new DataView(buf); // Second view
+ var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope });
+ assertEq(buf.byteLength, 0,
+ "donor array buffer should be detached");
+ if (!dataview) {
+ assertEq(old_arr.byteLength, 0,
+ "donor typed array should be detached");
+ assertEq(old_arr.length, 0,
+ "donor typed array should be detached");
+ }
+
+ buf = null;
+ old_arr = null;
+ gc(); // Tickle the ArrayBuffer -> view management
+ }
+
+ // Mutate the buffer during the clone operation. The modifications should be visible.
+ if (size >= 4) {
+ old = new ArrayBuffer(size);
+ var view = new Int32Array(old);
+ view[0] = 1;
+ var mutator = { get foo() { view[0] = 2; } };
+ var copy = deserialize(serialize([ old, mutator ], [ old ], { scope }), { scope });
+ var viewCopy = new Int32Array(copy[0]);
+ assertEq(view.length, 0); // Underlying buffer now detached.
+ assertEq(viewCopy[0], 2);
+ }
+
+ // Detach the buffer during the clone operation. Should throw an
+ // exception.
+ if (size >= 4) {
+ const b1 = new ArrayBuffer(size);
+ let mutator = {
+ get foo() {
+ serialize(b1, [b1], { scope });
+ }
+ };
+
+ assertThrowsInstanceOf(
+ () => serialize([ b1, mutator ], [b1]),
+ TypeError,
+ "detaching (due to Transferring) while serializing should throw"
+ );
+
+ const b2 = new ArrayBuffer(size);
+ mutator = {
+ get foo() {
+ detachArrayBuffer(b2);
+ }
+ };
+
+ assertThrowsInstanceOf(
+ () => serialize([ b2, mutator ], [b2]),
+ TypeError,
+ "detaching (due to detachArrayBuffer) while serializing should throw"
+ );
+ }
+ }
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-typed-array.js b/js/src/tests/non262/extensions/clone-typed-array.js
new file mode 100644
index 0000000000..77f0376e91
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-typed-array.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function assertArraysEqual(a, b) {
+ assertEq(a.constructor, b.constructor);
+ assertEq(a.length, b.length);
+ for (var i = 0; i < a.length; i++)
+ assertEq(a[i], b[i]);
+}
+
+function check(b) {
+ var a = deserialize(serialize(b));
+ assertArraysEqual(a, b);
+}
+
+function checkPrototype(ctor) {
+ var threw = false;
+ try {
+ serialize(ctor.prototype);
+ throw new Error("serializing " + ctor.name + ".prototype should throw a TypeError");
+ } catch (exc) {
+ if (!(exc instanceof TypeError))
+ throw exc;
+ }
+}
+
+function test() {
+ // Test cloning ArrayBuffer objects.
+ check(new ArrayBuffer(0));
+ check(new ArrayBuffer(7));
+ checkPrototype(ArrayBuffer);
+
+ // Test cloning typed array objects.
+ var ctors = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray];
+
+ var b;
+ for (var i = 0; i < ctors.length; i++) {
+ var ctor = ctors[i];
+
+ // check empty array
+ b = new ctor(0);
+ check(b);
+
+ // check array with some elements
+ b = new ctor(100);
+ var v = 1;
+ for (var j = 0; j < 100; j++) {
+ b[j] = v;
+ v *= 7;
+ }
+ b[99] = NaN; // check serializing NaNs too
+ check(b);
+
+ // try the prototype
+ checkPrototype(ctor);
+ }
+
+ // Two TypedArrays backed by the same ArrayBuffer should be cloned into two
+ // TypedArrays still sharing a buffer. This also tests cloning TypedArrays
+ // where the arr->data pointer is not 8-byte-aligned.
+
+ var base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ var a = deserialize(serialize(b));
+ base[1] = -1;
+ a[0][2] = -2;
+ assertArraysEqual(b[0], new Int8Array([0, -1, 2])); // shared with base
+ assertArraysEqual(b[1], new Int8Array([-1, 2, 3])); // shared with base
+ assertArraysEqual(a[0], new Int8Array([0, 1, -2])); // not shared with base
+ assertArraysEqual(a[1], new Int8Array([1, -2, 3])); // not shared with base, shared with a[0]
+
+ assertEq(b[0].buffer, b[1].buffer);
+ assertEq(b[1].byteOffset, 1);
+ assertEq(b[1].byteLength, 3);
+ assertEq(b[1].buffer.byteLength, 4);
+
+ // ArrayBuffer clones do not preserve properties
+
+ base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ base.buffer.prop = "yes";
+ base.buffer.loop = b[0];
+ base.buffer.loops = [ b[0], b[1] ];
+ a = deserialize(serialize(b));
+ assertEq("prop" in a[0].buffer, false);
+ assertEq("prop" in a[1].buffer, false);
+ assertEq("loop" in a[0].buffer, false);
+ assertEq("loop" in a[1].buffer, false);
+ assertEq("loops" in a[0].buffer, false);
+ assertEq("loops" in a[1].buffer, false);
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-v1-typed-array-data.dat b/js/src/tests/non262/extensions/clone-v1-typed-array-data.dat
new file mode 100644
index 0000000000..9ced341009
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-v1-typed-array-data.dat
@@ -0,0 +1,32 @@
+var captured = [];
+captured[0] = serialize(0); captured[0].clonebuffer = String.fromCharCode(0, 0, 0, 0, 9, 0, 255, 255);
+captured[1] = serialize(0); captured[1].clonebuffer = String.fromCharCode(7, 0, 0, 0, 9, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[2] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[3] = serialize(0); captured[3].clonebuffer = String.fromCharCode(0, 0, 0, 0, 0, 1, 255, 255);
+captured[4] = serialize(0); captured[4].clonebuffer = String.fromCharCode(100, 0, 0, 0, 0, 1, 255, 255, 1, 7, 49, 87, 97, 167, 145, 247, 193, 71, 241, 151, 33, 231, 81, 55, 129, 135, 177, 216, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[5] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[6] = serialize(0); captured[6].clonebuffer = String.fromCharCode(0, 0, 0, 0, 1, 1, 255, 255);
+captured[7] = serialize(0); captured[7].clonebuffer = String.fromCharCode(100, 0, 0, 0, 1, 1, 255, 255, 1, 7, 49, 87, 97, 167, 145, 247, 193, 71, 241, 151, 33, 231, 81, 55, 129, 135, 177, 216, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[8] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[9] = serialize(0); captured[9].clonebuffer = String.fromCharCode(0, 0, 0, 0, 2, 1, 255, 255);
+captured[10] = serialize(0); captured[10].clonebuffer = String.fromCharCode(100, 0, 0, 0, 2, 1, 255, 255, 1, 0, 7, 0, 49, 0, 87, 1, 97, 9, 167, 65, 145, 203, 247, 144, 193, 246, 71, 191, 241, 58, 151, 156, 33, 72, 231, 248, 81, 206, 55, 164, 129, 125, 135, 110, 177, 5, 216, 39, 224, 22, 0, 160, 0, 96, 0, 160, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[11] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[12] = serialize(0); captured[12].clonebuffer = String.fromCharCode(0, 0, 0, 0, 3, 1, 255, 255);
+captured[13] = serialize(0); captured[13].clonebuffer = String.fromCharCode(100, 0, 0, 0, 3, 1, 255, 255, 1, 0, 7, 0, 49, 0, 87, 1, 97, 9, 167, 65, 145, 203, 247, 144, 193, 246, 71, 191, 241, 58, 151, 156, 33, 72, 231, 248, 81, 206, 55, 164, 129, 125, 135, 110, 177, 5, 216, 39, 224, 22, 0, 160, 0, 96, 0, 160, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[14] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[15] = serialize(0); captured[15].clonebuffer = String.fromCharCode(0, 0, 0, 0, 4, 1, 255, 255);
+captured[16] = serialize(0); captured[16].clonebuffer = String.fromCharCode(100, 0, 0, 0, 4, 1, 255, 255, 1, 0, 0, 0, 7, 0, 0, 0, 49, 0, 0, 0, 87, 1, 0, 0, 97, 9, 0, 0, 167, 65, 0, 0, 145, 203, 1, 0, 247, 144, 12, 0, 193, 246, 87, 0, 71, 191, 103, 2, 241, 58, 214, 16, 151, 156, 219, 117, 33, 72, 1, 57, 231, 248, 8, 143, 81, 206, 62, 233, 55, 164, 183, 96, 129, 125, 5, 165, 135, 110, 38, 131, 177, 5, 13, 150, 216, 39, 91, 26, 224, 22, 126, 184, 0, 160, 114, 11, 0, 96, 34, 80, 0, 160, 240, 48, 0, 128, 148, 86, 0, 0, 16, 94, 0, 0, 112, 146, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[17] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[18] = serialize(0); captured[18].clonebuffer = String.fromCharCode(0, 0, 0, 0, 5, 1, 255, 255);
+captured[19] = serialize(0); captured[19].clonebuffer = String.fromCharCode(100, 0, 0, 0, 5, 1, 255, 255, 1, 0, 0, 0, 7, 0, 0, 0, 49, 0, 0, 0, 87, 1, 0, 0, 97, 9, 0, 0, 167, 65, 0, 0, 145, 203, 1, 0, 247, 144, 12, 0, 193, 246, 87, 0, 71, 191, 103, 2, 241, 58, 214, 16, 151, 156, 219, 117, 33, 72, 1, 57, 231, 248, 8, 143, 81, 206, 62, 233, 55, 164, 183, 96, 129, 125, 5, 165, 135, 110, 38, 131, 177, 5, 13, 150, 216, 39, 91, 26, 224, 22, 126, 184, 0, 160, 114, 11, 0, 96, 34, 80, 0, 160, 240, 48, 0, 128, 148, 86, 0, 0, 16, 94, 0, 0, 112, 146, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[20] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[21] = serialize(0); captured[21].clonebuffer = String.fromCharCode(0, 0, 0, 0, 6, 1, 255, 255);
+captured[22] = serialize(0); captured[22].clonebuffer = String.fromCharCode(100, 0, 0, 0, 6, 1, 255, 255, 0, 0, 128, 63, 0, 0, 224, 64, 0, 0, 68, 66, 0, 128, 171, 67, 0, 16, 22, 69, 0, 78, 131, 70, 128, 200, 229, 71, 112, 15, 73, 73, 130, 237, 175, 74, 210, 239, 25, 76, 216, 177, 134, 77, 57, 183, 235, 78, 82, 64, 78, 80, 72, 120, 180, 81, 63, 233, 29, 83, 23, 44, 138, 84, 40, 205, 241, 85, 131, 147, 83, 87, 19, 33, 185, 88, 240, 252, 33, 90, 82, 189, 141, 91, 80, 11, 248, 92, 230, 9, 89, 94, 169, 232, 189, 95, 148, 43, 38, 97, 34, 102, 145, 98, 187, 114, 254, 99, 100, 164, 94, 101, 215, 207, 194, 102, 220, 117, 42, 104, 33, 39, 149, 105, 61, 130, 2, 107, 234, 99, 100, 108, 109, 215, 199, 109, 127, 220, 46, 111, 239, 0, 153, 112, 209, 224, 5, 114, 110, 73, 106, 115, 65, 0, 205, 116, 57, 96, 51, 118, 49, 244, 156, 119, 171, 85, 9, 121, 236, 85, 112, 122, 46, 75, 210, 123, 200, 1, 56, 125, 143, 1, 161, 126, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 192, 127);
+captured[23] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[24] = serialize(0); captured[24].clonebuffer = String.fromCharCode(0, 0, 0, 0, 7, 1, 255, 255);
+captured[25] = serialize(0); captured[25].clonebuffer = String.fromCharCode(100, 0, 0, 0, 7, 1, 255, 255, 0, 0, 0, 0, 0, 0, 240, 63, 0, 0, 0, 0, 0, 0, 28, 64, 0, 0, 0, 0, 0, 128, 72, 64, 0, 0, 0, 0, 0, 112, 117, 64, 0, 0, 0, 0, 0, 194, 162, 64, 0, 0, 0, 0, 192, 105, 208, 64, 0, 0, 0, 0, 16, 185, 252, 64, 0, 0, 0, 0, 238, 33, 41, 65, 0, 0, 0, 64, 176, 253, 85, 65, 0, 0, 0, 56, 250, 61, 131, 65, 0, 0, 0, 241, 58, 214, 176, 65, 0, 0, 192, 37, 231, 118, 221, 65, 0, 0, 8, 65, 10, 200, 9, 66, 0, 0, 231, 248, 8, 143, 54, 66, 0, 32, 202, 217, 39, 189, 99, 66, 0, 220, 144, 222, 130, 69, 145, 66, 0, 129, 125, 5, 165, 57, 190, 66, 224, 208, 205, 100, 112, 114, 234, 66, 196, 22, 52, 88, 34, 36, 23, 67, 236, 147, 45, 13, 158, 63, 68, 67, 110, 225, 135, 75, 170, 183, 113, 67, 128, 202, 45, 4, 106, 1, 159, 67, 48, 17, 168, 195, 60, 33, 203, 67, 10, 15, 51, 43, 21, 189, 247, 67, 41, 173, 204, 133, 114, 197, 36, 68, 132, 23, 19, 53, 196, 44, 82, 68, 39, 105, 225, 92, 87, 206, 127, 68, 2, 60, 69, 113, 140, 212, 171, 68, 130, 148, 28, 227, 250, 89, 216, 68, 242, 1, 185, 134, 187, 78, 5, 69, 180, 225, 225, 21, 228, 164, 50, 69, 126, 165, 37, 147, 71, 80, 96, 69, 156, 225, 129, 65, 125, 140, 140, 69, 104, 165, 81, 153, 237, 250, 184, 69, 187, 112, 39, 230, 143, 219, 229, 69, 164, 130, 98, 233, 29, 32, 19, 70, 80, 50, 54, 44, 26, 188, 64, 70, 12, 216, 94, 205, 45, 73, 109, 70, 10, 253, 178, 19, 8, 160, 153, 70, 105, 157, 60, 17, 7, 108, 198, 70, 188, 9, 21, 47, 134, 158, 243, 70, 132, 104, 50, 105, 181, 42, 33, 71, 231, 54, 24, 120, 189, 10, 78, 71, 10, 48, 21, 201, 101, 73, 122, 71, 9, 138, 242, 15, 57, 0, 167, 71, 200, 56, 244, 237, 49, 32, 212, 71, 175, 177, 53, 176, 43, 156, 1, 72, 242, 246, 93, 116, 76, 209, 46, 72, 20, 56, 210, 229, 34, 247, 90, 72, 18, 241, 23, 137, 62, 152, 135, 72, 240, 242, 244, 183, 54, 165, 180, 72, 146, 84, 246, 224, 143, 16, 226, 72, 0, 20, 175, 201, 251, 156, 15, 73, 128, 49, 121, 80, 92, 169, 59, 73, 80, 11, 106, 198, 48, 52, 104, 73, 230, 201, 156, 173, 170, 45, 149, 73, 169, 48, 233, 87, 245, 135, 194, 73, 148, 10, 236, 172, 246, 54, 240, 73, 131, 18, 157, 174, 47, 96, 28, 74, 51, 112, 201, 184, 41, 212, 72, 74, 45, 66, 176, 129, 164, 185, 117, 74, 231, 57, 122, 241, 111, 2, 163, 74, 170, 242, 74, 243, 33, 162, 208, 74, 170, 40, 195, 105, 187, 27, 253, 74, 149, 195, 138, 252, 67, 120, 41, 75, 34, 107, 249, 124, 59, 73, 86, 75, 190, 61, 90, 13, 20, 128, 131, 75, 6, 246, 174, 139, 17, 16, 177, 75, 138, 46, 114, 180, 30, 220, 221, 75, 185, 232, 227, 221, 154, 32, 10, 76, 162, 107, 39, 130, 135, 220, 54, 76, 46, 126, 226, 145, 246, 0, 100, 76, 104, 46, 166, 191, 215, 128, 145, 76, 54, 209, 98, 143, 121, 161, 190, 76, 15, 119, 118, 93, 74, 205, 234, 76, 45, 168, 199, 17, 161, 115, 23, 77, 39, 179, 142, 239, 44, 133, 68, 77, 194, 220, 156, 81, 135, 244, 113, 77, 84, 130, 210, 206, 236, 107, 159, 77, 10, 50, 248, 52, 111, 126, 203, 77, 201, 43, 89, 78, 161, 14, 248, 77, 80, 6, 142, 36, 205, 12, 37, 78, 134, 69, 252, 127, 51, 107, 82, 78, 213, 188, 252, 15, 205, 29, 128, 78, 117, 74, 250, 219, 38, 52, 172, 78, 38, 1, 123, 0, 162, 173, 216, 78, 1, 161, 107, 192, 237, 151, 5, 79, 225, 44, 94, 8, 240, 228, 50, 79, 69, 103, 82, 7, 82, 136, 96, 79, 185, 52, 208, 140, 143, 238, 140, 79, 34, 46, 54, 155, 189, 80, 185, 79, 94, 104, 207, 231, 165, 38, 230, 79, 82, 123, 213, 42, 209, 97, 19, 80, 232, 203, 122, 5, 151, 245, 64, 80, 214, 228, 150, 73, 200, 173, 109, 80, 59, 8, 100, 64, 15, 248, 153, 80, 52, 135, 87, 88, 13, 185, 198, 80, 78, 150, 76, 173, 235, 225, 243, 80, 132, 3, 163, 55, 174, 101, 33, 81, 0, 0, 0, 0, 0, 0, 248, 127);
+captured[26] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[27] = serialize(0); captured[27].clonebuffer = String.fromCharCode(0, 0, 0, 0, 8, 1, 255, 255);
+captured[28] = serialize(0); captured[28].clonebuffer = String.fromCharCode(100, 0, 0, 0, 8, 1, 255, 255, 1, 7, 49, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0);
+captured[29] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[30] = serialize(0); captured[30].clonebuffer = String.fromCharCode(0, 0, 0, 0, 7, 0, 255, 255, 0, 0, 0, 0, 3, 0, 255, 255, 3, 0, 0, 0, 0, 1, 255, 255, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 255, 255, 3, 0, 0, 0, 0, 1, 255, 255, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255);
diff --git a/js/src/tests/non262/extensions/clone-v1-typed-array.js b/js/src/tests/non262/extensions/clone-v1-typed-array.js
new file mode 100644
index 0000000000..ae81075e83
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-v1-typed-array.js
@@ -0,0 +1,130 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// This file is a copy of clone-typed-array.js from before v2 structured clone
+// was implemented. If you run this test under a v1-writing engine with the
+// environment variable JS_RECORD_RESULTS set, then it will output a log of
+// structured clone buffers resulting from running this test. You can then use
+// that log as input to another run of this same test on a newer engine, to
+// verify that older-format structured clone data can be deserialized properly.
+
+var old_serialize = serialize;
+var captured = [];
+
+if (os.getenv("JS_RECORD_RESULTS") !== undefined) {
+ serialize = function(o) {
+ var data;
+ try {
+ data = old_serialize(o);
+ captured.push(data);
+ return data;
+ } catch(e) {
+ captured.push(e);
+ throw(e);
+ }
+ };
+} else {
+ loadRelativeToScript("clone-v1-typed-array-data.dat");
+ serialize = function(d) {
+ var data = captured.shift();
+ if (data instanceof Error)
+ throw(data);
+ else
+ return data;
+ };
+}
+
+function assertArraysEqual(a, b) {
+ assertEq(a.constructor, b.constructor);
+ assertEq(a.length, b.length);
+ for (var i = 0; i < a.length; i++)
+ assertEq(a[i], b[i]);
+}
+
+function check(b) {
+ var a = deserialize(serialize(b));
+ assertArraysEqual(a, b);
+}
+
+function checkPrototype(ctor) {
+ var threw = false;
+ try {
+ serialize(ctor.prototype);
+ throw new Error("serializing " + ctor.name + ".prototype should throw a TypeError");
+ } catch (exc) {
+ if (!(exc instanceof TypeError))
+ throw exc;
+ }
+}
+
+function test() {
+ // Test cloning ArrayBuffer objects.
+ check(new ArrayBuffer(0));
+ check(new ArrayBuffer(7));
+ checkPrototype(ArrayBuffer);
+
+ // Test cloning typed array objects.
+ var ctors = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray];
+
+ var b;
+ for (var i = 0; i < ctors.length; i++) {
+ var ctor = ctors[i];
+
+ // check empty array
+ b = new ctor(0);
+ check(b);
+
+ // check array with some elements
+ b = new ctor(100);
+ var v = 1;
+ for (var j = 0; j < 100; j++) {
+ b[j] = v;
+ v *= 7;
+ }
+ b[99] = NaN; // check serializing NaNs too
+ check(b);
+
+ // try the prototype
+ checkPrototype(ctor);
+ }
+
+ // Cloning should separately copy two TypedArrays backed by the same
+ // ArrayBuffer. This also tests cloning TypedArrays where the arr->data
+ // pointer is not 8-byte-aligned.
+
+ var base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ var a = deserialize(serialize(b));
+ base[1] = -1;
+ a[0][2] = -2;
+ assertArraysEqual(b[0], new Int8Array([0, -1, 2])); // shared with base
+ assertArraysEqual(b[1], new Int8Array([-1, 2, 3])); // shared with base
+ assertArraysEqual(a[0], new Int8Array([0, 1, -2])); // not shared with base
+ assertArraysEqual(a[1], new Int8Array([1, 2, 3])); // not shared with base or a[0]
+}
+
+test();
+reportCompare(0, 0, 'ok');
+
+if (os.getenv("JS_RECORD_RESULTS") !== undefined) {
+ print("var captured = [];");
+ for (var i in captured) {
+ var s = "captured[" + i + "] = ";
+ if (captured[i] instanceof Error) {
+ print(s + captured[i].toString() + ";");
+ } else {
+ data = captured[i].clonebuffer.split('').map(c => c.charCodeAt(0));
+ print(s + "serialize(0); captured[" + i + "].clonebuffer = String.fromCharCode(" + data.join(", ") + ");");
+ }
+ }
+}
diff --git a/js/src/tests/non262/extensions/collect-gray.js b/js/src/tests/non262/extensions/collect-gray.js
new file mode 100644
index 0000000000..4beb9f094f
--- /dev/null
+++ b/js/src/tests/non262/extensions/collect-gray.js
@@ -0,0 +1,153 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1337209;
+var summary =
+ "Test gray marking";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof gczeal !== 'undefined')
+ gczeal(0);
+
+grayRoot().x = Object.create(null);
+addMarkObservers([grayRoot(), grayRoot().x, this, Object.create(null)]);
+gc();
+let marks = getMarks();
+assertEq(marks[0], 'gray', 'gray root');
+assertEq(marks[1], 'gray', 'object reachable from gray root');
+assertEq(marks[2], 'black', 'global');
+assertEq(marks[3], 'dead', 'dead object should have been collected');
+
+grayRoot().x = 7; // Overwrite the object
+gc();
+marks = getMarks();
+assertEq(marks[0], 'gray', 'gray root');
+assertEq(marks[1], 'dead', 'object no longer reachable from gray root');
+assertEq(marks[2], 'black', 'global');
+assertEq(marks[3], 'dead', 'dead object should have been collected');
+
+var wm = new WeakMap();
+var global = newGlobal({newCompartment: true});
+
+var wrapper1 = global.eval("Object.create(null)");
+wrapper1.name = "wrapper1";
+var value1 = Object.create(null);
+wm.set(wrapper1, value1);
+
+var wrapper2 = global.eval("Object.create(null)");
+wrapper2.name = "wrapper2";
+var value2 = global.eval("Object.create(null)");
+wm.set(wrapper2, value2);
+
+grayRoot().root1 = wrapper1;
+grayRoot().root2 = wrapper2;
+clearMarkObservers();
+addMarkObservers([wrapper1, value1, wrapper2, value2]);
+wrapper1 = wrapper2 = null;
+value1 = value2 = null;
+gc();
+marks = getMarks();
+assertEq(marks[0], 'gray', 'gray key 1');
+assertEq(marks[1], 'gray', 'black map, gray key => gray value');
+assertEq(marks[2], 'gray', 'gray key 2');
+assertEq(marks[3], 'gray', 'black map, gray key => gray value');
+
+// Blacken one of the keys
+wrapper1 = grayRoot().root1;
+gc();
+marks = getMarks();
+assertEq(marks[0], 'black', 'black key 1');
+assertEq(marks[1], 'black', 'black map, black key => black value');
+assertEq(marks[2], 'gray', 'gray key 2');
+assertEq(marks[3], 'gray', 'black map, gray key => gray value');
+
+// Test edges from map&delegate => key and map&key => value.
+//
+// In general, when a&b => x, then if both a and b are black, then x must be
+// black. If either is gray and the other is marked (gray or black), then x
+// must be gray (unless otherwise reachable from black.) If neither a nor b is
+// marked at all, then they will not keep x alive.
+
+clearMarkObservers();
+
+// Black map, gray delegate => gray key
+
+// wm is in a variable, so is black.
+wm = new WeakMap();
+
+let key = Object.create(null);
+// delegate unwraps key in the 'global' compartment
+global.grayRoot().delegate = key;
+
+// Create a value and map to it from a gray key, then make the value a gray
+// root.
+let value = Object.create(null);
+wm.set(key, value);
+grayRoot().value = value;
+
+// We are interested in the mark bits of the map, key, and value, as well as
+// the mark bits of the wrapped versions in the other compartment. Note that
+// the other-compartment key is the known as the key's delegate with respect to
+// the weakmap.
+global.addMarkObservers([wm, key, value]);
+addMarkObservers([wm, key, value]);
+
+// Key is otherwise dead in main compartment.
+key = null;
+// Don't want value to be marked black.
+value = null;
+
+gc(); // Update mark bits.
+let [
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'gray', 'delegate should be gray');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'black', 'map in var => black');
+assertEq(key_mark, 'gray', 'black map, gray delegate => gray key');
+assertEq(value_mark, 'gray', 'black map, gray delegate/key => gray value');
+
+// Black map, black delegate => black key
+
+// Blacken the delegate by pointing to it from the other global.
+global.delegate = global.grayRoot().delegate;
+
+gc();
+[
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'black', 'delegate held in global.delegate');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'black', 'map in var => black');
+assertEq(key_mark, 'black', 'black map, black delegate => black key');
+assertEq(value_mark, 'black', 'black map, black key => black value');
+
+// Gray map, black delegate => gray key. Unfortunately, there's no way to test
+// this, because a WeakMap key's delegate is its wrapper, and there is a strong
+// edge from wrappers to wrappees. The jsapi-test in testGCGrayMarking, inside
+// TestWeakMaps, *does* test this case.
+
+grayRoot().map = wm;
+wm = null;
+
+gc();
+[
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'black', 'delegate held in global.delegate');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'gray', 'map is a gray root');
+assertEq(key_mark, 'black', 'black delegate marks its key black');
+assertEq(value_mark, 'gray', 'gray map, black key => gray value');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/column-numbers.js b/js/src/tests/non262/extensions/column-numbers.js
new file mode 100644
index 0000000000..721b05e9f2
--- /dev/null
+++ b/js/src/tests/non262/extensions/column-numbers.js
@@ -0,0 +1,10 @@
+actual = 'No Error';
+expected = /column-numbers\.js:4:11/;
+try {
+ throw new Error("test");
+}
+catch(ex) {
+ actual = ex.stack;
+ print('Caught exception ' + ex.stack);
+}
+reportMatch(expected, actual, 'column number present');
diff --git a/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js b/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js
new file mode 100644
index 0000000000..6cd35846b5
--- /dev/null
+++ b/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js
@@ -0,0 +1,60 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 608473;
+var summary =
+ '|var eval = otherWindow.eval; eval(...)| should behave like indirectly ' +
+ 'calling that eval from a script in that other window';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var originalEval = eval;
+var res;
+
+function f()
+{
+ return [this, eval("this")];
+}
+
+var otherGlobalSameCompartment = newGlobal("same-compartment");
+
+eval = otherGlobalSameCompartment.eval;
+res = new f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0] !== this, true);
+assertEq(res[0] instanceof f, true);
+assertEq(res[1], otherGlobalSameCompartment);
+
+res = f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0], this);
+assertEq(res[1], otherGlobalSameCompartment);
+
+var otherGlobalDifferentCompartment = newGlobal();
+
+eval = otherGlobalDifferentCompartment.eval;
+res = new f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0] !== this, true);
+assertEq(res[0] instanceof f, true);
+assertEq(res[1], otherGlobalDifferentCompartment);
+
+res = f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0], this);
+assertEq(res[1], otherGlobalDifferentCompartment);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js b/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js
new file mode 100644
index 0000000000..1480a8ea15
--- /dev/null
+++ b/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 770344;
+var summary = "Object.getPrototypeOf behavior across compartments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var other = newGlobal();
+
+var getProto = Object.getPrototypeOf;
+var otherGetProto = other.Object.getPrototypeOf;
+
+var proto = {};
+var obj = Object.create(proto);
+assertEq(getProto(obj), proto);
+assertEq(otherGetProto(obj), proto);
+
+other.proto = proto;
+var otherObj = other.evaluate("Object.create(proto)");
+assertEq(getProto(otherObj), proto);
+assertEq(otherGetProto(otherObj), proto);
+
+var p = other.evaluate("({})");
+var objOtherProto = Object.create(p);
+assertEq(getProto(objOtherProto), p);
+assertEq(otherGetProto(objOtherProto), p);
+
+other.evaluate("var otherProto = { otherProto: 1 }; " +
+ "var otherObj = Object.create(otherProto);");
+assertEq(getProto(other.otherObj), other.otherProto);
+assertEq(otherGetProto(other.otherObj), other.otherProto);
+
+other.evaluate("var newOtherProto = { newOtherProto: 1 }; " +
+ "otherObj.__proto__ = newOtherProto;");
+assertEq(otherGetProto(other.otherObj), other.newOtherProto);
+
+// TODO This assertion fails due to bug 764307
+//assertEq(getProto(other.otherObj), other.newOtherProto);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/dataview.js b/js/src/tests/non262/extensions/dataview.js
new file mode 100644
index 0000000000..b6514df26a
--- /dev/null
+++ b/js/src/tests/non262/extensions/dataview.js
@@ -0,0 +1,1647 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Tobias Schneider <schneider@jancona.com>
+ */
+
+//------------------------------------------------------------------------------
+var BUGNUMBER = 575688;
+var summary = 'DataView tests';
+
+function test(sharedMem) {
+ function die(message, uplevel) {
+ var e = new Error(message);
+ var frame = e.stack.split("\n")[uplevel];
+ print(message + " at " + frame.split("@")[1]);
+ print("Stack:\n" + e.stack);
+ throw(e);
+ }
+
+ function checkThrow(fun, type) {
+ var thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (!thrown) {
+ die('no exception thrown, expected ' + type.name, 2);
+ } else if (!(thrown instanceof type)) {
+ die('expected ' + type.name + ', got ' + thrown, 2);
+ }
+ }
+
+ function checkThrowTODO(fun, type) {
+ var thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (!thrown) {
+ print('(TODO) no exception thrown, expected ' + type.name);
+ } else if (!(thrown instanceof type)) {
+ print('(TODO) expected ' + type.name + ', got ' + thrown);
+ } else {
+ print('test unexpectedly passed: expected ' + type.name + ' exception');
+ }
+ }
+
+ function bufferize(u8array) {
+ if (!sharedMem)
+ return u8array.buffer;
+
+ let v = new Uint8Array(new SharedArrayBuffer(u8array.buffer.byteLength));
+ v.set(u8array);
+
+ // Sanity checking
+ assertEq(v.buffer instanceof SharedArrayBuffer, true);
+ assertEq(v.buffer.byteLength, u8array.buffer.byteLength);
+ assertEq(u8array[0], v[0]);
+
+ return v.buffer;
+ }
+
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ // testConstructor
+ buffer = bufferize(new Uint8Array([1, 2]));
+ checkThrow(() => new DataView(buffer, 0, 3), RangeError);
+ checkThrow(() => new DataView(buffer, 1, 2), RangeError);
+ checkThrow(() => new DataView(buffer, 2, 1), RangeError);
+ checkThrow(() => new DataView(buffer, 2147483649, 0), RangeError);
+ checkThrow(() => new DataView(buffer, 0, 2147483649), RangeError);
+ checkThrow(() => new DataView(), TypeError);
+ checkThrow(() => new DataView(Object.create(new ArrayBuffer(5))), TypeError);
+
+ // testGetMethods
+
+ // testIntegerGets(start=0, length=16)
+ var data1 = [0,1,2,3,0x64,0x65,0x66,0x67,0x80,0x81,0x82,0x83,252,253,254,255];
+ var data1_r = data1.slice().reverse();
+ var buffer1 = bufferize(new Uint8Array(data1));
+ var view1 = new DataView(buffer1, 0, 16);
+ view = view1;
+ assertEq(view.getInt8(0), 0);
+ assertEq(view.getInt8(8), -128);
+ assertEq(view.getInt8(15), -1);
+ assertEq(view.getUint8(0), 0);
+ assertEq(view.getUint8(8), 128);
+ assertEq(view.getUint8(15), 255);
+ // Little endian.
+ assertEq(view.getInt16(0, true), 256);
+ assertEq(view.getInt16(5, true), 0x6665);
+ assertEq(view.getInt16(9, true), -32127);
+ assertEq(view.getInt16(14, true), -2);
+ // Big endian.
+ assertEq(view.getInt16(0), 1);
+ assertEq(view.getInt16(5), 0x6566);
+ assertEq(view.getInt16(9), -32382);
+ assertEq(view.getInt16(14), -257);
+ // Little endian.
+ assertEq(view.getUint16(0, true), 256);
+ assertEq(view.getUint16(5, true), 0x6665);
+ assertEq(view.getUint16(9, true), 0x8281);
+ assertEq(view.getUint16(14, true), 0xfffe);
+ // Big endian.
+ assertEq(view.getUint16(0), 1);
+ assertEq(view.getUint16(5), 0x6566);
+ assertEq(view.getUint16(9), 0x8182);
+ assertEq(view.getUint16(14), 0xfeff);
+ // Little endian.
+ assertEq(view.getInt32(0, true), 0x3020100);
+ assertEq(view.getInt32(3, true), 0x66656403);
+ assertEq(view.getInt32(6, true), -2122291354);
+ assertEq(view.getInt32(9, true), -58490239);
+ assertEq(view.getInt32(12, true), -66052);
+ // Big endian.
+ assertEq(view.getInt32(0), 0x10203);
+ assertEq(view.getInt32(3), 0x3646566);
+ assertEq(view.getInt32(6), 0x66678081);
+ assertEq(view.getInt32(9), -2122152964);
+ assertEq(view.getInt32(12), -50462977);
+ // Little endian.
+ assertEq(view.getUint32(0, true), 0x3020100);
+ assertEq(view.getUint32(3, true), 0x66656403);
+ assertEq(view.getUint32(6, true), 0x81806766);
+ assertEq(view.getUint32(9, true), 0xfc838281);
+ assertEq(view.getUint32(12, true), 0xfffefdfc);
+ // Big endian.
+ assertEq(view.getUint32(0), 0x10203);
+ assertEq(view.getUint32(3), 0x3646566);
+ assertEq(view.getUint32(6), 0x66678081);
+ assertEq(view.getUint32(9), 0x818283fc);
+ assertEq(view.getUint32(12), 0xfcfdfeff);
+
+ // testFloatGets(start=0)
+
+ // testFloatGet expected=10
+ // Little endian
+ var data2 = [0,0,32,65];
+ var data2_r = data2.slice().reverse();
+ var buffer2 = bufferize(new Uint8Array(data2));
+ view = new DataView(buffer2, 0, 4);
+ assertEq(view.getFloat32(0, true), 10);
+ var buffer2_pad3 = bufferize(new Uint8Array(Array(3).concat(data2)));
+ view = new DataView(buffer2_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), 10);
+ var buffer2_pad7 = bufferize(new Uint8Array(Array(7).concat(data2)));
+ view = new DataView(buffer2_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), 10);
+ var buffer2_pad10 = bufferize(new Uint8Array(Array(10).concat(data2)));
+ view = new DataView(buffer2_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), 10);
+ // Big endian.
+ var buffer2_r = bufferize(new Uint8Array(data2_r));
+ view = new DataView(buffer2_r, 0, 4);
+ assertEq(view.getFloat32(0, false), 10);
+ var buffer2_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data2_r)));
+ view = new DataView(buffer2_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), 10);
+ var buffer2_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data2_r)));
+ view = new DataView(buffer2_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), 10);
+ var buffer2_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data2_r)));
+ view = new DataView(buffer2_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), 10);
+
+ // testFloatGet expected=1.2300000190734863
+ // Little endian
+ var data3 = [164,112,157,63];
+ var data3_r = data3.slice().reverse();
+ var buffer3 = bufferize(new Uint8Array(data3));
+ view = new DataView(buffer3, 0, 4);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ var buffer3_pad3 = bufferize(new Uint8Array(Array(3).concat(data3)));
+ view = new DataView(buffer3_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ var buffer3_pad7 = bufferize(new Uint8Array(Array(7).concat(data3)));
+ view = new DataView(buffer3_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ var buffer3_pad10 = bufferize(new Uint8Array(Array(10).concat(data3)));
+ view = new DataView(buffer3_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ var buffer3_r = bufferize(new Uint8Array(data3_r));
+ view = new DataView(buffer3_r, 0, 4);
+ assertEq(view.getFloat32(0, false), 1.2300000190734863);
+ var buffer3_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data3_r)));
+ view = new DataView(buffer3_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), 1.2300000190734863);
+ var buffer3_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data3_r)));
+ view = new DataView(buffer3_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), 1.2300000190734863);
+ var buffer3_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data3_r)));
+ view = new DataView(buffer3_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), 1.2300000190734863);
+
+ // testFloatGet expected=-45621.37109375
+ // Little endian
+ var data4 = [95,53,50,199];
+ var data4_r = data4.slice().reverse();
+ var buffer4 = bufferize(new Uint8Array(data4));
+ view = new DataView(buffer4, 0, 4);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ var buffer4_pad3 = bufferize(new Uint8Array(Array(3).concat(data4)));
+ view = new DataView(buffer4_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ var buffer4_pad7 = bufferize(new Uint8Array(Array(7).concat(data4)));
+ view = new DataView(buffer4_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ var buffer4_pad10 = bufferize(new Uint8Array(Array(10).concat(data4)));
+ view = new DataView(buffer4_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ var buffer4_r = bufferize(new Uint8Array(data4_r));
+ view = new DataView(buffer4_r, 0, 4);
+ assertEq(view.getFloat32(0, false), -45621.37109375);
+ var buffer4_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data4_r)));
+ view = new DataView(buffer4_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), -45621.37109375);
+ var buffer4_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data4_r)));
+ view = new DataView(buffer4_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), -45621.37109375);
+ var buffer4_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data4_r)));
+ view = new DataView(buffer4_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), -45621.37109375);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ var data5 = [255,255,255,127];
+ var data5_r = data5.slice().reverse();
+ var buffer5 = bufferize(new Uint8Array(data5));
+ view = new DataView(buffer5, 0, 4);
+ assertEq(view.getFloat32(0, true), NaN);
+ var buffer5_pad3 = bufferize(new Uint8Array(Array(3).concat(data5)));
+ view = new DataView(buffer5_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), NaN);
+ var buffer5_pad7 = bufferize(new Uint8Array(Array(7).concat(data5)));
+ view = new DataView(buffer5_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), NaN);
+ var buffer5_pad10 = bufferize(new Uint8Array(Array(10).concat(data5)));
+ view = new DataView(buffer5_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ var buffer5_r = bufferize(new Uint8Array(data5_r));
+ view = new DataView(buffer5_r, 0, 4);
+ assertEq(view.getFloat32(0, false), NaN);
+ var buffer5_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data5_r)));
+ view = new DataView(buffer5_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), NaN);
+ var buffer5_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data5_r)));
+ view = new DataView(buffer5_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), NaN);
+ var buffer5_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data5_r)));
+ view = new DataView(buffer5_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ var data6 = [255,255,255,255];
+ var data6_r = data6.slice().reverse();
+ var buffer6 = bufferize(new Uint8Array(data6));
+ view = new DataView(buffer6, 0, 4);
+ assertEq(view.getFloat32(0, true), NaN);
+ var buffer6_pad3 = bufferize(new Uint8Array(Array(3).concat(data6)));
+ view = new DataView(buffer6_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), NaN);
+ var buffer6_pad7 = bufferize(new Uint8Array(Array(7).concat(data6)));
+ view = new DataView(buffer6_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), NaN);
+ var buffer6_pad10 = bufferize(new Uint8Array(Array(10).concat(data6)));
+ view = new DataView(buffer6_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ var buffer6_r = bufferize(new Uint8Array(data6_r));
+ view = new DataView(buffer6_r, 0, 4);
+ assertEq(view.getFloat32(0, false), NaN);
+ var buffer6_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data6_r)));
+ view = new DataView(buffer6_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), NaN);
+ var buffer6_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data6_r)));
+ view = new DataView(buffer6_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), NaN);
+ var buffer6_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data6_r)));
+ view = new DataView(buffer6_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatGet expected=10
+ // Little endian
+ var data7 = [0,0,0,0,0,0,36,64];
+ var data7_r = data7.slice().reverse();
+ var buffer7 = bufferize(new Uint8Array(data7));
+ view = new DataView(buffer7, 0, 8);
+ assertEq(view.getFloat64(0, true), 10);
+ var buffer7_pad3 = bufferize(new Uint8Array(Array(3).concat(data7)));
+ view = new DataView(buffer7_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), 10);
+ var buffer7_pad7 = bufferize(new Uint8Array(Array(7).concat(data7)));
+ view = new DataView(buffer7_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), 10);
+ var buffer7_pad10 = bufferize(new Uint8Array(Array(10).concat(data7)));
+ view = new DataView(buffer7_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ var buffer7_r = bufferize(new Uint8Array(data7_r));
+ view = new DataView(buffer7_r, 0, 8);
+ assertEq(view.getFloat64(0, false), 10);
+ var buffer7_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data7_r)));
+ view = new DataView(buffer7_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), 10);
+ var buffer7_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data7_r)));
+ view = new DataView(buffer7_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), 10);
+ var buffer7_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data7_r)));
+ view = new DataView(buffer7_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), 10);
+
+ // testFloatGet expected=1.23
+ // Little endian
+ var data8 = [174,71,225,122,20,174,243,63];
+ var data8_r = data8.slice().reverse();
+ var buffer8 = bufferize(new Uint8Array(data8));
+ view = new DataView(buffer8, 0, 8);
+ assertEq(view.getFloat64(0, true), 1.23);
+ var buffer8_pad3 = bufferize(new Uint8Array(Array(3).concat(data8)));
+ view = new DataView(buffer8_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), 1.23);
+ var buffer8_pad7 = bufferize(new Uint8Array(Array(7).concat(data8)));
+ view = new DataView(buffer8_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), 1.23);
+ var buffer8_pad10 = bufferize(new Uint8Array(Array(10).concat(data8)));
+ view = new DataView(buffer8_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ var buffer8_r = bufferize(new Uint8Array(data8_r));
+ view = new DataView(buffer8_r, 0, 8);
+ assertEq(view.getFloat64(0, false), 1.23);
+ var buffer8_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data8_r)));
+ view = new DataView(buffer8_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), 1.23);
+ var buffer8_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data8_r)));
+ view = new DataView(buffer8_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), 1.23);
+ var buffer8_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data8_r)));
+ view = new DataView(buffer8_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), 1.23);
+
+ // testFloatGet expected=-6213576.4839
+ // Little endian
+ var data9 = [181,55,248,30,242,179,87,193];
+ var data9_r = data9.slice().reverse();
+ var buffer9 = bufferize(new Uint8Array(data9));
+ view = new DataView(buffer9, 0, 8);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ var buffer9_pad3 = bufferize(new Uint8Array(Array(3).concat(data9)));
+ view = new DataView(buffer9_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ var buffer9_pad7 = bufferize(new Uint8Array(Array(7).concat(data9)));
+ view = new DataView(buffer9_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ var buffer9_pad10 = bufferize(new Uint8Array(Array(10).concat(data9)));
+ view = new DataView(buffer9_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ var buffer9_r = bufferize(new Uint8Array(data9_r));
+ view = new DataView(buffer9_r, 0, 8);
+ assertEq(view.getFloat64(0, false), -6213576.4839);
+ var buffer9_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data9_r)));
+ view = new DataView(buffer9_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), -6213576.4839);
+ var buffer9_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data9_r)));
+ view = new DataView(buffer9_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), -6213576.4839);
+ var buffer9_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data9_r)));
+ view = new DataView(buffer9_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), -6213576.4839);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ var data10 = [255,255,255,255,255,255,255,127];
+ var data10_r = data10.slice().reverse();
+ var buffer10 = bufferize(new Uint8Array(data10));
+ view = new DataView(buffer10, 0, 8);
+ assertEq(view.getFloat64(0, true), NaN);
+ var buffer10_pad3 = bufferize(new Uint8Array(Array(3).concat(data10)));
+ view = new DataView(buffer10_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), NaN);
+ var buffer10_pad7 = bufferize(new Uint8Array(Array(7).concat(data10)));
+ view = new DataView(buffer10_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), NaN);
+ var buffer10_pad10 = bufferize(new Uint8Array(Array(10).concat(data10)));
+ view = new DataView(buffer10_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ var buffer10_r = bufferize(new Uint8Array(data10_r));
+ view = new DataView(buffer10_r, 0, 8);
+ assertEq(view.getFloat64(0, false), NaN);
+ var buffer10_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data10_r)));
+ view = new DataView(buffer10_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), NaN);
+ var buffer10_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data10_r)));
+ view = new DataView(buffer10_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), NaN);
+ var buffer10_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data10_r)));
+ view = new DataView(buffer10_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ var data11 = [255,255,255,255,255,255,255,255];
+ var data11_r = data11.slice().reverse();
+ var buffer11 = bufferize(new Uint8Array(data11));
+ view = new DataView(buffer11, 0, 8);
+ assertEq(view.getFloat64(0, true), NaN);
+ var buffer11_pad3 = bufferize(new Uint8Array(Array(3).concat(data11)));
+ view = new DataView(buffer11_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), NaN);
+ var buffer11_pad7 = bufferize(new Uint8Array(Array(7).concat(data11)));
+ view = new DataView(buffer11_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), NaN);
+ var buffer11_pad10 = bufferize(new Uint8Array(Array(10).concat(data11)));
+ view = new DataView(buffer11_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ var buffer11_r = bufferize(new Uint8Array(data11_r));
+ view = new DataView(buffer11_r, 0, 8);
+ assertEq(view.getFloat64(0, false), NaN);
+ var buffer11_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data11_r)));
+ view = new DataView(buffer11_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), NaN);
+ var buffer11_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data11_r)));
+ view = new DataView(buffer11_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), NaN);
+ var buffer11_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data11_r)));
+ view = new DataView(buffer11_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testIntegerGets(start=3, length=2)
+ var data12 = [31,32,33,0,1,2,3,100,101,102,103,128,129,130,131,252,253,254,255];
+ var data12_r = data12.slice().reverse();
+ var buffer12 = bufferize(new Uint8Array(data12));
+ view = new DataView(buffer12, 3, 2);
+ assertEq(view.getInt8(0), 0);
+ checkThrow(() => view.getInt8(8), RangeError);
+ checkThrow(() => view.getInt8(15), RangeError);
+ assertEq(view.getUint8(0), 0);
+ checkThrow(() => view.getUint8(8), RangeError);
+ checkThrow(() => view.getUint8(15), RangeError);
+ // Little endian.
+ assertEq(view.getInt16(0, true), 256);
+ checkThrow(() => view.getInt16(5, true), RangeError);
+ checkThrow(() => view.getInt16(9, true), RangeError);
+ checkThrow(() => view.getInt16(14, true), RangeError);
+ // Big endian.
+ assertEq(view.getInt16(0), 1);
+ checkThrow(() => view.getInt16(5), RangeError);
+ checkThrow(() => view.getInt16(9), RangeError);
+ checkThrow(() => view.getInt16(14), RangeError);
+ // Little endian.
+ assertEq(view.getUint16(0, true), 256);
+ checkThrow(() => view.getUint16(5, true), RangeError);
+ checkThrow(() => view.getUint16(9, true), RangeError);
+ checkThrow(() => view.getUint16(14, true), RangeError);
+ // Big endian.
+ assertEq(view.getUint16(0), 1);
+ checkThrow(() => view.getUint16(5), RangeError);
+ checkThrow(() => view.getUint16(9), RangeError);
+ checkThrow(() => view.getUint16(14), RangeError);
+ // Little endian.
+ checkThrow(() => view.getInt32(0, true), RangeError);
+ checkThrow(() => view.getInt32(3, true), RangeError);
+ checkThrow(() => view.getInt32(6, true), RangeError);
+ checkThrow(() => view.getInt32(9, true), RangeError);
+ checkThrow(() => view.getInt32(12, true), RangeError);
+ // Big endian.
+ checkThrow(() => view.getInt32(0), RangeError);
+ checkThrow(() => view.getInt32(3), RangeError);
+ checkThrow(() => view.getInt32(6), RangeError);
+ checkThrow(() => view.getInt32(9), RangeError);
+ checkThrow(() => view.getInt32(12), RangeError);
+ // Little endian.
+ checkThrow(() => view.getUint32(0, true), RangeError);
+ checkThrow(() => view.getUint32(3, true), RangeError);
+ checkThrow(() => view.getUint32(6, true), RangeError);
+ checkThrow(() => view.getUint32(9, true), RangeError);
+ checkThrow(() => view.getUint32(12, true), RangeError);
+ // Big endian.
+ checkThrow(() => view.getUint32(0), RangeError);
+ checkThrow(() => view.getUint32(3), RangeError);
+ checkThrow(() => view.getUint32(6), RangeError);
+ checkThrow(() => view.getUint32(9), RangeError);
+ checkThrow(() => view.getUint32(12), RangeError);
+
+ // testFloatGets(start=3)
+
+ // testFloatGet expected=10
+ // Little endian
+ view = new DataView(buffer2, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer2_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer2_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer2_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer2_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer2_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer2_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer2_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=1.2300000190734863
+ // Little endian
+ view = new DataView(buffer3, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer3_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer3_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer3_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer3_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer3_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer3_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer3_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=-45621.37109375
+ // Little endian
+ view = new DataView(buffer4, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer4_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer4_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer4_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer4_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer4_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer4_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer4_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ view = new DataView(buffer5, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer5_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer5_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer5_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer5_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer5_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer5_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer5_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ view = new DataView(buffer6, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer6_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer6_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer6_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer6_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer6_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer6_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer6_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=10
+ // Little endian
+ view = new DataView(buffer7, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer7_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer7_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer7_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer7_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer7_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer7_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer7_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testFloatGet expected=1.23
+ // Little endian
+ view = new DataView(buffer8, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer8_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer8_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer8_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer8_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer8_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer8_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer8_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testFloatGet expected=-6213576.4839
+ // Little endian
+ view = new DataView(buffer9, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer9_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer9_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer9_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer9_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer9_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer9_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer9_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ view = new DataView(buffer10, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer10_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer10_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer10_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer10_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer10_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer10_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer10_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ view = new DataView(buffer11, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer11_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer11_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer11_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer11_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer11_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer11_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer11_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testGetNegativeIndexes
+ view = new DataView(buffer1, 0, 16);
+ checkThrow(() => view.getInt8(-1), RangeError);
+ checkThrow(() => view.getInt8(-2), RangeError);
+ checkThrow(() => view.getUint8(-1), RangeError);
+ checkThrow(() => view.getUint8(-2), RangeError);
+ checkThrow(() => view.getInt16(-1), RangeError);
+ checkThrow(() => view.getInt16(-2), RangeError);
+ checkThrow(() => view.getInt16(-3), RangeError);
+ checkThrow(() => view.getUint16(-1), RangeError);
+ checkThrow(() => view.getUint16(-2), RangeError);
+ checkThrow(() => view.getUint16(-3), RangeError);
+ checkThrow(() => view.getInt32(-1), RangeError);
+ checkThrow(() => view.getInt32(-3), RangeError);
+ checkThrow(() => view.getInt32(-5), RangeError);
+ checkThrow(() => view.getUint32(-1), RangeError);
+ checkThrow(() => view.getUint32(-3), RangeError);
+ checkThrow(() => view.getUint32(-5), RangeError);
+ view = new DataView(buffer7, 0, 8);
+ checkThrow(() => view.getFloat32(-1), RangeError);
+ checkThrow(() => view.getFloat32(-3), RangeError);
+ checkThrow(() => view.getFloat32(-5), RangeError);
+ checkThrow(() => view.getFloat64(-1), RangeError);
+ checkThrow(() => view.getFloat64(-5), RangeError);
+ checkThrow(() => view.getFloat64(-9), RangeError);
+
+ // Too large for signed 32 bit integer index
+ checkThrow(() => view.getInt8(2147483648), RangeError);
+ checkThrow(() => view.getInt8(2147483649), RangeError);
+ checkThrow(() => view.getUint8(2147483648), RangeError);
+ checkThrow(() => view.getUint8(2147483649), RangeError);
+ checkThrow(() => view.getInt16(2147483648), RangeError);
+ checkThrow(() => view.getInt16(2147483649), RangeError);
+ checkThrow(() => view.getUint16(2147483648), RangeError);
+ checkThrow(() => view.getUint16(2147483649), RangeError);
+ checkThrow(() => view.getInt32(2147483648), RangeError);
+ checkThrow(() => view.getInt32(2147483649), RangeError);
+ checkThrow(() => view.getUint32(2147483648), RangeError);
+ checkThrow(() => view.getUint32(2147483649), RangeError);
+ checkThrow(() => view.getFloat32(2147483648), RangeError);
+ checkThrow(() => view.getFloat32(2147483649), RangeError);
+ checkThrow(() => view.getFloat64(2147483648), RangeError);
+ checkThrow(() => view.getFloat64(2147483649), RangeError);
+
+ // Test for wrong type of |this|
+ checkThrow(() => view.getInt8.apply("dead", [0]), TypeError);
+ checkThrow(() => view.getUint8.apply("puppies", [0]), TypeError);
+ checkThrow(() => view.getInt16.apply("aren", [0]), TypeError);
+ checkThrow(() => view.getUint16.apply("t", [0]), TypeError);
+ checkThrow(() => view.getInt32.apply("much", [0]), TypeError);
+ checkThrow(() => view.getUint32.apply("fun", [0]), TypeError);
+ checkThrow(() => view.getFloat32.apply("(in", [0]), TypeError);
+ checkThrow(() => view.getFloat64.apply("bed)", [0]), TypeError);
+ checkThrow(() => view.setInt8.apply("dead", [0, 0]), TypeError);
+ checkThrow(() => view.setUint8.apply("puppies", [0, 0]), TypeError);
+ checkThrow(() => view.setInt16.apply("aren", [0, 0]), TypeError);
+ checkThrow(() => view.setUint16.apply("t", [0, 0]), TypeError);
+ checkThrow(() => view.setInt32.apply("much", [0, 0]), TypeError);
+ checkThrow(() => view.setUint32.apply("fun", [0, 0]), TypeError);
+ checkThrow(() => view.setFloat32.apply("(in", [0, 0]), TypeError);
+ checkThrow(() => view.setFloat64.apply("bed)", [0, 0]), TypeError);
+
+ // testSetMethods
+
+ // Test for set methods that work
+
+ // testIntegerSets(start=0, length=16)
+ var data13 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204];
+ var data13_r = data13.slice().reverse();
+ var buffer13 = bufferize(new Uint8Array(data13));
+ view = new DataView(buffer13, 0, 16);
+ view.setInt8(0, 0);
+ assertEq(view.getInt8(0), 0);
+ view.setInt8(8, -128);
+ assertEq(view.getInt8(8), -128);
+ view.setInt8(15, -1);
+ assertEq(view.getInt8(15), -1);
+ view.setUint8(0, 0);
+ assertEq(view.getUint8(0), 0);
+ view.setUint8(8, 128);
+ assertEq(view.getUint8(8), 128);
+ view.setUint8(15, 255);
+ assertEq(view.getUint8(15), 255);
+ view.setInt16(0, 256, true);
+ assertEq(view.getInt16(0, true), 256);
+ view.setInt16(5, 26213, true);
+ assertEq(view.getInt16(5, true), 26213);
+ view.setInt16(9, -32127, true);
+ assertEq(view.getInt16(9, true), -32127);
+ view.setInt16(14, -2, true);
+ assertEq(view.getInt16(14, true), -2);
+ view.setInt16(0, 1);
+ assertEq(view.getInt16(0), 1);
+ view.setInt16(5, 25958);
+ assertEq(view.getInt16(5), 25958);
+ view.setInt16(9, -32382);
+ assertEq(view.getInt16(9), -32382);
+ view.setInt16(14, -257);
+ assertEq(view.getInt16(14), -257);
+ view.setUint16(0, 256, true);
+ assertEq(view.getUint16(0, true), 256);
+ view.setUint16(5, 26213, true);
+ assertEq(view.getUint16(5, true), 26213);
+ view.setUint16(9, 33409, true);
+ assertEq(view.getUint16(9, true), 33409);
+ view.setUint16(14, 65534, true);
+ assertEq(view.getUint16(14, true), 65534);
+ view.setUint16(0, 1);
+ assertEq(view.getUint16(0), 1);
+ view.setUint16(5, 25958);
+ assertEq(view.getUint16(5), 25958);
+ view.setUint16(9, 33154);
+ assertEq(view.getUint16(9), 33154);
+ view.setUint16(14, 65279);
+ assertEq(view.getUint16(14), 65279);
+ view.setInt32(0, 50462976, true);
+ assertEq(view.getInt32(0, true), 50462976);
+ view.setInt32(3, 1717920771, true);
+ assertEq(view.getInt32(3, true), 1717920771);
+ view.setInt32(6, -2122291354, true);
+ assertEq(view.getInt32(6, true), -2122291354);
+ view.setInt32(9, -58490239, true);
+ assertEq(view.getInt32(9, true), -58490239);
+ view.setInt32(12, -66052, true);
+ assertEq(view.getInt32(12, true), -66052);
+ view.setInt32(0, 66051);
+ assertEq(view.getInt32(0), 66051);
+ view.setInt32(3, 56911206);
+ assertEq(view.getInt32(3), 56911206);
+ view.setInt32(6, 1718059137);
+ assertEq(view.getInt32(6), 1718059137);
+ view.setInt32(9, -2122152964);
+ assertEq(view.getInt32(9), -2122152964);
+ view.setInt32(12, -50462977);
+ assertEq(view.getInt32(12), -50462977);
+ view.setUint32(0, 50462976, true);
+ assertEq(view.getUint32(0, true), 50462976);
+ view.setUint32(3, 1717920771, true);
+ assertEq(view.getUint32(3, true), 1717920771);
+ view.setUint32(6, 2172675942, true);
+ assertEq(view.getUint32(6, true), 2172675942);
+ view.setUint32(9, 4236477057, true);
+ assertEq(view.getUint32(9, true), 4236477057);
+ view.setUint32(12, 4294901244, true);
+ assertEq(view.getUint32(12, true), 4294901244);
+ view.setUint32(0, 66051);
+ assertEq(view.getUint32(0), 66051);
+ view.setUint32(3, 56911206);
+ assertEq(view.getUint32(3), 56911206);
+ view.setUint32(6, 1718059137);
+ assertEq(view.getUint32(6), 1718059137);
+ view.setUint32(9, 2172814332);
+ assertEq(view.getUint32(9), 2172814332);
+ view.setUint32(12, 4244504319);
+ assertEq(view.getUint32(12), 4244504319);
+
+ // testFloatSets(start=undefined)
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, 10, true);
+ assertEq(view.getFloat32(0, true), 10);
+ var buffer13_pad3 = bufferize(new Uint8Array(Array(3).concat(data13)));
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, 10, true);
+ assertEq(view.getFloat32(3, true), 10);
+ var buffer13_pad7 = bufferize(new Uint8Array(Array(7).concat(data13)));
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, 10, true);
+ assertEq(view.getFloat32(7, true), 10);
+ var buffer13_pad10 = bufferize(new Uint8Array(Array(10).concat(data13)));
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, 10, true);
+ assertEq(view.getFloat32(10, true), 10);
+ // Big endian.
+ var buffer13_r = bufferize(new Uint8Array(data13_r));
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, 10, false);
+ assertEq(view.getFloat32(0, false), 10);
+ var buffer13_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data13_r)));
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, 10, false);
+ assertEq(view.getFloat32(3, false), 10);
+ var buffer13_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data13_r)));
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, 10, false);
+ assertEq(view.getFloat32(7, false), 10);
+ var buffer13_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data13_r)));
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, 10, false);
+ assertEq(view.getFloat32(10, false), 10);
+
+ // testFloatSet expected=1.2300000190734863
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, 1.2300000190734863, true);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, 1.2300000190734863, true);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, 1.2300000190734863, true);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, 1.2300000190734863, true);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, 1.2300000190734863, false);
+ assertEq(view.getFloat32(0, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, 1.2300000190734863, false);
+ assertEq(view.getFloat32(3, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, 1.2300000190734863, false);
+ assertEq(view.getFloat32(7, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, 1.2300000190734863, false);
+ assertEq(view.getFloat32(10, false), 1.2300000190734863);
+
+ // testFloatSet expected=-45621.37109375
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, -45621.37109375, true);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, -45621.37109375, true);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, -45621.37109375, true);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, -45621.37109375, true);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, -45621.37109375, false);
+ assertEq(view.getFloat32(0, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, -45621.37109375, false);
+ assertEq(view.getFloat32(3, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, -45621.37109375, false);
+ assertEq(view.getFloat32(7, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, -45621.37109375, false);
+ assertEq(view.getFloat32(10, false), -45621.37109375);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, NaN, true);
+ assertEq(view.getFloat32(0, true), NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, NaN, true);
+ assertEq(view.getFloat32(3, true), NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, NaN, true);
+ assertEq(view.getFloat32(7, true), NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, NaN, true);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, NaN, false);
+ assertEq(view.getFloat32(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, NaN, false);
+ assertEq(view.getFloat32(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, NaN, false);
+ assertEq(view.getFloat32(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, NaN, false);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, -NaN, true);
+ assertEq(view.getFloat32(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, -NaN, true);
+ assertEq(view.getFloat32(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, -NaN, true);
+ assertEq(view.getFloat32(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, -NaN, true);
+ assertEq(view.getFloat32(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, -NaN, false);
+ assertEq(view.getFloat32(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, -NaN, false);
+ assertEq(view.getFloat32(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, -NaN, false);
+ assertEq(view.getFloat32(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, -NaN, false);
+ assertEq(view.getFloat32(10, false), -NaN);
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, 10, true);
+ assertEq(view.getFloat64(0, true), 10);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, 10, true);
+ assertEq(view.getFloat64(3, true), 10);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, 10, true);
+ assertEq(view.getFloat64(7, true), 10);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, 10, true);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, 10, false);
+ assertEq(view.getFloat64(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, 10, false);
+ assertEq(view.getFloat64(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, 10, false);
+ assertEq(view.getFloat64(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, 10, false);
+ assertEq(view.getFloat64(10, false), 10);
+
+ // testFloatSet expected=1.23
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, 1.23, true);
+ assertEq(view.getFloat64(0, true), 1.23);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, 1.23, true);
+ assertEq(view.getFloat64(3, true), 1.23);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, 1.23, true);
+ assertEq(view.getFloat64(7, true), 1.23);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, 1.23, true);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, 1.23, false);
+ assertEq(view.getFloat64(0, false), 1.23);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, 1.23, false);
+ assertEq(view.getFloat64(3, false), 1.23);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, 1.23, false);
+ assertEq(view.getFloat64(7, false), 1.23);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, 1.23, false);
+ assertEq(view.getFloat64(10, false), 1.23);
+
+ // testFloatSet expected=-6213576.4839
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, -6213576.4839, true);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, -6213576.4839, true);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, -6213576.4839, true);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, -6213576.4839, true);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, -6213576.4839, false);
+ assertEq(view.getFloat64(0, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, -6213576.4839, false);
+ assertEq(view.getFloat64(3, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, -6213576.4839, false);
+ assertEq(view.getFloat64(7, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, -6213576.4839, false);
+ assertEq(view.getFloat64(10, false), -6213576.4839);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, NaN, true);
+ assertEq(view.getFloat64(0, true), NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, NaN, true);
+ assertEq(view.getFloat64(3, true), NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, NaN, true);
+ assertEq(view.getFloat64(7, true), NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, NaN, true);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, NaN, false);
+ assertEq(view.getFloat64(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, NaN, false);
+ assertEq(view.getFloat64(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, NaN, false);
+ assertEq(view.getFloat64(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, NaN, false);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, -NaN, true);
+ assertEq(view.getFloat64(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, -NaN, true);
+ assertEq(view.getFloat64(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, -NaN, true);
+ assertEq(view.getFloat64(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, -NaN, true);
+ assertEq(view.getFloat64(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, -NaN, false);
+ assertEq(view.getFloat64(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, -NaN, false);
+ assertEq(view.getFloat64(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, -NaN, false);
+ assertEq(view.getFloat64(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, -NaN, false);
+ assertEq(view.getFloat64(10, false), -NaN);
+
+ // Test for set methods that might write beyond the range
+
+ // testIntegerSets(start=3, length=2)
+ view = new DataView(buffer13, 3, 2);
+ view.setInt8(0, 0);
+ assertEq(view.getInt8(0), 0);
+ checkThrow(() => view.setInt8(8, -128), RangeError);
+ checkThrow(() => view.setInt8(15, -1), RangeError);
+ view.setUint8(0, 0);
+ assertEq(view.getUint8(0), 0);
+ checkThrow(() => view.setUint8(8, 128), RangeError);
+ checkThrow(() => view.setUint8(15, 255), RangeError);
+ view.setInt16(0, 256, true);
+ assertEq(view.getInt16(0, true), 256);
+ checkThrow(() => view.setInt16(5, 26213, true), RangeError);
+ checkThrow(() => view.setInt16(9, -32127, true), RangeError);
+ checkThrow(() => view.setInt16(14, -2, true), RangeError);
+ view.setInt16(0, 1);
+ assertEq(view.getInt16(0), 1);
+ checkThrow(() => view.setInt16(5, 25958), RangeError);
+ checkThrow(() => view.setInt16(9, -32382), RangeError);
+ checkThrow(() => view.setInt16(14, -257), RangeError);
+ view.setUint16(0, 256, true);
+ assertEq(view.getUint16(0, true), 256);
+ checkThrow(() => view.setUint16(5, 26213, true), RangeError);
+ checkThrow(() => view.setUint16(9, 33409, true), RangeError);
+ checkThrow(() => view.setUint16(14, 65534, true), RangeError);
+ view.setUint16(0, 1);
+ assertEq(view.getUint16(0), 1);
+ checkThrow(() => view.setUint16(5, 25958), RangeError);
+ checkThrow(() => view.setUint16(9, 33154), RangeError);
+ checkThrow(() => view.setUint16(14, 65279), RangeError);
+ checkThrow(() => view.setInt32(0, 50462976, true), RangeError);
+ checkThrow(() => view.setInt32(3, 1717920771, true), RangeError);
+ checkThrow(() => view.setInt32(6, -2122291354, true), RangeError);
+ checkThrow(() => view.setInt32(9, -58490239, true), RangeError);
+ checkThrow(() => view.setInt32(12, -66052, true), RangeError);
+ checkThrow(() => view.setInt32(0, 66051), RangeError);
+ checkThrow(() => view.setInt32(3, 56911206), RangeError);
+ checkThrow(() => view.setInt32(6, 1718059137), RangeError);
+ checkThrow(() => view.setInt32(9, -2122152964), RangeError);
+ checkThrow(() => view.setInt32(12, -50462977), RangeError);
+ checkThrow(() => view.setUint32(0, 50462976, true), RangeError);
+ checkThrow(() => view.setUint32(3, 1717920771, true), RangeError);
+ checkThrow(() => view.setUint32(6, 2172675942, true), RangeError);
+ checkThrow(() => view.setUint32(9, 4236477057, true), RangeError);
+ checkThrow(() => view.setUint32(12, 4294901244, true), RangeError);
+ checkThrow(() => view.setUint32(0, 66051), RangeError);
+ checkThrow(() => view.setUint32(3, 56911206), RangeError);
+ checkThrow(() => view.setUint32(6, 1718059137), RangeError);
+ checkThrow(() => view.setUint32(9, 2172814332), RangeError);
+ checkThrow(() => view.setUint32(12, 4244504319), RangeError);
+
+ // testFloatSets(start=7)
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, 10, true);
+ assertEq(view.getFloat32(0, true), 10);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, 10, true);
+ assertEq(view.getFloat32(3, true), 10);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, 10, true);
+ assertEq(view.getFloat32(7, true), 10);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, 10, true);
+ assertEq(view.getFloat32(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, 10, false);
+ assertEq(view.getFloat32(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, 10, false);
+ assertEq(view.getFloat32(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, 10, false);
+ assertEq(view.getFloat32(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, 10, false);
+ assertEq(view.getFloat32(10, false), 10);
+
+ // testFloatSet expected=1.2300000190734863
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, 1.2300000190734863, true);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, 1.2300000190734863, true);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, 1.2300000190734863, true);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, 1.2300000190734863, true);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, 1.2300000190734863, false);
+ assertEq(view.getFloat32(0, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, 1.2300000190734863, false);
+ assertEq(view.getFloat32(3, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, 1.2300000190734863, false);
+ assertEq(view.getFloat32(7, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, 1.2300000190734863, false);
+ assertEq(view.getFloat32(10, false), 1.2300000190734863);
+
+ // testFloatSet expected=-45621.37109375
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, -45621.37109375, true);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, -45621.37109375, true);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, -45621.37109375, true);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, -45621.37109375, true);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, -45621.37109375, false);
+ assertEq(view.getFloat32(0, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, -45621.37109375, false);
+ assertEq(view.getFloat32(3, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, -45621.37109375, false);
+ assertEq(view.getFloat32(7, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, -45621.37109375, false);
+ assertEq(view.getFloat32(10, false), -45621.37109375);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, NaN, true);
+ assertEq(view.getFloat32(0, true), NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, NaN, true);
+ assertEq(view.getFloat32(3, true), NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, NaN, true);
+ assertEq(view.getFloat32(7, true), NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, NaN, true);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, NaN, false);
+ assertEq(view.getFloat32(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, NaN, false);
+ assertEq(view.getFloat32(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, NaN, false);
+ assertEq(view.getFloat32(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, NaN, false);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, -NaN, true);
+ assertEq(view.getFloat32(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, -NaN, true);
+ assertEq(view.getFloat32(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, -NaN, true);
+ assertEq(view.getFloat32(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, -NaN, true);
+ assertEq(view.getFloat32(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, -NaN, false);
+ assertEq(view.getFloat32(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, -NaN, false);
+ assertEq(view.getFloat32(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, -NaN, false);
+ assertEq(view.getFloat32(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, -NaN, false);
+ assertEq(view.getFloat32(10, false), -NaN);
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, 10, true);
+ assertEq(view.getFloat64(0, true), 10);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, 10, true);
+ assertEq(view.getFloat64(3, true), 10);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, 10, true);
+ assertEq(view.getFloat64(7, true), 10);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, 10, true);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, 10, false);
+ assertEq(view.getFloat64(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, 10, false);
+ assertEq(view.getFloat64(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, 10, false);
+ assertEq(view.getFloat64(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, 10, false);
+ assertEq(view.getFloat64(10, false), 10);
+
+ // testFloatSet expected=1.23
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, 1.23, true);
+ assertEq(view.getFloat64(0, true), 1.23);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, 1.23, true);
+ assertEq(view.getFloat64(3, true), 1.23);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, 1.23, true);
+ assertEq(view.getFloat64(7, true), 1.23);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, 1.23, true);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, 1.23, false);
+ assertEq(view.getFloat64(0, false), 1.23);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, 1.23, false);
+ assertEq(view.getFloat64(3, false), 1.23);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, 1.23, false);
+ assertEq(view.getFloat64(7, false), 1.23);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, 1.23, false);
+ assertEq(view.getFloat64(10, false), 1.23);
+
+ // testFloatSet expected=-6213576.4839
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, -6213576.4839, true);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, -6213576.4839, true);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, -6213576.4839, true);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, -6213576.4839, true);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, -6213576.4839, false);
+ assertEq(view.getFloat64(0, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, -6213576.4839, false);
+ assertEq(view.getFloat64(3, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, -6213576.4839, false);
+ assertEq(view.getFloat64(7, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, -6213576.4839, false);
+ assertEq(view.getFloat64(10, false), -6213576.4839);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, NaN, true);
+ assertEq(view.getFloat64(0, true), NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, NaN, true);
+ assertEq(view.getFloat64(3, true), NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, NaN, true);
+ assertEq(view.getFloat64(7, true), NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, NaN, true);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, NaN, false);
+ assertEq(view.getFloat64(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, NaN, false);
+ assertEq(view.getFloat64(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, NaN, false);
+ assertEq(view.getFloat64(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, NaN, false);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, -NaN, true);
+ assertEq(view.getFloat64(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, -NaN, true);
+ assertEq(view.getFloat64(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, -NaN, true);
+ assertEq(view.getFloat64(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, -NaN, true);
+ assertEq(view.getFloat64(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, -NaN, false);
+ assertEq(view.getFloat64(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, -NaN, false);
+ assertEq(view.getFloat64(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, -NaN, false);
+ assertEq(view.getFloat64(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, -NaN, false);
+ assertEq(view.getFloat64(10, false), -NaN);
+
+ // Test for set methods that write to negative index
+
+ // testSetNegativeIndexes
+ view = new DataView(buffer1, 0, 16);
+ checkThrow(() => view.setInt8(-1, 0), RangeError);
+ checkThrow(() => view.setInt8(-2, 0), RangeError);
+ checkThrow(() => view.setUint8(-1, 0), RangeError);
+ checkThrow(() => view.setUint8(-2, 0), RangeError);
+ checkThrow(() => view.setInt16(-1, 0), RangeError);
+ checkThrow(() => view.setInt16(-2, 0), RangeError);
+ checkThrow(() => view.setInt16(-3, 0), RangeError);
+ checkThrow(() => view.setUint16(-1, 0), RangeError);
+ checkThrow(() => view.setUint16(-2, 0), RangeError);
+ checkThrow(() => view.setUint16(-3, 0), RangeError);
+ checkThrow(() => view.setInt32(-1, 0), RangeError);
+ checkThrow(() => view.setInt32(-3, 0), RangeError);
+ checkThrow(() => view.setInt32(-5, 0), RangeError);
+ checkThrow(() => view.setUint32(-1, 0), RangeError);
+ checkThrow(() => view.setUint32(-3, 0), RangeError);
+ checkThrow(() => view.setUint32(-5, 0), RangeError);
+ view = new DataView(buffer7, 0, 8);
+ checkThrow(() => view.setFloat32(-1, 0), RangeError);
+ checkThrow(() => view.setFloat32(-3, 0), RangeError);
+ checkThrow(() => view.setFloat32(-5, 0), RangeError);
+ checkThrow(() => view.setFloat64(-1, 0), RangeError);
+ checkThrow(() => view.setFloat64(-5, 0), RangeError);
+ checkThrow(() => view.setFloat64(-9, 0), RangeError);
+
+ // Too large for signed 32 bit integer index
+ checkThrow(() => view.setInt8(2147483649, 1), RangeError);
+ checkThrow(() => view.setUint8(2147483649, 1), RangeError);
+ checkThrow(() => view.setInt16(2147483649, 1), RangeError);
+ checkThrow(() => view.setUint16(2147483649, 1), RangeError);
+ checkThrow(() => view.setInt32(2147483649, 1), RangeError);
+ checkThrow(() => view.setUint32(2147483649, 1), RangeError);
+ checkThrow(() => view.setFloat32(2147483649, 1), RangeError);
+ checkThrow(() => view.setFloat64(2147483649, 1), RangeError);
+
+ // testAlignment
+ var intArray1 = [0, 1, 2, 3, 100, 101, 102, 103, 128, 129, 130, 131, 252, 253, 254, 255];
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 0);
+ assertEq(view.getUint32(0, false), 0x00010203);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 1);
+ assertEq(view.getUint32(0, false), 0x01020364);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 2);
+ assertEq(view.getUint32(0, false), 0x02036465);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 3);
+ assertEq(view.getUint32(0, false), 0x03646566);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 4);
+ assertEq(view.getUint32(0, false), 0x64656667);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 5);
+ assertEq(view.getUint32(0, false), 0x65666780);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 6);
+ assertEq(view.getUint32(0, false), 0x66678081);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 7);
+ assertEq(view.getUint32(0, false), 0x67808182);
+
+ // Test for indexing into a DataView, which should not use the ArrayBuffer storage
+ view = new DataView(bufferize(new Uint8Array([1, 2])));
+ assertEq(view[0], undefined);
+ view[0] = 3;
+ assertEq(view[0], 3);
+ assertEq(view.getUint8(0), 1);
+
+ // Test WebIDL-specific class and prototype class names
+ assertEq(Object.prototype.toString.apply(new Uint8Array(0)), "[object Uint8Array]");
+ assertEq(Object.prototype.toString.apply(new Float32Array(0)), "[object Float32Array]");
+ assertEq(Object.prototype.toString.apply(new ArrayBuffer()), "[object ArrayBuffer]");
+ assertEq(Object.prototype.toString.apply(new DataView(view.buffer)), "[object DataView]");
+ assertEq(Object.prototype.toString.apply(DataView.prototype), "[object DataView]");
+
+ // get %TypedArray%.prototype[@@toStringTag] returns undefined thus
+ // Object.prototype.toString falls back to [object Object]
+ assertEq(Object.prototype.toString.apply(Uint8Array.prototype), "[object Object]");
+ assertEq(Object.prototype.toString.apply(Float32Array.prototype), "[object Object]");
+ var typedArrayPrototype = Object.getPrototypeOf(Float32Array.prototype);
+ assertEq(Object.prototype.toString.apply(typedArrayPrototype), "[object Object]");
+
+ // Accessing DataView fields on DataView.prototype should crash
+ checkThrow(() => DataView.prototype.byteLength, TypeError);
+ checkThrow(() => DataView.prototype.byteOffset, TypeError);
+ checkThrow(() => DataView.prototype.buffer, TypeError);
+
+ // Protos and proxies, oh my!
+ var alien = newGlobal();
+ var alien_data = alien.eval('data = ' + JSON.stringify(data1));
+ var alien_buffer = alien.eval(`buffer = new ${sharedMem ? 'Shared' : ''}ArrayBuffer(data.length)`);
+ alien.eval('new Uint8Array(buffer).set(data)');
+ var alien_view = alien.eval('view = new DataView(buffer, 0, 16)');
+
+ // proto is view of buffer: should throw
+ var o = Object.create(view1);
+ checkThrow(() => o.getUint8(4), TypeError); // WebIDL 4.4.7: Operations
+ checkThrow(() => o.buffer, TypeError); // WebIDL 4.4.6: Attributes, section 2
+ checkThrow(() => o.byteOffset, TypeError);
+ checkThrow(() => o.byteLength, TypeError);
+
+ // proxy for view of buffer: should work
+ assertEq(alien_view.buffer.byteLength > 0, true);
+ assertEq(alien_view.getUint8(4), 100);
+
+ // Bug 753996: when throwing an Error whose message contains the name of a
+ // function, the JS engine calls js_ValueToFunction to produce the function
+ // name to include in the message. js_ValueToFunction does not unwrap its
+ // argument. So if the function is actually a wrapper, then
+ // js_ValueToFunction will throw a TypeError ("X is not a function").
+ // Confusingly, this TypeError uses the decompiler, which *will* unwrap the
+ // object to get the wrapped function name out, so the final error will
+ // look something like "SomeFunction() is not a function".)
+ var weirdo = Object.create(alien.eval("new Date"));
+ var e = null;
+ try {
+ weirdo.getTime();
+ } catch (exc) {
+ e = exc;
+ }
+ if (!e) {
+ print("==== TODO but PASSED? ====");
+ print("Bug 753996 unexpectedly passed");
+ }
+
+ // proto is proxy for view of buffer: should throw TypeError
+ //
+ // As of this writing, bug 753996 causes this to throw the *wrong*
+ // TypeError, and in fact it throws a (thisglobal).TypeError instead of
+ // alien.TypeError.
+ var av = Object.create(alien_view);
+ checkThrowTODO(() => av.getUint8(4), alien.TypeError);
+ checkThrowTODO(() => av.buffer, alien.TypeError);
+
+ // view of object whose proto is buffer. This should not work per dherman.
+ // Note that DataView throws a TypeError while TypedArrays create a
+ // zero-length view. Odd though it seems, this is correct: TypedArrays have
+ // a constructor that takes a length argument; DataViews do not. So a
+ // TypedArray will do ToUint32 and end up passing a zero as the
+ // constructor's length argument.
+ buffer = Object.create(buffer1);
+ checkThrow(() => new DataView(buffer), TypeError);
+
+ // view of proxy for buffer
+ av = new DataView(alien_buffer);
+ assertEq(av.getUint8(4), 100);
+ assertEq(Object.getPrototypeOf(av), DataView.prototype);
+
+ // Bug 760904: call another compartment's constructor with an ArrayBuffer
+ // from this compartment.
+ var alien_constructor = alien.DataView;
+ var local_buffer = (new Int8Array(3)).buffer;
+ var foreign_exchange_student = new alien_constructor(local_buffer);
+
+ // gc bug 787775
+ var ab = new ArrayBuffer(4);
+ var dv = new DataView(ab);
+ dv = 1;
+ gc();
+
+ // Bug 1438569.
+ dv = new DataView(new ArrayBuffer(20 * 1024 * 1024));
+ dv.setInt8(dv.byteLength - 10, 99);
+ assertEq(dv.getInt8(dv.byteLength - 10), 99);
+
+ reportCompare(0, 0, 'done.');
+}
+
+test(false);
+
+if (this.SharedArrayBuffer)
+ test(true);
diff --git a/js/src/tests/non262/extensions/decompile-for-of.js b/js/src/tests/non262/extensions/decompile-for-of.js
new file mode 100644
index 0000000000..b99e20a40b
--- /dev/null
+++ b/js/src/tests/non262/extensions/decompile-for-of.js
@@ -0,0 +1,27 @@
+// The decompiler can handle the implicit call to @@iterator in a for-of loop.
+
+var x;
+function check(code, msg) {
+ var s = "no exception thrown";
+ try {
+ eval(code);
+ } catch (exc) {
+ s = exc.message;
+ }
+
+ assertEq(s, msg);
+}
+
+x = {};
+check("for (var v of x) throw fit;", "x is not iterable");
+check("[...x]", "x is not iterable");
+check("Math.hypot(...x)", "x is not iterable");
+
+x[Symbol.iterator] = "potato";
+check("for (var v of x) throw fit;", "x is not iterable");
+
+x[Symbol.iterator] = {};
+check("for (var v of x) throw fit;", "x[Symbol.iterator] is not a function");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/destructure-accessor.js b/js/src/tests/non262/extensions/destructure-accessor.js
new file mode 100644
index 0000000000..e8c57bb93c
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructure-accessor.js
@@ -0,0 +1,75 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'destructure-accessor.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 536472;
+var summary =
+ 'ES5: { get x(v) { } } and { set x(v, v2) { } } should be syntax errors';
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+function expectOk(s)
+{
+ try
+ {
+ eval(s);
+ return;
+ }
+ catch (e)
+ {
+ assertEq(true, false,
+ "expected no error parsing '" + "', got : " + e);
+ }
+}
+
+function expectSyntaxError(s)
+{
+ try
+ {
+ eval(s);
+ throw new Error("no error thrown");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "expected syntax error parsing '" + s + "', got: " + e);
+ }
+}
+
+expectSyntaxError("({ get x([]) { } })");
+expectSyntaxError("({ get x({}) { } })");
+expectSyntaxError("({ get x(a, []) { } })");
+expectSyntaxError("({ get x(a, {}) { } })");
+expectSyntaxError("({ get x([], a) { } })");
+expectSyntaxError("({ get x({}, a) { } })");
+expectSyntaxError("({ get x([], a, []) { } })");
+expectSyntaxError("({ get x([], a, {}) { } })");
+expectSyntaxError("({ get x({}, a, []) { } })");
+expectSyntaxError("({ get x({}, a, {}) { } })");
+
+expectOk("({ get x() { } })");
+
+
+expectSyntaxError("({ set x() { } })");
+expectSyntaxError("({ set x(a, []) { } })");
+expectSyntaxError("({ set x(a, b, c) { } })");
+
+expectOk("({ set x([]) { } })");
+expectOk("({ set x({}) { } })");
+expectOk("({ set x([a]) { } })");
+expectOk("({ set x([a, b]) { } })");
+expectOk("({ set x([a,]) { } })");
+expectOk("({ set x([a, b,]) { } })");
+expectOk("({ set x([, b]) { } })");
+expectOk("({ set x([, b,]) { } })");
+expectOk("({ set x([, b, c]) { } })");
+expectOk("({ set x([, b, c,]) { } })");
+expectOk("({ set x({ a: a }) { } })");
+expectOk("({ set x({ a: a, b: b }) { } })");
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js
new file mode 100644
index 0000000000..da0da55c8a
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js
@@ -0,0 +1,49 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'destructuring-__proto__-shorthand-assignment-before-var.js';
+var BUGNUMBER = 963641;
+var summary = "{ __proto__ } should work as a destructuring assignment pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function objectWithProtoProperty(v)
+{
+ var obj = {};
+ return Object.defineProperty(obj, "__proto__",
+ {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: v
+ });
+}
+
+({ __proto__ } = objectWithProtoProperty(17));
+assertEq(__proto__, 17);
+
+var { __proto__ } = objectWithProtoProperty(42);
+assertEq(__proto__, 42);
+
+function nested()
+{
+ ({ __proto__ } = objectWithProtoProperty(undefined));
+ assertEq(__proto__, undefined);
+
+ var { __proto__ } = objectWithProtoProperty("fnord");
+ assertEq(__proto__, "fnord");
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js
new file mode 100644
index 0000000000..0ab26465f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js
@@ -0,0 +1,49 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'destructuring-__proto__-shorthand-assignment.js';
+var BUGNUMBER = 963641;
+var summary = "{ __proto__ } should work as a destructuring assignment pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function objectWithProtoProperty(v)
+{
+ var obj = {};
+ return Object.defineProperty(obj, "__proto__",
+ {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: v
+ });
+}
+
+var { __proto__ } = objectWithProtoProperty(42);
+assertEq(__proto__, 42);
+
+({ __proto__ } = objectWithProtoProperty(17));
+assertEq(__proto__, 17);
+
+function nested()
+{
+ var { __proto__ } = objectWithProtoProperty("fnord");
+ assertEq(__proto__, "fnord");
+
+ ({ __proto__ } = objectWithProtoProperty(undefined));
+ assertEq(__proto__, undefined);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js b/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js
new file mode 100644
index 0000000000..9e8ec72179
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js
@@ -0,0 +1,50 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'destructuring-__proto__-target--assignment.js';
+var BUGNUMBER = 963641;
+var summary =
+ "{ __proto__: target } should work as a destructuring assignment pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function objectWithProtoProperty(v)
+{
+ var obj = {};
+ return Object.defineProperty(obj, "__proto__",
+ {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: v
+ });
+}
+
+var { __proto__: target } = objectWithProtoProperty(null);
+assertEq(target, null);
+
+({ __proto__: target } = objectWithProtoProperty("aacchhorrt"));
+assertEq(target, "aacchhorrt");
+
+function nested()
+{
+ var { __proto__: target } = objectWithProtoProperty(3.141592654);
+ assertEq(target, 3.141592654);
+
+ ({ __proto__: target } = objectWithProtoProperty(-0));
+ assertEq(target, -0);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js b/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js
new file mode 100644
index 0000000000..283dee3147
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js
@@ -0,0 +1,85 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'destructuring-for-inof-__proto__.js';
+var BUGNUMBER = 963641;
+var summary =
+ "__proto__ should work in destructuring patterns as the targets of " +
+ "for-in/for-of loops";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function objectWithProtoProperty(v)
+{
+ var obj = {};
+ return Object.defineProperty(obj, "__proto__",
+ {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: v
+ });
+}
+
+function* objectWithProtoGenerator(v)
+{
+ yield objectWithProtoProperty(v);
+}
+
+function* identityGenerator(v)
+{
+ yield v;
+}
+
+for (var { __proto__: target } of objectWithProtoGenerator(null))
+ assertEq(target, null);
+
+for ({ __proto__: target } of objectWithProtoGenerator("aacchhorrt"))
+ assertEq(target, "aacchhorrt");
+
+for ({ __proto__: target } of identityGenerator(42))
+ assertEq(target, Number.prototype);
+
+for (var { __proto__: target } in { prop: "kneedle" })
+ assertEq(target, String.prototype);
+
+for ({ __proto__: target } in { prop: "snork" })
+ assertEq(target, String.prototype);
+
+for ({ __proto__: target } in { prop: "ohia" })
+ assertEq(target, String.prototype);
+
+function nested()
+{
+ for (var { __proto__: target } of objectWithProtoGenerator(null))
+ assertEq(target, null);
+
+ for ({ __proto__: target } of objectWithProtoGenerator("aacchhorrt"))
+ assertEq(target, "aacchhorrt");
+
+ for ({ __proto__: target } of identityGenerator(42))
+ assertEq(target, Number.prototype);
+
+ for (var { __proto__: target } in { prop: "kneedle" })
+ assertEq(target, String.prototype);
+
+ for ({ __proto__: target } in { prop: "snork" })
+ assertEq(target, String.prototype);
+
+ for ({ __proto__: target } in { prop: "ohia" })
+ assertEq(target, String.prototype);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-order.js b/js/src/tests/non262/extensions/destructuring-order.js
new file mode 100644
index 0000000000..b1567e6a07
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-order.js
@@ -0,0 +1,150 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var summary = "Order of destructuring, destructuring in the presence of " +
+ "exceptions";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+
+var a = "FAILED", b = "PASSED";
+
+function exceptObj()
+{
+ return { get b() { throw "PASSED"; }, a: "PASSED" };
+}
+
+function partialEvalObj()
+{
+ try
+ {
+ ({a:a, b:b} = exceptObj());
+ throw "FAILED";
+ }
+ catch (ex)
+ {
+ if (ex !== "PASSED")
+ throw "bad exception thrown: " + ex;
+ }
+}
+
+
+var c = "FAILED", d = "FAILED", e = "PASSED", f = "PASSED";
+
+function exceptArr()
+{
+ return ["PASSED", {e: "PASSED", get f() { throw "PASSED"; }}, "FAILED"];
+}
+
+function partialEvalArr()
+{
+ try
+ {
+ [c, {e: d, f: e}, f] = exceptArr();
+ throw "FAILED";
+ }
+ catch (ex)
+ {
+ if (ex !== "PASSED")
+ throw "bad exception thrown: " + ex;
+ }
+}
+
+
+var g = "FAILED", h = "FAILED", i = "FAILED", j = "FAILED", k = "FAILED";
+var _g = "PASSED", _h = "FAILED", _i = "FAILED", _j = "FAILED", _k = "FAILED";
+var order = [];
+
+function objWithGetters()
+{
+ return {
+ get j()
+ {
+ var rv = _j;
+ _g = _h = _i = _j = "FAILED";
+ _k = "PASSED";
+ order.push("j");
+ return rv;
+ },
+ get g()
+ {
+ var rv = _g;
+ _g = _i = _j = _k = "FAILED";
+ _h = "PASSED";
+ order.push("g");
+ return rv;
+ },
+ get i()
+ {
+ var rv = _i;
+ _g = _h = _i = _k = "FAILED";
+ _j = "PASSED";
+ order.push("i");
+ return rv;
+ },
+ get k()
+ {
+ var rv = _k;
+ _g = _h = _i = _j = _k = "FAILED";
+ order.push("k");
+ return rv;
+ },
+ get h()
+ {
+ var rv = _h;
+ _g = _h = _j = _k = "FAILED";
+ _i = "PASSED";
+ order.push("h");
+ return rv;
+ }
+ };
+}
+
+function partialEvalObj2()
+{
+ ({g: g, h: h, i: i, j: j, k: k} = objWithGetters());
+}
+
+try
+{
+ partialEvalObj();
+ if (a !== "PASSED" || b !== "PASSED")
+ throw "FAILED: lhs not mutated correctly during destructuring!\n" +
+ "a == " + a + ", b == " + b;
+
+ partialEvalObj2();
+ if (g !== "PASSED" ||
+ h !== "PASSED" ||
+ i !== "PASSED" ||
+ j !== "PASSED" ||
+ k !== "PASSED")
+ throw "FAILED: order of property accesses wrong!\n" +
+ "order == " + order;
+
+ partialEvalArr();
+ if (c !== "PASSED" || d !== "PASSED" || e !== "PASSED")
+ throw "FAILED: lhs not mutated correctly during destructuring!\n" +
+ "c == " + c +
+ ", d == " + d +
+ ", e == " + e +
+ ", f == " + f ;
+}
+catch (ex)
+{
+ failed = ex;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js b/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js
new file mode 100644
index 0000000000..0d4b6f9c33
--- /dev/null
+++ b/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+"use strict"; // make test fail when limitation below is fixed
+
+var gTestfile = 'element-setting-ToNumber-detaches.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1001547;
+var summary =
+ "Don't assert assigning into memory detached while converting the value to " +
+ "assign into a number";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Technically per current spec the element-sets should throw in strict mode,
+// but we just silently do nothing for now, somewhat due to limitations of our
+// internal MOP (which can't easily say "try this special behavior, else fall
+// back on normal logic"), somewhat because it's consistent with current
+// behavior (as of this test's addition) for out-of-bounds sets.
+
+var ab = new ArrayBuffer(64);
+var ta = new Uint32Array(ab);
+ta[4] = { valueOf() { detachArrayBuffer(ab); return 5; } };
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/empty.txt b/js/src/tests/non262/extensions/empty.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/extensions/empty.txt
diff --git a/js/src/tests/non262/extensions/error-tostring-function.js b/js/src/tests/non262/extensions/error-tostring-function.js
new file mode 100644
index 0000000000..86751c39d8
--- /dev/null
+++ b/js/src/tests/non262/extensions/error-tostring-function.js
@@ -0,0 +1,45 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 894653;
+var summary =
+ "Error.prototype.toString called on function objects should work as on any " +
+ "object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function ErrorToString(v)
+{
+ return Error.prototype.toString.call(v);
+}
+
+// The name property of function objects isn't standardized, so this must be an
+// extension-land test.
+
+assertEq(ErrorToString(function f(){}), "f");
+assertEq(ErrorToString(function g(){}), "g");
+assertEq(ErrorToString(function(){}), "");
+
+var fn1 = function() {};
+fn1.message = "ohai";
+assertEq(ErrorToString(fn1), "fn1: ohai");
+
+var fn2 = function blerch() {};
+fn2.message = "fnord";
+assertEq(ErrorToString(fn2), "blerch: fnord");
+
+var fn3 = function() {};
+fn3.message = "";
+assertEq(ErrorToString(fn3), "fn3");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/extensions/errorcolumnblame.js b/js/src/tests/non262/extensions/errorcolumnblame.js
new file mode 100644
index 0000000000..80c776520c
--- /dev/null
+++ b/js/src/tests/non262/extensions/errorcolumnblame.js
@@ -0,0 +1,79 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 568142;
+var summary = 'error reporting blames column as well as line';
+
+function test(f, col) {
+ var caught = false;
+ try {
+ f();
+ } catch (e) {
+ caught = true;
+ assertEq(e.columnNumber, col);
+ }
+ assertEq(caught, true);
+}
+
+/* Note single hard tab before return! */
+function foo(o) {
+ return o.p;
+}
+test(foo, 2);
+
+//345678901234567890
+test(function(f) { return f.bar; }, 20);
+// 1 2
+//3456789012345678901234567
+test(function(f) { return f(); }, 27);
+/* Cover negative colspan case using for(;;) loop with error in update part. */
+test(function(){
+ // 1 2 3 4
+ //123456789012345678901234567890123456789012
+ eval("function baz() { for (var i = 0; i < 10; i += a.b); assertEq(i !== i, true); }");
+ baz();
+}, 42);
+
+// 1 2 3
+//3456789012345678901234567890123456
+test(function() { var tmp = null; tmp(); }, 35)
+test(function() { var tmp = null; tmp.foo; }, 36)
+
+/* Just a generic 'throw'. */
+test(function() {
+// 1 2
+//345678901234567890
+ foo({}); throw new Error('a');
+}, 20);
+
+/* Be sure to report the right statement */
+test(function() {
+ function f() { return true; }
+ function g() { return false; }
+// 1 2
+//345678901234567890123456789
+ f(); g(); f(); if (f()) a += e;
+}, 29);
+
+// 1 2
+//345678901234567890
+test(function() { e++; }, 19);
+test(function() {print += e; }, 18);
+test(function(){e += 1 }, 17);
+test(function() { print[e]; }, 20);
+test(function() { e[1]; }, 19);
+test(function() { e(); }, 19);
+test(function() { 1(); }, 20);
+test(function() { Object.defineProperty() }, 26);
+
+test(function() {
+// 1 2
+//34567890123456789012
+ function foo() { asdf; } foo()
+}, 22);
+
+reportCompare(0, 0, "ok");
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js b/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js
new file mode 100644
index 0000000000..681a157a8b
--- /dev/null
+++ b/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js
@@ -0,0 +1,281 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 715821;
+var summary = "Implement __define[GS]etter__ using Object.defineProperty";
+
+print(BUGNUMBER + ": " + summary);
+
+/*************
+ * UTILITIES *
+ *************/
+
+function s(desc)
+{
+ if (typeof desc === "undefined")
+ return "<undefined>";
+ assertEq(typeof desc, "object");
+ assertEq(desc !== null, true);
+
+ var str = "<enumerable: <" + desc.enumerable + ">, " +
+ " configurable: <" + desc.configurable + ">,";
+
+ if (desc.hasOwnProperty("value"))
+ {
+ return str +
+ " value: <" + desc.value + ">," +
+ " writable: <" + desc.writable + ">>";
+ }
+
+ return str +
+ " get: <" + desc.get + ">," +
+ " set: <" + desc.set + ">>";
+}
+
+function checkField(field, desc, expected)
+{
+ var present = desc.hasOwnProperty(field);
+ assertEq(present, expected.hasOwnProperty(field),
+ field + " presence mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+ if (present)
+ {
+ assertEq(desc[field], expected[field],
+ field + " value mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+ }
+}
+
+function check(obj, prop, expected)
+{
+ var desc = Object.getOwnPropertyDescriptor(obj, prop);
+ assertEq(typeof desc, typeof expected,
+ "type mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+
+ assertEq(desc.hasOwnProperty("get"), desc.hasOwnProperty("set"),
+ "bad descriptor: " + s(desc));
+ assertEq(desc.hasOwnProperty("value"), desc.hasOwnProperty("writable"),
+ "bad descriptor: " + s(desc));
+
+ assertEq(desc.hasOwnProperty("get"), !desc.hasOwnProperty("value"),
+ "bad descriptor: " + s(desc));
+
+ checkField("get", desc, expected);
+ checkField("set", desc, expected);
+ checkField("value", desc, expected);
+ checkField("writable", desc, expected);
+ checkField("enumerable", desc, expected);
+ checkField("configurable", desc, expected);
+}
+
+function expectTypeError(f)
+{
+ try
+ {
+ f();
+ throw new Error("no error thrown");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error thrown: got " + e + ", not a TypeError");
+ }
+}
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Adding a new getter, overwriting an existing one
+
+function g1() { }
+var gobj = {};
+gobj.__defineGetter__("foo", g1);
+check(gobj, "foo", { get: g1, set: undefined, enumerable: true, configurable: true });
+
+function g2() { }
+gobj.__defineGetter__("foo", g2);
+check(gobj, "foo", { get: g2, set: undefined, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a new setter, overwriting an existing one
+
+function s1() { }
+var sobj = {};
+sobj.__defineSetter__("bar", s1);
+check(sobj, "bar", { get: undefined, set: s1, enumerable: true, configurable: true });
+
+function s2() { }
+sobj.__defineSetter__("bar", s2);
+check(sobj, "bar", { get: undefined, set: s2, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a new getter, then adding a setter
+// Changing an existing accessor's enumerability, then "null"-changing the accessor
+// Changing an accessor's configurability, then "null"-changing and real-changing the accessor
+
+function g3() { }
+var gsobj = {};
+gsobj.__defineGetter__("baz", g3);
+check(gsobj, "baz", { get: g3, set: undefined, enumerable: true, configurable: true });
+
+function s3() { }
+gsobj.__defineSetter__("baz", s3);
+check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
+
+Object.defineProperty(gsobj, "baz", { enumerable: false });
+check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true });
+
+gsobj.__defineGetter__("baz", g3);
+check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
+
+Object.defineProperty(gsobj, "baz", { enumerable: false });
+check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true });
+
+gsobj.__defineSetter__("baz", s3);
+check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
+
+Object.defineProperty(gsobj, "baz", { configurable: false });
+expectTypeError(function() { gsobj.__defineSetter__("baz", s2); });
+expectTypeError(function() { gsobj.__defineSetter__("baz", s3); });
+check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a new setter, then adding a getter
+// Changing an existing accessor's enumerability, then "null"-changing the accessor
+// Changing an accessor's configurability, then "null"-changing and real-changing the accessor
+
+function s4() { }
+var sgobj = {};
+sgobj.__defineSetter__("baz", s4);
+check(sgobj, "baz", { get: undefined, set: s4, enumerable: true, configurable: true });
+
+function g4() { }
+sgobj.__defineGetter__("baz", g4);
+check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
+
+Object.defineProperty(sgobj, "baz", { enumerable: false });
+check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true });
+
+sgobj.__defineSetter__("baz", s4);
+check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
+
+Object.defineProperty(sgobj, "baz", { enumerable: false });
+check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true });
+
+sgobj.__defineSetter__("baz", s4);
+check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
+
+Object.defineProperty(sgobj, "baz", { configurable: false });
+expectTypeError(function() { sgobj.__defineGetter__("baz", g3); });
+expectTypeError(function() { sgobj.__defineSetter__("baz", s4); });
+check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a getter over a writable data property
+
+function g5() { }
+var gover = { quux: 17 };
+check(gover, "quux", { value: 17, writable: true, enumerable: true, configurable: true });
+
+gover.__defineGetter__("quux", g5);
+check(gover, "quux", { get: g5, set: undefined, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a setter over a writable data property
+
+function s5() { }
+var sover = { quux: 17 };
+check(sover, "quux", { value: 17, writable: true, enumerable: true, configurable: true });
+
+sover.__defineSetter__("quux", s5);
+check(sover, "quux", { get: undefined, set: s5, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a getter over a non-writable data property
+
+function g6() { }
+var gnover = { eit: 17 };
+check(gnover, "eit", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(gnover, "eit", { writable: false });
+check(gnover, "eit", { value: 17, writable: false, enumerable: true, configurable: true });
+
+gnover.__defineGetter__("eit", g6);
+check(gnover, "eit", { get: g6, set: undefined, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a setter over a non-writable data property
+
+function s6() { }
+var snover = { eit: 17 };
+check(snover, "eit", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(snover, "eit", { writable: false });
+check(snover, "eit", { value: 17, writable: false, enumerable: true, configurable: true });
+
+snover.__defineSetter__("eit", s6);
+check(snover, "eit", { get: undefined, set: s6, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a getter over a non-configurable, writable data property
+
+function g7() { }
+var gncover = { moo: 17 };
+check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(gncover, "moo", { configurable: false });
+check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
+
+expectTypeError(function() { gncover.__defineGetter__("moo", g7); });
+check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a setter over a non-configurable, writable data property
+
+function s7() { }
+var sncover = { moo: 17 };
+check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(sncover, "moo", { configurable: false });
+check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
+
+expectTypeError(function() { sncover.__defineSetter__("moo", s7); });
+check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a getter over a non-configurable, non-writable data property
+
+function g8() { }
+var gncwover = { fwoosh: 17 };
+check(gncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(gncwover, "fwoosh", { writable: false, configurable: false });
+check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
+
+expectTypeError(function() { gncwover.__defineGetter__("fwoosh", g7); });
+check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a setter over a non-configurable, non-writable data property
+
+function s8() { }
+var sncwover = { fwoosh: 17 };
+check(sncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(sncwover, "fwoosh", { writable: false, configurable: false });
+check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
+
+expectTypeError(function() { sncwover.__defineSetter__("fwoosh", s7); });
+check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js b/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js
new file mode 100644
index 0000000000..017ccf1c74
--- /dev/null
+++ b/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 604504;
+var summary = "eval called from a native function is indirect";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var originalEval = eval;
+
+var global = this;
+var directCheckCode = "this === global";
+
+function testArrayGeneric()
+{
+ var global = "psych!";
+ var eval = Array.map;
+
+ var mapped = eval([directCheckCode], originalEval);
+ assertEq(mapped[0], true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/expression-closure-syntax.js b/js/src/tests/non262/extensions/expression-closure-syntax.js
new file mode 100644
index 0000000000..84b3cc8fe9
--- /dev/null
+++ b/js/src/tests/non262/extensions/expression-closure-syntax.js
@@ -0,0 +1,62 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1416337;
+var summary =
+ "Expression closure syntax is only permitted for functions that constitute " +
+ "entire AssignmentExpressions, not PrimaryExpressions that are themselves " +
+ "components of larger binary expressions";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+{
+ function assertThrowsSyntaxError(code)
+ {
+ function testOne(replacement)
+ {
+ var x, rv;
+ try
+ {
+ rv = eval(code.replace("@@@", replacement));
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "should have thrown a SyntaxError, instead got: " + e);
+ return;
+ }
+
+ assertEq(true, false, "should have thrown, instead returned " + rv);
+ }
+
+ testOne("function");
+ testOne("async function");
+ }
+
+ assertThrowsSyntaxError("x = ++@@@() 1");
+ assertThrowsSyntaxError("x = delete @@@() 1");
+ assertThrowsSyntaxError("x = new @@@() 1");
+ assertThrowsSyntaxError("x = void @@@() 1");
+ assertThrowsSyntaxError("x = +@@@() 1");
+ assertThrowsSyntaxError("x = 1 + @@@() 1");
+ assertThrowsSyntaxError("x = null != @@@() 1");
+ assertThrowsSyntaxError("x = null != @@@() 0 ? 1 : a => {}");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} !== null");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}.toString");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}['toString']");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}``");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}()");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}++");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} || 0");
+ assertThrowsSyntaxError("x = 0 || @@@() 0 ? 1 : a => {}");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} && true");
+ assertThrowsSyntaxError("x = true && @@@() 0 ? 1 : a => {}");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js b/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js
new file mode 100644
index 0000000000..96689b0152
--- /dev/null
+++ b/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js
@@ -0,0 +1,105 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 619283;
+var summary =
+ "ECMAScript built-in methods that immediately throw when |this| is " +
+ "|undefined| or |null| (due to CheckObjectCoercible, ToObject, or ToString)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// This test fills out for the non-standard methods which
+// non262/misc/builtin-methods-reject-null-undefined-this.js declines to test.
+
+var ClassToMethodMap =
+ {
+ Object: ["toSource"],
+ Function: ["toSource"],
+ Array: ["toSource"],
+ String: ["toSource"],
+ Boolean: ["toSource"],
+ Number: ["toSource"],
+ Date: ["toSource"],
+ RegExp: ["toSource"],
+ Error: ["toSource"],
+ };
+
+var badThisValues = [null, undefined];
+
+function testMethod(Class, className, method)
+{
+ var expr;
+
+ // Try out explicit this values
+ for (var i = 0, sz = badThisValues.length; i < sz; i++)
+ {
+ var badThis = badThisValues[i];
+
+ expr = className + ".prototype." + method + ".call(" + badThis + ")";
+ try
+ {
+ Class.prototype[method].call(badThis);
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+
+ expr = className + ".prototype." + method + ".apply(" + badThis + ")";
+ try
+ {
+ Class.prototype[method].apply(badThis);
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+ }
+
+ // ..and for good measure..
+
+ expr = "(0, " + className + ".prototype." + method + ")()"
+ try
+ {
+ // comma operator to call GetValue() on the method and de-Reference it
+ (0, Class.prototype[method])();
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+}
+
+for (var className in ClassToMethodMap)
+{
+ var Class = this[className];
+
+ var methodNames = ClassToMethodMap[className];
+ for (var i = 0, sz = methodNames.length; i < sz; i++)
+ {
+ var method = methodNames[i];
+ testMethod(Class, className, method);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/file-mapped-arraybuffers.js b/js/src/tests/non262/extensions/file-mapped-arraybuffers.js
new file mode 100644
index 0000000000..d69161554f
--- /dev/null
+++ b/js/src/tests/non262/extensions/file-mapped-arraybuffers.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function viewToString(view)
+{
+ return String.fromCharCode.apply(null, view);
+}
+
+function test() {
+ var filename = "file-mapped-arraybuffers.txt";
+ var buffer = createMappedArrayBuffer(filename);
+ var view = new Uint8Array(buffer);
+ assertEq(viewToString(view), "01234567abcdefghijkl");
+
+ var buffer2 = createMappedArrayBuffer(filename, 8);
+ view = new Uint8Array(buffer2);
+ assertEq(viewToString(view), "abcdefghijkl");
+
+ var buffer3 = createMappedArrayBuffer(filename, 0, 8);
+ view = new Uint8Array(buffer3);
+ assertEq(viewToString(view), "01234567");
+
+ // Test detaching during subarray creation.
+ var nasty = {
+ valueOf: function () {
+ print("detaching...");
+ serialize(buffer3, [buffer3]);
+ print("detached");
+ return 3000;
+ }
+ };
+
+ var a = new Uint8Array(buffer3);
+ assertThrowsInstanceOf(() => {
+ var aa = a.subarray(0, nasty);
+ for (i = 0; i < 3000; i++)
+ aa[i] = 17;
+ }, TypeError);
+
+ // Check that invalid sizes and offsets are caught
+ assertThrowsInstanceOf(() => createMappedArrayBuffer("empty.txt", 8), RangeError);
+ assertThrowsInstanceOf(() => createMappedArrayBuffer("empty.txt", 0, 8), Error);
+}
+
+if (getBuildConfiguration()["mapped-array-buffer"])
+ test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt b/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt
new file mode 100644
index 0000000000..4289a17b8f
--- /dev/null
+++ b/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt
@@ -0,0 +1 @@
+01234567abcdefghijkl \ No newline at end of file
diff --git a/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js b/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js
new file mode 100644
index 0000000000..9f6fd6467c
--- /dev/null
+++ b/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js
@@ -0,0 +1,130 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile =
+ "for-loop-with-lexical-declaration-and-nested-function-statement.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1149797;
+var summary =
+ "Don't assert when freshening the scope chain for a for-loop whose head " +
+ "contains a lexical declaration, where the loop body might add more " +
+ "bindings at runtime";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+for (let x = 0; x < 9; ++x) {
+ function q1() {}
+}
+
+{
+ for (let x = 0; x < 9; ++x) {
+ function q2() {}
+ }
+}
+
+function f1()
+{
+ for (let x = 0; x < 9; ++x) {
+ function q3() {}
+ }
+}
+f1();
+
+function f2()
+{
+ {
+ for (let x = 0; x < 9; ++x) {
+ function q4() {}
+ }
+ }
+}
+f2();
+
+for (let x = 0; x < 9; ++x)
+{
+ // deliberately inside a block statement
+ function q5() {}
+}
+
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ function q6() {}
+ }
+}
+
+function g1()
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ function q7() {}
+ }
+}
+g1();
+
+function g2()
+{
+ {
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ function q8() {}
+ }
+ }
+}
+g2();
+
+for (let x = 0; x < 9; ++x) {
+ (function() {
+ eval("function q9() {}");
+ })();
+}
+
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() {
+ eval("function q10() {}");
+ })();
+ }
+}
+
+function h1()
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() {
+ eval("function q11() {}");
+ })();
+ }
+}
+h1();
+
+function h2()
+{
+ {
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() { eval("function q12() {}"); })();
+ }
+ }
+}
+h2();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js b/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js
new file mode 100644
index 0000000000..77eb99108a
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function innermost() { return arguments.callee.caller; }
+function nest() { return eval("innermost();"); }
+function nest2() { return nest(); }
+
+assertEq(nest2(), nest);
+
+var innermost = function innermost() { return arguments.callee.caller.caller; };
+
+assertEq(nest2(), nest2);
+
+function nestTwice() { return eval("eval('innermost();');"); }
+var nest = nestTwice;
+
+assertEq(nest2(), nest2);
+
+function innermostEval() { return eval("arguments.callee.caller"); }
+var innermost = innermostEval;
+
+assertEq(nest2(), nestTwice);
+
+function innermostEvalTwice() { return eval('eval("arguments.callee.caller");'); }
+var innermost = innermostEvalTwice;
+
+assertEq(nest2(), nestTwice);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-caller-strict-cross-global.js b/js/src/tests/non262/extensions/function-caller-strict-cross-global.js
new file mode 100644
index 0000000000..d76bcccda5
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-caller-strict-cross-global.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var g1 = newGlobal();
+g1.evaluate("function f() { return f.caller; }");
+
+var g2 = newGlobal();
+g2.f = g1.f;
+
+assertEq(g2.evaluate("function g() { 'use strict'; return f(); } g()"), null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-definition-with.js b/js/src/tests/non262/extensions/function-definition-with.js
new file mode 100644
index 0000000000..2277ad45fc
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-definition-with.js
@@ -0,0 +1,56 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 577325;
+var summary = 'Implement the ES5 algorithm for processing function statements';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var called, obj;
+
+function inFile1() { return "in file"; }
+called = false;
+obj = { set inFile1(v) { called = true; } };
+with (obj) {
+ function inFile1() { return "in file in with"; };
+}
+assertEq(inFile1(), "in file in with");
+assertEq("set" in Object.getOwnPropertyDescriptor(obj, "inFile1"), true);
+assertEq(called, false);
+
+evaluate("function notInFile1() { return 'not in file'; }");
+called = false;
+obj = { set notInFile1(v) { called = true; return "not in file 2"; } };
+with (obj) {
+ function notInFile1() { return "not in file in with"; };
+}
+assertEq(notInFile1(), "not in file in with");
+assertEq("set" in Object.getOwnPropertyDescriptor(obj, "notInFile1"), true);
+assertEq(called, false);
+
+function inFile2() { return "in file 1"; }
+called = false;
+obj =
+ Object.defineProperty({}, "inFile2",
+ { value: 42, configurable: false, enumerable: false });
+with (obj) {
+ function inFile2() { return "in file 2"; };
+}
+assertEq(inFile2(), "in file 2");
+assertEq(obj.inFile2, 42);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/function-properties.js b/js/src/tests/non262/extensions/function-properties.js
new file mode 100644
index 0000000000..9585322ef0
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-properties.js
@@ -0,0 +1,21 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function foo()
+{
+ assertEq(foo.arguments.length, 0);
+ assertEq(foo.caller, null);
+}
+
+assertEq(foo.arguments, null);
+assertEq(foo.caller, null);
+foo();
+assertEq(foo.arguments, null);
+assertEq(foo.caller, null);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js b/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js
new file mode 100644
index 0000000000..91ee2d2033
--- /dev/null
+++ b/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 837630;
+var summary ='__proto__ should show up with O.getOwnPropertyNames(O.prototype)';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var keys = Object.getOwnPropertyNames(Object.prototype);
+assertEq(keys.indexOf("__proto__") >= 0, true,
+ "should have gotten __proto__ as a property of Object.prototype " +
+ "(got these properties: " + keys + ")");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/getset-001.js b/js/src/tests/non262/extensions/getset-001.js
new file mode 100644
index 0000000000..928bfd0f03
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-001.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+function TestObject ()
+{
+ /* A warm, dry place for properties and methods to live */
+}
+
+TestObject.prototype._y = "<initial y>";
+
+Object.defineProperty(TestObject.prototype, "y",
+{
+ enumerable: true, configurable: true,
+ get: function get_y ()
+ {
+ var rv;
+ if (typeof this._y == "string")
+ rv = "got " + this._y;
+ else
+ rv = this._y;
+ return rv;
+ },
+ set: function set_y (newVal) { this._y = newVal; }
+});
+
+
+test(new TestObject());
+
+function test(t)
+{
+ printStatus ("Basic Getter/ Setter test");
+ reportCompare ("<initial y>", t._y, "y prototype check");
+
+ reportCompare ("got <initial y>", t.y, "y getter, before set");
+
+ t.y = "new y";
+ reportCompare ("got new y", t.y, "y getter, after set");
+
+ t.y = 2;
+ reportCompare (2, t.y, "y getter, after numeric set");
+
+ var d = new Date();
+ t.y = d;
+ reportCompare (d, t.y, "y getter, after date set");
+
+}
diff --git a/js/src/tests/non262/extensions/getset-003.js b/js/src/tests/non262/extensions/getset-003.js
new file mode 100644
index 0000000000..55c9c99785
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-003.js
@@ -0,0 +1,186 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.prop getter/setter
+ * Note: this is a non-ECMA extension to the language.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.prop getter/setter';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+Object.defineProperty(obj, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+
+ status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.defineProperty(Object.prototype, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+
+ obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+Object.defineProperty(TestObject.prototype, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+ TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-004.js b/js/src/tests/non262/extensions/getset-004.js
new file mode 100644
index 0000000000..e76b9263f0
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-004.js
@@ -0,0 +1,174 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__defineSetter__(), obj.__defineGetter__()
+ * Note: this is a non-ECMA language extension
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.__defineSetter__(), obj.__defineGetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+obj.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+
+status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+Object.prototype.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+
+obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+TestObject.prototype.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-005.js b/js/src/tests/non262/extensions/getset-005.js
new file mode 100644
index 0000000000..a0694a892f
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-005.js
@@ -0,0 +1,183 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__defineSetter__(), obj.__defineGetter__()
+ * Note: this is a non-ECMA language extension
+ *
+ * This test is the same as getset-004.js, except that here we
+ * store the getter/setter functions in global variables.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.__defineSetter__(), obj.__defineGetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnName = 'name';
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// The getter/setter functions we'll use in all three sections below -
+var cnNameSetter = function(newValue) {this._name=newValue; this.nameSETS++;};
+var cnNameGetter = function() {this.nameGETS++; return this._name;};
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__(cnName, cnNameSetter);
+obj.__defineGetter__(cnName, cnNameGetter);
+
+status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__(cnName, cnNameSetter);
+Object.prototype.__defineGetter__(cnName, cnNameGetter);
+
+obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__(cnName, cnNameSetter);
+TestObject.prototype.__defineGetter__(cnName, cnNameGetter);
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-006.js b/js/src/tests/non262/extensions/getset-006.js
new file mode 100644
index 0000000000..e7fe8c4212
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-006.js
@@ -0,0 +1,157 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__lookupGetter__(), obj.__lookupSetter__()
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=71992
+ *
+ * Brendan: "I see no need to provide more than the minimum:
+ * o.__lookupGetter__('p') returns the getter function for o.p,
+ * or undefined if o.p has no getter. Users can wrap and layer."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 71992;
+var summary = 'Testing obj.__lookupGetter__(), obj.__lookupSetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnName = 'name';
+var cnColor = 'color';
+var cnNonExistingProp = 'ASDF_#_$%';
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var cnRED = 'red';
+var obj = {};
+var obj2 = {};
+var s;
+
+
+// The only setter and getter functions we'll use in the three sections below -
+var cnNameSetter = function(newValue) {this._name=newValue; this.nameSETS++;};
+var cnNameGetter = function() {this.nameGETS++; return this._name;};
+
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__(cnName, cnNameSetter);
+obj.__defineGetter__(cnName, cnNameGetter);
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status ='In SECTION1 of test; looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION1 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION1 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__(cnName, cnNameSetter);
+Object.prototype.__defineGetter__(cnName, cnNameGetter);
+
+obj = new Object();
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status = 'In SECTION2 of test looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION2 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION2 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__(cnName, cnNameSetter);
+TestObject.prototype.__defineGetter__(cnName, cnNameGetter);
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status = 'In SECTION3 of test looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION3 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION3 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/inc-dec-functioncall.js b/js/src/tests/non262/extensions/inc-dec-functioncall.js
new file mode 100644
index 0000000000..b4de03c6c0
--- /dev/null
+++ b/js/src/tests/non262/extensions/inc-dec-functioncall.js
@@ -0,0 +1,90 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 609756;
+var summary =
+ "Perform ToNumber on the result of the |fun()| in |fun()++| before " +
+ "throwing";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var hadSideEffect;
+
+function f()
+{
+ return { valueOf: function() { hadSideEffect = true; return 0; } };
+}
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { f()++; }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ f()++;
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { f()--; }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ f()--;
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { ++f(); }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ ++f();
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { --f(); }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ --f();
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js b/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js
new file mode 100644
index 0000000000..260948cfed
--- /dev/null
+++ b/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js
@@ -0,0 +1,99 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1204027;
+var summary =
+ "Escape sequences aren't allowed in bolded grammar tokens (that is, in " +
+ "keywords, possibly contextual keywords)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var badModules =
+ [
+ "\\u0069mport f from 'g'",
+ "i\\u006dport g from 'h'",
+ "import * \\u0061s foo",
+ "import {} fro\\u006d 'bar'",
+ "import { x \\u0061s y } from 'baz'",
+
+ "\\u0065xport function f() {}",
+ "e\\u0078port function g() {}",
+ "export * fro\\u006d 'fnord'",
+ "export d\\u0065fault var x = 3;",
+ "export { q } fro\\u006d 'qSupplier';",
+
+ ];
+
+if (typeof parseModule === "function")
+{
+ for (var module of badModules)
+ {
+ assertThrowsInstanceOf(() => parseModule(module), SyntaxError,
+ "bad behavior for: " + module);
+ }
+}
+
+if (typeof Reflect.parse === "function")
+{
+ var twoStatementAST =
+ Reflect.parse(`let x = 0;
+ export { x } /* ASI should trigger here */
+ fro\\u006D`,
+ { target: "module" });
+
+ var statements = twoStatementAST.body;
+ assertEq(statements.length, 3,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "VariableDeclaration");
+ assertEq(statements[1].type, "ExportDeclaration");
+ assertEq(statements[2].type, "ExpressionStatement");
+ assertEq(statements[2].expression.name, "from");
+
+ var oneStatementAST =
+ Reflect.parse(`export { x } /* no ASI here */
+ from 'foo'`,
+ { target: "module" });
+
+ assertEq(oneStatementAST.body.length, 1);
+ assertEq(oneStatementAST.body[0].type, "ExportDeclaration");
+
+ twoStatementAST =
+ Reflect.parse(`export { x } from "bar"
+ /bar/g`,
+ { target: "module" });
+
+ statements = twoStatementAST.body;
+ assertEq(statements.length, 2,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "ExportDeclaration");
+ assertEq(statements[1].type, "ExpressionStatement");
+ assertEq(statements[1].expression.type, "Literal");
+ assertEq(statements[1].expression.value.toString(), "/bar/g");
+
+ twoStatementAST =
+ Reflect.parse(`export * from "bar"
+ /bar/g`,
+ { target: "module" });
+
+ statements = twoStatementAST.body;
+ assertEq(statements.length, 2,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "ExportDeclaration");
+ assertEq(statements[1].type, "ExpressionStatement");
+ assertEq(statements[1].expression.type, "Literal");
+ assertEq(statements[1].expression.value.toString(), "/bar/g");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/keyword-unescaped-requirement.js b/js/src/tests/non262/extensions/keyword-unescaped-requirement.js
new file mode 100644
index 0000000000..20d3555e3d
--- /dev/null
+++ b/js/src/tests/non262/extensions/keyword-unescaped-requirement.js
@@ -0,0 +1,43 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1204027;
+var summary =
+ "Escape sequences aren't allowed in bolded grammar tokens (that is, in " +
+ "keywords, possibly contextual keywords)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var randomExtensions =
+ [
+ "for \\u0065ach (var x in []);",
+ "for e\\u0061ch (var x in []);",
+ "[0 for \\u0065ach (var x in [])]",
+ "[0 for e\\u0061ch (var x in [])]",
+ "(0 for \\u0065ach (var x in []))",
+ "(0 for e\\u0061ch (var x in []))",
+
+ // Soon to be not an extension, maybe...
+ "(for (x \\u006ff [1]) x)",
+ "(for (x o\\u0066 [1]) x)",
+ ];
+
+for (var extension of randomExtensions)
+{
+ assertThrowsInstanceOf(() => Function(extension), SyntaxError,
+ "bad behavior for: " + extension);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/mutable-proto-special-form.js b/js/src/tests/non262/extensions/mutable-proto-special-form.js
new file mode 100644
index 0000000000..b196507f25
--- /dev/null
+++ b/js/src/tests/non262/extensions/mutable-proto-special-form.js
@@ -0,0 +1,91 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 948583;
+var summary =
+ "Make __proto__ in object literals a special form not influenced by " +
+ "|Object.prototype|";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var passed = true;
+
+function performProtoTests(msg)
+{
+ print("Testing " + msg);
+ assertEq(passed, true, "passed wrong at start of test set");
+
+ assertEq(Object.getPrototypeOf({ __proto__: null }), null);
+ assertEq(Object.getPrototypeOf({ __proto__: undefined }), Object.prototype);
+ assertEq(Object.getPrototypeOf({ __proto__: 17 }), Object.prototype);
+
+ var obj = {};
+ assertEq(Object.getPrototypeOf({ __proto__: obj }), obj);
+
+ assertEq(passed, true, "passed wrong at end of test set");
+ print("Tests of " + msg + " passed!");
+}
+
+function poisonProto(obj)
+{
+ Object.defineProperty(obj, "__proto__",
+ {
+ configurable: true,
+ enumerable: true,
+ set: function(v) { passed = false; },
+ });
+}
+
+performProtoTests("initial behavior");
+
+var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
+var setProto = desc.set;
+delete Object.prototype.__proto__;
+
+performProtoTests("behavior after Object.prototype.__proto__ deletion");
+
+Object.defineProperty(Object.prototype, "__proto__",
+ {
+ configurable: true,
+ enumerable: false,
+ set: function(v) { passed = false; },
+ });
+
+performProtoTests("behavior after making Object.prototype.__proto__ a " +
+ "custom setter");
+
+Object.defineProperty(Object.prototype, "__proto__", { set: undefined });
+
+performProtoTests("behavior after making Object.prototype.__proto__'s " +
+ "[[Set]] === undefined");
+
+try
+{
+ var superProto = Object.create(null);
+ poisonProto(superProto);
+ setProto.call(Object.prototype, superProto);
+
+ performProtoTests("behavior after mutating Object.prototype.[[Prototype]]");
+
+ // Note: The handler below will have to be updated to exempt a scriptable
+ // getPrototypeOf trap (to instead consult the target whose [[Prototype]]
+ // is safely non-recursive), if we ever implement one.
+ var death = new Proxy(Object.create(null),
+ new Proxy({}, { get: function() { passed = false; } }));
+
+ setProto.call(Object.prototype, death);
+
+ performProtoTests("behavior after making Object.prototype.[[Prototype]] a " +
+ "proxy that throws for any access");
+}
+catch (e) {}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js b/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js
new file mode 100644
index 0000000000..7dfab04589
--- /dev/null
+++ b/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js
@@ -0,0 +1,85 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 616294;
+var summary =
+ "|delete x| inside a function in eval code, where that eval code includes " +
+ "|var x| at top level, actually does delete the binding for x";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var f;
+
+function testOuterLet()
+{
+ return eval("let x; (function() { return delete x; })");
+}
+
+f = testOuterLet();
+
+assertEq(f(), false); // can't delete lexical declarations => false
+
+
+function testOuterForLet()
+{
+ return eval("for (let x; false; ); (function() { return delete x; })");
+}
+
+f = testOuterForLet();
+
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterForInLet()
+{
+ return eval("for (let x in {}); (function() { return delete x; })");
+}
+
+f = testOuterForInLet();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterNestedVarInForLet()
+{
+ return eval("for (let q = 0; q < 5; q++) { var x; } (function() { return delete x; })");
+}
+
+f = testOuterNestedVarInForLet();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // there => true
+
+
+function testArgumentShadowLet()
+{
+ return eval("let x; (function(x) { return delete x; })");
+}
+
+f = testArgumentShadowLet();
+
+assertEq(f(), false); // non-configurable argument => false
+
+
+function testFunctionLocal()
+{
+ return eval("(function() { let x; return delete x; })");
+}
+
+f = testFunctionLocal();
+
+assertEq(f(), false); // defined by function code => not configurable => false
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/new-cross-compartment.js b/js/src/tests/non262/extensions/new-cross-compartment.js
new file mode 100644
index 0000000000..cae4b187df
--- /dev/null
+++ b/js/src/tests/non262/extensions/new-cross-compartment.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1178653;
+var summary =
+ "|new| on a cross-compartment wrapper to a non-constructor shouldn't assert";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var g = newGlobal();
+
+var otherStr = new g.String("foo");
+assertEq(otherStr instanceof g.String, true);
+assertEq(otherStr.valueOf(), "foo");
+
+try
+{
+ var constructor = g.parseInt;
+ new constructor();
+ throw new Error("no error thrown");
+}
+catch (e)
+{
+ // NOTE: not |g.TypeError|, because |new| itself throws because
+ // |!IsConstructor(constructor)|.
+ assertEq(e instanceof TypeError, true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/new-parenthesization.js b/js/src/tests/non262/extensions/new-parenthesization.js
new file mode 100644
index 0000000000..a3aebf383f
--- /dev/null
+++ b/js/src/tests/non262/extensions/new-parenthesization.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jesse Ruderman
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 521456;
+var summary =
+ 'Incorrect decompilation of new (eval(v)).s and new (f.apply(2)).s';
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+function foo(c) { return new (eval(c)).s; }
+function bar(f) { var a = new (f.apply(2).s); return a; }
+
+assertEq(bar.toString().search(/new\s+f/), -1);
+assertEq(foo.toString().search(/new\s+eval/), -1);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js b/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js
new file mode 100644
index 0000000000..8f2d47a11d
--- /dev/null
+++ b/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js
@@ -0,0 +1,94 @@
+// Tests that newer-type functions (i.e. anything not defined by regular function declarations and
+// expressions) throw when accessing their 'arguments' and 'caller' properties.
+
+// 9.2.7 (AddRestrictedFunctionProperties) defines accessors on Function.prototype which throw on
+// every 'get' and 'set' of 'caller' and 'arguments'.
+// Additionally, 16.2 (Forbidden Extensions) forbids adding properties to all non-"legacy" function
+// declarations and expressions. This creates the effect that all newer-style functions act like
+// strict-mode functions when accessing their 'caller' and 'arguments' properties.
+
+const container = {
+ async asyncMethod() {},
+ *genMethod() {},
+ method() {},
+ get getterMethod() {},
+ set setterMethod(x) {},
+};
+
+function* genDecl(){}
+async function asyncDecl(){}
+class classDecl {}
+class extClassDecl extends Object {}
+class classDeclExplicitCtor { constructor(){} }
+class extClassDeclExplicitCtor extends Object { constructor(){} }
+
+const functions = [
+ // Declarations
+ genDecl,
+ asyncDecl,
+ classDecl,
+ extClassDecl,
+ classDeclExplicitCtor,
+ extClassDeclExplicitCtor,
+
+ // Expressions
+ async function(){},
+ function*(){},
+ () => {},
+ async () => {},
+ class {},
+ class extends Object {},
+ class { constructor(){} },
+ class extends Object { constructor(){} },
+
+ // Methods
+ container.asyncMethod,
+ container.genMethod,
+ container.method,
+ Object.getOwnPropertyDescriptor(container, "getterMethod").get,
+ Object.getOwnPropertyDescriptor(container, "setterMethod").set,
+
+ // Bound functions
+ function(){}.bind(),
+
+ // Built-ins (native and self-hosted)
+ Function,
+ Function.prototype.bind,
+];
+
+const supportsAsyncGenerator = (function() {
+ try {
+ eval("async function* f(){}");
+ return true;
+ } catch (e) {
+ return false;
+ }
+})();
+
+if (supportsAsyncGenerator) {
+eval(`
+ async function* asyncGenDecl(){}
+
+ functions.push(asyncGenDecl);
+ functions.push(async function*(){});
+ functions.push({async* asyncGenerator(){}}.asyncGenerator);
+`);
+}
+
+functions.forEach(f => {
+ checkArgumentsAccess(f);
+ checkCallerAccess(f);
+});
+
+function checkArgumentsAccess(f) {
+ assertThrowsInstanceOf(() => f.arguments, TypeError,
+ `Expected 'arguments' property access to throw on ${f}`);
+}
+
+function checkCallerAccess(f) {
+ assertThrowsInstanceOf(() => f.caller, TypeError,
+ `Expected 'caller' property access to throw on ${f}`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/non_syntactic.js b/js/src/tests/non262/extensions/non_syntactic.js
new file mode 100644
index 0000000000..941229df39
--- /dev/null
+++ b/js/src/tests/non262/extensions/non_syntactic.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Check references to someVar, both as a variable and on |this|, in
+// various evaluation contexts.
+var someVar = 1;
+
+// Top level.
+assertEq(someVar, 1);
+assertEq(this.someVar, 1);
+
+// Inside evaluate.
+evaluate("assertEq(someVar, 1);");
+evaluate("assertEq(this.someVar, 1);");
+
+// With an object on the scope, no shadowing.
+var someObject = { someOtherField: 2 };
+var evalOpt = { envChainObject: someObject };
+evaluate("assertEq(someVar, 1);", evalOpt);
+evaluate("assertEq(this.someVar, undefined);", evalOpt);
+
+// With an object on the scope, shadowing global.
+someObject = { someVar: 2 };
+evalOpt = { envChainObject: someObject };
+var alsoSomeObject = someObject;
+evaluate("assertEq(someVar, 2);", evalOpt);
+evaluate("assertEq(this.someVar, 2);", evalOpt);
+evaluate("assertEq(this, alsoSomeObject);", evalOpt);
+
+// With an object on the scope, inside a function.
+evaluate("(function() { assertEq(someVar, 2);})()", evalOpt);
+evaluate("(function() { assertEq(this !== alsoSomeObject, true);})()", evalOpt);
+evaluate("(function() { assertEq(this.someVar, 1);})()", evalOpt);
+
+// `this` is ShellWindowProxy instead of GlobalObject, and it's allowed.
+evaluate("assertEq(someVar, 1);", { envChainObject: this });
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/object-toSource-override-on-getter.js b/js/src/tests/non262/extensions/object-toSource-override-on-getter.js
new file mode 100644
index 0000000000..f79499a52f
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-override-on-getter.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!Function.prototype.toSource)
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+let x = {};
+let y = function() {};
+y.toSource = function() {
+ return "[012345678901234567890123456789]";
+};
+Object.defineProperty(x, "", {enumerable: true, get: y});
+assertEq(x.toSource(), "({'':[012345678901234567890123456789]})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/object-toSource-undefined-getter.js b/js/src/tests/non262/extensions/object-toSource-undefined-getter.js
new file mode 100644
index 0000000000..7c8e3289a4
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-undefined-getter.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var desc = { get: undefined, set: undefined, configurable: true, enumerable: true };
+var obj = Object.defineProperty({}, "prop", desc);
+assertEq(obj.toSource(), "({})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js b/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js
new file mode 100644
index 0000000000..74ee7e9f31
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var obj = {};
+obj[Symbol.iterator] = 1;
+assertEq(obj.toSource(), "({[Symbol.iterator]:1})");
+obj[Symbol(undefined)] = 2;
+obj[Symbol('ponies')] = 3;
+obj[Symbol.for('ponies')] = 4;
+assertEq(obj.toSource(),
+ '({[Symbol.iterator]:1, [Symbol()]:2, [Symbol("ponies")]:3, [Symbol.for("ponies")]:4})');
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js b/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js
new file mode 100644
index 0000000000..dda67c95f3
--- /dev/null
+++ b/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function funArgs(params) {
+ return Reflect.parse(`function f(${params}) {}`).body[0].rest;
+}
+
+var arrayRest = funArgs("...[]");
+assertEq(arrayRest.type, "ArrayPattern");
+assertEq(arrayRest.elements.length, 0);
+
+arrayRest = funArgs("...[a]");
+assertEq(arrayRest.type, "ArrayPattern");
+assertEq(arrayRest.elements.length, 1);
+
+var objectRest = funArgs("...{}");
+assertEq(objectRest.type, "ObjectPattern");
+assertEq(objectRest.properties.length, 0);
+
+objectRest = funArgs("...{p: a}");
+assertEq(objectRest.type, "ObjectPattern");
+assertEq(objectRest.properties.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/preventExtensions-cross-global.js b/js/src/tests/non262/extensions/preventExtensions-cross-global.js
new file mode 100644
index 0000000000..0cc68e0fb4
--- /dev/null
+++ b/js/src/tests/non262/extensions/preventExtensions-cross-global.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = 'preventExtensions-cross-global.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 789897;
+var summary =
+ "Object.preventExtensions and Object.isExtensible should work correctly " +
+ "across globals";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var otherGlobal = newGlobal();
+
+var obj = {};
+assertEq(otherGlobal.Object.isExtensible(obj), true);
+assertEq(otherGlobal.Object.preventExtensions(obj), obj);
+assertEq(otherGlobal.Object.isExtensible(obj), false);
+
+var objFromOther = otherGlobal.Object();
+assertEq(Object.isExtensible(objFromOther), true);
+assertEq(Object.preventExtensions(objFromOther), objFromOther);
+assertEq(Object.isExtensible(objFromOther), false);
+
+var proxy = new Proxy({}, {});
+assertEq(otherGlobal.Object.isExtensible(proxy), true);
+assertEq(otherGlobal.Object.preventExtensions(proxy), proxy);
+assertEq(otherGlobal.Object.isExtensible(proxy), false);
+
+var proxyFromOther = otherGlobal.evaluate("new Proxy({}, {})");
+assertEq(Object.isExtensible(proxyFromOther), true);
+assertEq(Object.preventExtensions(proxyFromOther), proxyFromOther);
+assertEq(Object.isExtensible(proxyFromOther), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/proxy-array-target-length-definition.js b/js/src/tests/non262/extensions/proxy-array-target-length-definition.js
new file mode 100644
index 0000000000..c573c4ba08
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-array-target-length-definition.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'proxy-array-target-length-definition.js';
+var BUGNUMBER = 905947;
+var summary =
+ "Redefining an array's |length| property when redefining the |length| " +
+ "property on a proxy with an array as target";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [];
+var p = new Proxy(arr, {});
+
+function assertThrowsTypeError(f)
+{
+ try {
+ f();
+ assertEq(false, true, "Must have thrown");
+ } catch (e) {
+ assertEq(e instanceof TypeError, true, "Must have thrown TypeError");
+ }
+}
+
+// Redefining non-configurable length should throw a TypeError
+assertThrowsTypeError(function () { Object.defineProperty(p, "length", { value: 17, configurable: true }); });
+
+// Same here.
+assertThrowsTypeError(function () { Object.defineProperty(p, "length", { value: 42, enumerable: true }); });
+
+// Check the property went unchanged.
+var pd = Object.getOwnPropertyDescriptor(p, "length");
+assertEq(pd.value, 0);
+assertEq(pd.writable, true);
+assertEq(pd.enumerable, false);
+assertEq(pd.configurable, false);
+
+var ad = Object.getOwnPropertyDescriptor(arr, "length");
+assertEq(ad.value, 0);
+assertEq(ad.writable, true);
+assertEq(ad.enumerable, false);
+assertEq(ad.configurable, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/proxy-enumeration.js b/js/src/tests/non262/extensions/proxy-enumeration.js
new file mode 100644
index 0000000000..f872d635d8
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-enumeration.js
@@ -0,0 +1,4 @@
+var list = Object.getOwnPropertyNames(this);
+var found = list.indexOf("Proxy") != -1;
+assertEq(found, true)
+reportCompare(true, true)
diff --git a/js/src/tests/non262/extensions/proxy-proto-setter.js b/js/src/tests/non262/extensions/proxy-proto-setter.js
new file mode 100644
index 0000000000..37e620cd1c
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-proto-setter.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Blake Kaplan
+
+function expect(actual, arg) {
+ reportCompare(expect.expected, actual, arg);
+}
+
+var window = { set x(y) { expect(this, y) }, y: 4 };
+expect.expected = window;
+window.x = "setting through a setter directly";
+window.y = 5;
+reportCompare(5, window.y, "setting properties works");
+var easy = { easy: 'yes', __proto__: window }
+expect.expected = easy;
+easy.x = "setting through a setter all-native on prototype";
+easy.y = 6;
+reportCompare(5, window.y, "window.y remains as it was");
+reportCompare(6, easy.y, "shadowing works properly");
+
+var sandbox = evalcx('');
+sandbox.window = window;
+sandbox.print = print;
+sandbox.expect = expect;
+var hard = evalcx('Object.create(window)', sandbox);
+expect.expected = hard;
+hard.x = "a setter through proxy -> native";
+hard.y = 6;
+reportCompare(5, window.y, "window.y remains as it was through a proxy");
+reportCompare(6, hard.y, "shadowing works on proxies");
+
+hard.__proto__ = { 'passed': true }
+reportCompare(true, hard.passed, "can set proxy.__proto__ through a native");
+
+var inverse = evalcx('({ set x(y) { expect(this, y); }, y: 4 })', sandbox);
+expect.expected = inverse;
+inverse.x = "setting through a proxy directly";
+inverse.y = 5;
+reportCompare(5, inverse.y, "setting properties works on proxies");
+
+var inversehard = Object.create(inverse);
+expect.expected = inversehard;
+inversehard.x = "setting through a setter with a proxy on the proto chain";
+inversehard.y = 6;
+reportCompare(5, inverse.y, "inverse.y remains as it was");
+reportCompare(6, inversehard.y, "shadowing works native -> proxy");
+
+inversehard.__proto__ = { 'passed': true }
+reportCompare(true, inversehard.passed, "can set native.__proto__ through a proxy");
diff --git a/js/src/tests/non262/extensions/proxy-strict.js b/js/src/tests/non262/extensions/proxy-strict.js
new file mode 100644
index 0000000000..9dc9696853
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-strict.js
@@ -0,0 +1,12 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var s = "grape";
+function f() { "use strict"; return this; }
+var p = new Proxy(f, {});
+String.prototype.p = p;
+assertEq(s.p(), "grape");
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/quote-string-for-nul-character.js b/js/src/tests/non262/extensions/quote-string-for-nul-character.js
new file mode 100644
index 0000000000..f893410ed6
--- /dev/null
+++ b/js/src/tests/non262/extensions/quote-string-for-nul-character.js
@@ -0,0 +1,94 @@
+// Ensure we properly quote strings which can contain the NUL character before
+// returning them to the user to avoid cutting off any trailing characters.
+
+function assertStringIncludes(actual, expected) {
+ assertEq(actual.includes(expected), true, `"${actual}" includes "${expected}"`);
+}
+
+function assertErrorMessageIncludes(fn, str) {
+ try {
+ fn();
+ } catch (e) {
+ assertStringIncludes(e.message, str);
+ return;
+ }
+ assertEq(true, false, "missing exception");
+}
+
+assertErrorMessageIncludes(() => "foo\0bar" in "asdf\0qwertz", "bar");
+assertErrorMessageIncludes(() => "foo\0bar" in "asdf\0qwertz", "qwertz");
+
+if (this.Intl) {
+ assertErrorMessageIncludes(() => Intl.getCanonicalLocales("de\0Latn"), "Latn");
+
+ assertErrorMessageIncludes(() => Intl.Collator.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {usage: "sort\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {caseFirst: "upper\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {sensitivity: "base\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.DateTimeFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {hourCycle: "h24\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {weekday: "narrow\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {era: "narrow\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {year: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {month: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {day: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {hour: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {minute: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {second: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {formatMatcher: "basic\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {timeZone: "UTC\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.NumberFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {style: "decimal\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {currency: "USD\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {currencyDisplay: "code\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.PluralRules.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.PluralRules("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.PluralRules("en", {type: "cardinal\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.RelativeTimeFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {style: "long\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {numeric: "auto\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat().format(1, "day\0cookie"), "cookie");
+
+ assertErrorMessageIncludes(() => new Intl.Locale("de\0keks"), "keks");
+ assertErrorMessageIncludes(() => new Intl.Locale("de", {language: "it\0biscotto"}), "biscotto");
+ assertErrorMessageIncludes(() => new Intl.Locale("th", {script: "Thai\0คุกกี้"}), "\\u0E04\\u0E38\\u0E01\\u0E01\\u0E35\\u0E49");
+ assertErrorMessageIncludes(() => new Intl.Locale("en", {region: "GB\0biscuit"}), "biscuit");
+
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {calendar: "gregory\0F1"}), "F1");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {collation: "phonebk\0F2"}), "F2");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {hourCycle: "h24\0F3"}), "F3");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {caseFirst: "false\0F4"}), "F4");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {numberingSystem: "arab\0F5"}), "F5");
+}
+
+// Shell and helper functions.
+
+assertErrorMessageIncludes(() => assertEq(true, false, "foo\0bar"), "bar");
+
+if (this.disassemble) {
+ assertStringIncludes(disassemble(Function("var re = /foo\0bar/")), "bar");
+}
+
+if (this.getBacktrace) {
+ const k = "asdf\0asdf";
+ const o = {[k](a) { "use strict"; return getBacktrace({locals: true, args: true}); }};
+ const r = o[k].call("foo\0bar", "baz\0faz");
+ assertStringIncludes(r, "bar");
+ assertStringIncludes(r, "faz");
+}
+
+// js/src/tests/browser.js provides its own |options| function, make sure we don't test that one.
+if (this.options && typeof document === "undefined") {
+ assertErrorMessageIncludes(() => options("foo\0bar"), "bar");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/recursion.js b/js/src/tests/non262/extensions/recursion.js
new file mode 100644
index 0000000000..0869b90a6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/recursion.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Christian Holler <decoder@own-hero.net>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 622167;
+var summary = 'Handle infinite recursion';
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function eval() { eval(); }
+
+function DoWhile_3()
+{
+ eval();
+}
+
+try
+{
+ DoWhile_3();
+}
+catch(e) { }
+
+var r;
+function* f()
+{
+ r = arguments;
+ test();
+ yield 170;
+}
+
+function test()
+{
+ function foopy()
+ {
+ try
+ {
+ for (var i of f());
+ }
+ catch (e)
+ {
+ gc();
+ }
+ }
+ foopy();
+}
+test();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js b/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js
new file mode 100644
index 0000000000..efdfc0ef98
--- /dev/null
+++ b/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!xulRuntime.shell)
+//
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 622646;
+var summary = "Shadowing an exception identifier in a catch block with a " +
+ "|const| or |let| declaration should throw an error";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertRedeclarationErrorThrown(expression)
+{
+ "use strict";
+
+ try
+ {
+ evaluate(expression);
+ throw new Error("Redeclaration error wasn't thrown");
+ }
+ catch(e)
+ {
+ assertEq(e.message.indexOf("catch") > 0, true,
+ "wrong error, got " + e.message);
+ }
+}
+
+assertRedeclarationErrorThrown("try {} catch(e) { const e = undefined; }");
+assertRedeclarationErrorThrown("try {} catch(e) { let e; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js b/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js
new file mode 100644
index 0000000000..0ec0b493e4
--- /dev/null
+++ b/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs gc (newGlobal/evaluate are shimmed)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile =
+ "reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1253099;
+var summary =
+ "Don't assert when, in |new RegExp(pat)|, stringifying |pat| creates " +
+ "another RegExp and then performs a GC";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// The fresh global object is required to ensure that the outer |new RegExp|
+// is the first RegExp created in the global (other than RegExp.prototype).
+newGlobal().evaluate(`
+var createsRegExpAndCallsGCWhenStringified =
+ {
+ toString: function() {
+ new RegExp("a");
+ gc();
+ return "q";
+ }
+ };
+
+assertEq(new RegExp(createsRegExpAndCallsGCWhenStringified).source, "q");
+`);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/regress-103087.js b/js/src/tests/non262/extensions/regress-103087.js
new file mode 100644
index 0000000000..9a305827e0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-103087.js
@@ -0,0 +1,141 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 04 October 2001
+ *
+ * SUMMARY: Arose from Bugzilla bug 103087:
+ * "The RegExp MarkupSPE in demo crashes Mozilla"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=103087
+ * The SpiderMonkey shell crashed on some of these regexps.
+ *
+ * The reported crash was on i=24 below ('MarkupSPE' regexp)
+ * I crashed on that, and also on i=43 ('XML_SPE' regexp)
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 103087;
+var summary = "Testing that we don't crash on any of these regexps -";
+var re = '';
+var lm = '';
+var lc = '';
+var rc = '';
+
+
+// the regexps are built in pieces -
+var NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]";
+var NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]";
+var Name = "(" + NameStrt + ")(" + NameChar + ")*";
+var TextSE = "[^<]+";
+var UntilHyphen = "[^-]*-";
+var Until2Hyphens = UntilHyphen + "([^-]" + UntilHyphen + ")*-";
+var CommentCE = Until2Hyphens + ">?";
+var UntilRSBs = "[^]]*]([^]]+])*]+";
+var CDATA_CE = UntilRSBs + "([^]>]" + UntilRSBs + ")*>";
+var S = "[ \\n\\t\\r]+";
+var QuoteSE = '"[^"]' + "*" + '"' + "|'[^']*'";
+var DT_IdentSE = S + Name + "(" + S + "(" + Name + "|" + QuoteSE + "))*";
+var MarkupDeclCE = "([^]\"'><]+|" + QuoteSE + ")*>";
+var S1 = "[\\n\\r\\t ]";
+var UntilQMs = "[^?]*\\?+";
+var PI_Tail = "\\?>|" + S1 + UntilQMs + "([^>?]" + UntilQMs + ")*>";
+var DT_ItemSE = "<(!(--" + Until2Hyphens + ">|[^-]" + MarkupDeclCE + ")|\\?" + Name + "(" + PI_Tail + "))|%" + Name + ";|" + S;
+var DocTypeCE = DT_IdentSE + "(" + S + ")?(\\[(" + DT_ItemSE + ")*](" + S + ")?)?>?";
+var DeclCE = "--(" + CommentCE + ")?|\\[CDATA\\[(" + CDATA_CE + ")?|DOCTYPE(" + DocTypeCE + ")?";
+var PI_CE = Name + "(" + PI_Tail + ")?";
+var EndTagCE = Name + "(" + S + ")?>?";
+var AttValSE = '"[^<"]' + "*" + '"' + "|'[^<']*'";
+var ElemTagCE = Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>?";
+var MarkupSPE = "<(!(" + DeclCE + ")?|\\?(" + PI_CE + ")?|/(" + EndTagCE + ")?|(" + ElemTagCE + ")?)";
+var XML_SPE = TextSE + "|" + MarkupSPE;
+var CommentRE = "<!--" + Until2Hyphens + ">";
+var CommentSPE = "<!--(" + CommentCE + ")?";
+var PI_RE = "<\\?" + Name + "(" + PI_Tail + ")";
+var Erroneous_PI_SE = "<\\?[^?]*(\\?[^>]+)*\\?>";
+var PI_SPE = "<\\?(" + PI_CE + ")?";
+var CDATA_RE = "<!\\[CDATA\\[" + CDATA_CE;
+var CDATA_SPE = "<!\\[CDATA\\[(" + CDATA_CE + ")?";
+var ElemTagSE = "<(" + NameStrt + ")([^<>\"']+|" + AttValSE + ")*>";
+var ElemTagRE = "<" + Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>";
+var ElemTagSPE = "<" + ElemTagCE;
+var EndTagRE = "</" + Name + "(" + S + ")?>";
+var EndTagSPE = "</(" + EndTagCE + ")?";
+var DocTypeSPE = "<!DOCTYPE(" + DocTypeCE + ")?";
+var PERef_APE = "%(" + Name + ";?)?";
+var HexPart = "x([0-9a-fA-F]+;?)?";
+var NumPart = "#([0-9]+;?|" + HexPart + ")?";
+var CGRef_APE = "&(" + Name + ";?|" + NumPart + ")?";
+var Text_PE = CGRef_APE + "|[^&]+";
+var EntityValue_PE = CGRef_APE + "|" + PERef_APE + "|[^%&]+";
+
+
+var rePatterns = new Array(AttValSE, CDATA_CE, CDATA_RE, CDATA_SPE, CGRef_APE, CommentCE, CommentRE, CommentSPE, DT_IdentSE, DT_ItemSE, DeclCE, DocTypeCE, DocTypeSPE, ElemTagCE, ElemTagRE, ElemTagSE, ElemTagSPE, EndTagCE, EndTagRE, EndTagSPE, EntityValue_PE, Erroneous_PI_SE, HexPart, MarkupDeclCE, MarkupSPE, Name, NameChar, NameStrt, NumPart, PERef_APE, PI_CE, PI_RE, PI_SPE, PI_Tail, QuoteSE, S, S1, TextSE, Text_PE, Until2Hyphens, UntilHyphen, UntilQMs, UntilRSBs, XML_SPE);
+
+
+// here's a big string to test the regexps on -
+var str = '';
+str += '<html xmlns="http://www.w3.org/1999/xhtml"' + '\n';
+str += ' xmlns:xlink="http://www.w3.org/XML/XLink/0.9">' + '\n';
+str += ' <head><title>Three Namespaces</title></head>' + '\n';
+str += ' <body>' + '\n';
+str += ' <h1 align="center">An Ellipse and a Rectangle</h1>' + '\n';
+str += ' <svg xmlns="http://www.w3.org/Graphics/SVG/SVG-19991203.dtd" ' + '\n';
+str += ' width="12cm" height="10cm">' + '\n';
+str += ' <ellipse rx="110" ry="130" />' + '\n';
+str += ' <rect x="4cm" y="1cm" width="3cm" height="6cm" />' + '\n';
+str += ' </svg>' + '\n';
+str += ' <p xlink:type="simple" xlink:href="ellipses.html">' + '\n';
+str += ' More about ellipses' + '\n';
+str += ' </p>' + '\n';
+str += ' <p xlink:type="simple" xlink:href="rectangles.html">' + '\n';
+str += ' More about rectangles' + '\n';
+str += ' </p>' + '\n';
+str += ' <hr/>' + '\n';
+str += ' <p>Last Modified February 13, 2000</p> ' + '\n';
+str += ' </body>' + '\n';
+str += '</html>';
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<rePatterns.length; i++)
+ {
+ status = inSection(i);
+ re = new RegExp(rePatterns[i]);
+
+ // Test that we don't crash on any of these -
+ re.exec(str);
+ getResults();
+
+ // Just for the heck of it, test the current leftContext
+ re.exec(lc);
+ getResults();
+
+ // Test the current rightContext
+ re.exec(rc);
+ getResults();
+ }
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+function getResults()
+{
+ lm = RegExp.lastMatch;
+ lc = RegExp.leftContext;
+ rc = RegExp.rightContext;
+}
diff --git a/js/src/tests/non262/extensions/regress-104077.js b/js/src/tests/non262/extensions/regress-104077.js
new file mode 100644
index 0000000000..189f0ce903
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-104077.js
@@ -0,0 +1,195 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 October 2001
+ * SUMMARY: Regression test for Bugzilla bug 104077
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104077
+ * "JS crash: with/finally/return"
+ *
+ * Also http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ * "JS crash: try/catch/continue."
+ *
+ * SpiderMonkey crashed on this code - it shouldn't.
+ *
+ * NOTE: the finally-blocks below should execute even if their try-blocks
+ * have return or throw statements in them:
+ *
+ * ------- Additional Comment #76 From Mike Shaver 2001-12-07 01:21 -------
+ * finally trumps return, and all other control-flow constructs that cause
+ * program execution to jump out of the try block: throw, break, etc. Once you
+ * enter a try block, you will execute the finally block after leaving the try,
+ * regardless of what happens to make you leave the try.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 104077;
+var summary = "Just testing that we don't crash on with/finally/return -";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function addValues_3(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum +=1;
+ print("In finally block of addValues_3() function: sum = " + sum);
+ }
+ catch (e) {
+ if (e != 42)
+ throw e;
+ sum +=1;
+ print('In finally catch block of addValues_3() function: sum = ' + sum + ', e = ' + e);
+ }
+ finally
+ {
+ sum +=1;
+ print("In finally finally block of addValues_3() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(9);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_3(obj);
+expect = 8;
+captureThis();
+
+
+
+
+function addValues_4(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum += 1;
+ print("In finally block of addValues_4() function: sum = " + sum);
+ }
+ catch (e) {
+ if (e == 42) {
+ sum += 1;
+ print("In 1st finally catch block of addValues_4() function: sum = " + sum + ", e = " + e);
+ } else if (e == 43) {
+ sum += 1;
+ print("In 2nd finally catch block of addValues_4() function: sum = " + sum + ", e = " + e);
+ } else {
+ throw e;
+ }
+ }
+ finally
+ {
+ sum += 1;
+ print("In finally finally block of addValues_4() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(10);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_4(obj);
+expect = 8;
+captureThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function captureThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-178722.js b/js/src/tests/non262/extensions/regress-178722.js
new file mode 100644
index 0000000000..9ec73d3d15
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-178722.js
@@ -0,0 +1,90 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 06 November 2002
+ * SUMMARY: arr.sort() should not output |undefined| when |arr| is empty
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=178722
+ *
+ * ECMA-262 Ed.3: 15.4.4.11 Array.prototype.sort (comparefn)
+ *
+ * 1. Call the [[Get]] method of this object with argument "length".
+ * 2. Call ToUint32(Result(1)).
+ * 3. Perform an implementation-dependent sequence of calls to the [[Get]],
+ * [[Put]], and [[Delete]] methods of this object, etc. etc.
+ * 4. Return this object.
+ *
+ *
+ * Note that sort() is done in-place on |arr|. In other words, sort() is a
+ * "destructive" method rather than a "functional" method. The return value
+ * of |arr.sort()| and |arr| are the same object.
+ *
+ * If |arr| is an empty array, the return value of |arr.sort()| should be
+ * an empty array, not the value |undefined| as was occurring in bug 178722.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 178722;
+var summary = 'arr.sort() should not output |undefined| when |arr| is empty';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr;
+
+
+// create empty array or pseudo-array objects in various ways
+function f () {return arguments};
+var arr5 = f();
+arr5.__proto__ = Array.prototype;
+
+
+status = inSection(5);
+arr = arr5.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr5;
+expect = true;
+addThis();
+
+
+// now do the same thing, with non-default sorting:
+function g() {return 1;}
+
+status = inSection('5a');
+arr = arr5.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr5;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-188206-01.js b/js/src/tests/non262/extensions/regress-188206-01.js
new file mode 100644
index 0000000000..c54390709b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-188206-01.js
@@ -0,0 +1,71 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Now do some weird things on the left side of the regexps -
+ */
+status = inSection(7);
+testThis(' /*a/ ');
+
+status = inSection(8);
+testThis(' /**a/ ');
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+/*
+ * Invalid syntax should generate a SyntaxError
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-188206-02.js b/js/src/tests/non262/extensions/regress-188206-02.js
new file mode 100644
index 0000000000..4cf9dd7b30
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-188206-02.js
@@ -0,0 +1,121 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Misusing the {DecmalDigits} quantifier - according to ECMA,
+ * but not according to Perl.
+ *
+ * ECMA-262 Edition 3 prohibits the use of unescaped braces in
+ * regexp patterns, unless they form part of a quantifier.
+ *
+ * Hovever, Perl does not prohibit this. If not used as part
+ * of a quantifer, Perl treats braces literally.
+ *
+ * We decided to follow Perl on this for backward compatibility.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=190685.
+ *
+ * Therefore NONE of the following ECMA violations should generate
+ * a SyntaxError. Note we use checkThis() instead of testThis().
+ */
+status = inSection(13);
+checkThis(' /a*{/ ');
+
+status = inSection(14);
+checkThis(' /a{}/ ');
+
+status = inSection(15);
+checkThis(' /{a/ ');
+
+status = inSection(16);
+checkThis(' /}a/ ');
+
+status = inSection(17);
+checkThis(' /x{abc}/ ');
+
+status = inSection(18);
+checkThis(' /{{0}/ ');
+
+status = inSection(19);
+checkThis(' /{{1}/ ');
+
+status = inSection(20);
+checkThis(' /x{{0}/ ');
+
+status = inSection(21);
+checkThis(' /x{{1}/ ');
+
+status = inSection(22);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(23);
+checkThis(' /x{{1}}/ ');
+
+status = inSection(24);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(25);
+checkThis(' /x{{1}}/ ');
+
+status = inSection(26);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(27);
+checkThis(' /x{{1}}/ ');
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Allowed syntax shouldn't generate any errors
+ */
+function checkThis(sAllowedSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sAllowedSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-192465.js b/js/src/tests/non262/extensions/regress-192465.js
new file mode 100644
index 0000000000..71bfac8dce
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-192465.js
@@ -0,0 +1,122 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 February 2003
+ * SUMMARY: Object.toSource() recursion should check stack overflow
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192465
+ *
+ * MODIFIED: 27 February 2003
+ *
+ * We are adding an early return to this testcase, since it is causing
+ * big problems on Linux RedHat8! For a discussion of this issue, see
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=174341#c24 and following.
+ *
+ *
+ * MODIFIED: 20 March 2003
+ *
+ * Removed the early return and changed |N| below from 1000 to 90.
+ * Note |make_deep_nest(N)| returns an object graph of length N(N+1).
+ * So the graph has now been reduced from 1,001,000 to 8190.
+ *
+ * With this reduction, the bug still manifests on my WinNT and Linux
+ * boxes (crash due to stack overflow). So the testcase is again of use
+ * on those boxes. At the same time, Linux RedHat8 boxes can now run
+ * the test in a reasonable amount of time.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192465;
+var summary = 'Object.toSource() recursion should check stack overflow';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * We're just testing that this script will compile and run.
+ * Set both |actual| and |expect| to a dummy value.
+ */
+status = inSection(1);
+var N = 90;
+try
+{
+ make_deep_nest(N);
+}
+catch (e)
+{
+ // An exception is OK, as the runtime can throw one in response to too deep
+ // recursion. We haven't crashed; good! Continue on to set the dummy values -
+}
+actual = 1;
+expect = 1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+/*
+ * EXAMPLE:
+ *
+ * If the global variable |N| is 2, then for |level| == 0, 1, 2, the return
+ * value of this function will be toSource() of these objects, respectively:
+ *
+ * {next:{next:END}}
+ * {next:{next:{next:{next:END}}}}
+ * {next:{next:{next:{next:{next:{next:END}}}}}}
+ *
+ */
+function make_deep_nest(level)
+{
+ var head = {};
+ var cursor = head;
+
+ for (var i=0; i!=N; ++i)
+ {
+ cursor.next = {};
+ cursor = cursor.next;
+ }
+
+ cursor.toSource = function()
+ {
+ if (level != 0)
+ return make_deep_nest(level - 1);
+ return "END";
+ }
+
+ return head.toSource();
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-220367-002.js b/js/src/tests/non262/extensions/regress-220367-002.js
new file mode 100644
index 0000000000..5948c24eec
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-220367-002.js
@@ -0,0 +1,75 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 26 September 2003
+ * SUMMARY: Regexp conformance test
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=220367
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 220367;
+var summary = 'Regexp conformance test';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var re = /(a)|(b)/;
+
+re.test('a');
+status = inSection(1);
+actual = RegExp.$1;
+expect = 'a';
+addThis();
+
+status = inSection(2);
+actual = RegExp.$2;
+expect = '';
+addThis();
+
+re.test('b');
+status = inSection(3);
+actual = RegExp.$1;
+expect = '';
+addThis();
+
+status = inSection(4);
+actual = RegExp.$2;
+expect = 'b';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-226078.js b/js/src/tests/non262/extensions/regress-226078.js
new file mode 100644
index 0000000000..fe238652ac
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-226078.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 226078;
+var summary = 'Do not Crash @ js_Interpret 3127f864';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function SetLangHead(l){
+ with(p){
+ for(var i in x)
+ if(getElementById("TxtH"+i)!=undefined)
+ printStatus('huh');
+ }
+}
+x=[0,1,2,3];
+p={getElementById: function (id){
+ printStatus(id);
+ if (typeof dis === "function") {
+ dis(SetLangHead);
+ }
+ return undefined;
+}};
+SetLangHead(1);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-228087.js b/js/src/tests/non262/extensions/regress-228087.js
new file mode 100644
index 0000000000..c0b1661752
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-228087.js
@@ -0,0 +1,316 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 12 December 2003
+ * SUMMARY: Testing regexps with unescaped braces
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=228087
+ *
+ * Note: unbalanced, unescaped braces are not permitted by ECMA-262 Ed.3,
+ * but we decided to follow Perl and IE and allow this for compatibility.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206 and its testcase.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273 and its testcase.
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 228087;
+var summary = 'Testing regexps with unescaped braces';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+var e;
+
+
+string = 'foo {1} foo {2} foo';
+
+// try an example with the braces escaped
+status = inSection(1);
+try
+{
+ pattern = new RegExp('\{1.*\}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1} foo {2}');
+addThis();
+
+// just like Section 1, without the braces being escaped
+status = inSection(2);
+try
+{
+ pattern = new RegExp('{1.*}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1} foo {2}');
+addThis();
+
+// try an example with the braces escaped
+status = inSection(3);
+try
+{
+ pattern = new RegExp('\{1[.!\}]*\}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1}');
+addThis();
+
+// just like Section 3, without the braces being escaped
+status = inSection(4);
+try
+{
+ pattern = new RegExp('{1[.!}]*}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1}');
+addThis();
+
+
+string = 'abccccc{3 }c{ 3}c{3, }c{3 ,}c{3 ,4}c{3, 4}c{3,4 }de';
+
+// use braces in a normal quantifier construct
+status = inSection(5);
+try
+{
+ pattern = new RegExp('c{3}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('ccc');
+addThis();
+
+// now disrupt the quantifer - the braces should now be interpreted literally
+status = inSection(6);
+try
+{
+ pattern = new RegExp('c{3 }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(7);
+try
+{
+ pattern = new RegExp('c{3.}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(8);
+try
+{
+ // need to escape the \ in \s since
+ // this has been converted to a constructor call
+ // instead of a literal regexp
+ pattern = new RegExp('c{3\\s}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(9);
+try
+{
+ pattern = new RegExp('c{3[ ]}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(10);
+try
+{
+ pattern = new RegExp('c{ 3}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{ 3}');
+addThis();
+
+// using braces in a normal quantifier construct again
+status = inSection(11);
+try
+{
+ pattern = new RegExp('c{3,}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('ccccc');
+addThis();
+
+// now disrupt it - the braces should now be interpreted literally
+status = inSection(12);
+try
+{
+ pattern = new RegExp('c{3, }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3, }');
+addThis();
+
+status = inSection(13);
+try
+{
+ pattern = new RegExp('c{3 ,}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 ,}');
+addThis();
+
+// using braces in a normal quantifier construct again
+status = inSection(14);
+try
+{
+ pattern = new RegExp('c{3,4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('cccc');
+addThis();
+
+// now disrupt it - the braces should now be interpreted literally
+status = inSection(15);
+try
+{
+ pattern = new RegExp('c{3 ,4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 ,4}');
+addThis();
+
+status = inSection(16);
+try
+{
+ pattern = new RegExp('c{3, 4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3, 4}');
+addThis();
+
+status = inSection(17);
+try
+{
+ pattern = new RegExp('c{3,4 }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3,4 }');
+addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/extensions/regress-245148.js b/js/src/tests/non262/extensions/regress-245148.js
new file mode 100644
index 0000000000..e291056f35
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-245148.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!Array.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245148;
+var summary = '[null].toSource() == "[null]"';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = '[null]';
+actual = [null].toSource();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-255245.js b/js/src/tests/non262/extensions/regress-255245.js
new file mode 100644
index 0000000000..9d486fe962
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-255245.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!Function.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 255245;
+var summary = 'Function.prototype.toSource/.toString show "setrval" instead of "return"';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ try {
+ } catch (e) {
+ return false;
+ }
+ finally {
+ }
+}
+
+expect = -1;
+actual = f.toSource().indexOf('setrval');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-274152.js b/js/src/tests/non262/extensions/regress-274152.js
new file mode 100644
index 0000000000..0f3cd70e53
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-274152.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 274152;
+var summary = 'Do not ignore unicode format-control characters';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: illegal character';
+
+ var formatcontrolchars = ['\u200E',
+ '\u0600',
+ '\u0601',
+ '\u0602',
+ '\u0603',
+ '\u06DD',
+ '\u070F'];
+
+ for (var i = 0; i < formatcontrolchars.length; i++)
+ {
+ var char = formatcontrolchars[i];
+
+ try
+ {
+ eval("hi" + char + "there = 'howdie';");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ var hex = char.codePointAt(0).toString(16).toUpperCase().padStart(4, '0');
+ reportCompare(`${expect} U+${hex}`, actual, summary + ': ' + i);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-300079.js b/js/src/tests/non262/extensions/regress-300079.js
new file mode 100644
index 0000000000..d2a1090c09
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-300079.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 300079;
+var summary = "precompiled functions should inherit from current window's Function.prototype";
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof clone == 'undefined') {
+ expect = 'SKIPPED';
+ actual = 'SKIPPED';
+ }
+ else {
+ expect = 'PASSED';
+
+ f = evaluate("(function () { return a * a; })", {envChainObject: {a: 3}});
+ gc();
+ try {
+ a_squared = f(2);
+ if (a_squared != 9)
+ throw "Unexpected return from g: a_squared == " + a_squared;
+ actual = "PASSED";
+ } catch (e) {
+ actual = "FAILED: " + e;
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-311161.js b/js/src/tests/non262/extensions/regress-311161.js
new file mode 100644
index 0000000000..7f54f734eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311161.js
@@ -0,0 +1,1440 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311161;
+var summary = 'toSource exposes random memory or crashes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var commands =
+ [{origCount:1, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:2, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:3, fun:(function anonymous() {allElements[4].style.width = "200%";})},
+{origCount:4, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:5, fun:(function anonymous() {allElements[8].style.visibility = "hidden";})},
+{origCount:6, fun:(function anonymous() {allElements[1].style.overflow = "visible";})},
+{origCount:7, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:8, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-box";})},
+{origCount:9, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:10, fun:(function anonymous() {allElements[11].style.color = "red";})},
+{origCount:11, fun:(function anonymous() {allElements[4].style.height = "2em";})},
+{origCount:12, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:13, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:14, fun:(function anonymous() {allElements[9].style.color = "blue";})},
+{origCount:15, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:16, fun:(function anonymous() {allElements[1].style.height = "auto";})},
+{origCount:17, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:18, fun:(function anonymous() {allElements[4].style.display = "table-row-group";})},
+{origCount:19, fun:(function anonymous() {allElements[4].style.overflow = "auto";})},
+{origCount:20, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:21, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:22, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-group";})},
+{origCount:23, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:24, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:25, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:26, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:27, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:28, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:29, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:30, fun:(function anonymous() {allElements[2].style.color = "black";})},
+{origCount:31, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:32, fun:(function anonymous() {allElements[0].style.display = "table-row-group";})},
+{origCount:33, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:34, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:35, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:36, fun:(function anonymous() {allElements[6].style.color = "blue";})},
+{origCount:37, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:38, fun:(function anonymous() {allElements[8].style.display = "-moz-grid";})},
+{origCount:39, fun:(function anonymous() {allElements[9].style.color = "black";})},
+{origCount:40, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:41, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:42, fun:(function anonymous() {allElements[9].style.color = "green";})},
+{origCount:43, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:44, fun:(function anonymous() {allElements[2].style.clear = "both";})},
+{origCount:45, fun:(function anonymous() {allElements[8].style.width = "1px";})},
+{origCount:46, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:47, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:48, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:49, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:50, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:51, fun:(function anonymous() {allElements[6].style.height = "10%";})},
+{origCount:52, fun:(function anonymous() {allElements[11].style.display = "-moz-inline-box";})},
+{origCount:53, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:54, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:55, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:56, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:57, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:58, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:59, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:60, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:61, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:62, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:63, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:64, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:65, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:66, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:67, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:68, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:69, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:70, fun:(function anonymous() {allElements[8].style.display = "-moz-popup";})},
+{origCount:71, fun:(function anonymous() {allElements[2].style.height = "10%";})},
+{origCount:72, fun:(function anonymous() {allElements[7].style.display = "table-cell";})},
+{origCount:73, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:74, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:75, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:76, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:77, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:78, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:79, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:80, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:81, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:82, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:83, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-group";})},
+{origCount:84, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:85, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:86, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:87, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:88, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:89, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:90, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:91, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:92, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:93, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:94, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:95, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:96, fun:(function anonymous() {allElements[0].style.color = "blue";})},
+{origCount:97, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:98, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:99, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:100, fun:(function anonymous() {allElements[12].style.width = "10%";})},
+{origCount:101, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:102, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:103, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:104, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:105, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:106, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:107, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:108, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:109, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:110, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:111, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:112, fun:(function anonymous() {allElements[11].style.height = "200%";})},
+{origCount:113, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:114, fun:(function anonymous() {allElements[12].style.width = "200%";})},
+{origCount:115, fun:(function anonymous() {allElements[5].style.height = "10%";})},
+{origCount:116, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:117, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:118, fun:(function anonymous() {allElements[9].style.width = "10%";})},
+{origCount:119, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:120, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:121, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:122, fun:(function anonymous() {allElements[7].style.width = "1px";})},
+{origCount:123, fun:(function anonymous() {allElements[3].style.color = "blue";})},
+{origCount:124, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:125, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:126, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:127, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:128, fun:(function anonymous() {allElements[12].style.color = "green";})},
+{origCount:129, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:130, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:131, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:132, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:133, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:134, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:135, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:136, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:137, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:138, fun:(function anonymous() {allElements[0].style.width = "10%";})},
+{origCount:139, fun:(function anonymous() {allElements[1].style.height = "10%";})},
+{origCount:140, fun:(function anonymous() {allElements[5].style.height = "auto";})},
+{origCount:141, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:142, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:143, fun:(function anonymous() {allElements[7].style.display = "table-header-group";})},
+{origCount:144, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:145, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:146, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:147, fun:(function anonymous() {allElements[10].style.clear = "both";})},
+{origCount:148, fun:(function anonymous() {allElements[8].style.display = "table-header-group";})},
+{origCount:149, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:150, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:151, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:152, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:153, fun:(function anonymous() {allElements[3].style.width = "10%";})},
+{origCount:154, fun:(function anonymous() {allElements[12].style.color = "blue";})},
+{origCount:155, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:156, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:157, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:158, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:159, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:160, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:161, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-line";})},
+{origCount:162, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:163, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:164, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:165, fun:(function anonymous() {allElements[11].style.height = "100px";})},
+{origCount:166, fun:(function anonymous() {allElements[5].style.display = "table-footer-group";})},
+{origCount:167, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:168, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:169, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:170, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:171, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:172, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:173, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:174, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:175, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:176, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:177, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:178, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:179, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:180, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:181, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:182, fun:(function anonymous() {allElements[6].style.height = "200%";})},
+{origCount:183, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:184, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:185, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:186, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:187, fun:(function anonymous() {allElements[6].style.height = "200%";})},
+{origCount:188, fun:(function anonymous() {allElements[0].style.width = "20em";})},
+{origCount:189, fun:(function anonymous() {allElements[1].style.display = "table-row-group";})},
+{origCount:190, fun:(function anonymous() {allElements[3].style.visibility = "hidden";})},
+{origCount:191, fun:(function anonymous() {allElements[11].style.width = "10%";})},
+{origCount:192, fun:(function anonymous() {allElements[4].style.width = "200%";})},
+{origCount:193, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:194, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:195, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:196, fun:(function anonymous() {allElements[0].style.display = "table-column";})},
+{origCount:197, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:198, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:199, fun:(function anonymous() {allElements[6].style.clear = "none";})},
+{origCount:200, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:201, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:202, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:203, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:204, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:205, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:206, fun:(function anonymous() {allElements[1].style.clear = "right";})},
+{origCount:207, fun:(function anonymous() {allElements[5].style.display = "-moz-stack";})},
+{origCount:208, fun:(function anonymous() {allElements[3].style.color = "black";})},
+{origCount:209, fun:(function anonymous() {allElements[1].style.background = "transparent";})},
+{origCount:210, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:211, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:212, fun:(function anonymous() {allElements[4].style.width = "auto";})},
+{origCount:213, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:214, fun:(function anonymous() {allElements[10].style.display = "table-caption";})},
+{origCount:215, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:216, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:217, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:218, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:219, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:220, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:221, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:222, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:223, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:224, fun:(function anonymous() {allElements[5].style.background = "transparent";})},
+{origCount:225, fun:(function anonymous() {allElements[12].style.overflow = "hidden";})},
+{origCount:226, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:227, fun:(function anonymous() {allElements[7].style.height = "200%";})},
+{origCount:228, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:229, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:230, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:231, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:232, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:233, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:234, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:235, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:236, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:237, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:238, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:239, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:240, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:241, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:242, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:243, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:244, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:245, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:246, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:247, fun:(function anonymous() {allElements[2].style.position = "absolute";})},
+{origCount:248, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:249, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:250, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:251, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:252, fun:(function anonymous() {allElements[2].style.display = "block";})},
+{origCount:253, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:254, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:255, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:256, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:257, fun:(function anonymous() {allElements[0].style.height = "100px";})},
+{origCount:258, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:259, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:260, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:261, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:262, fun:(function anonymous() {allElements[10].style.width = "1px";})},
+{origCount:263, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:264, fun:(function anonymous() {allElements[7].style['float'] = "left";})},
+{origCount:265, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:266, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:267, fun:(function anonymous() {allElements[9].style.height = "auto";})},
+{origCount:268, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:269, fun:(function anonymous() {allElements[5].style.display = "table";})},
+{origCount:270, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:271, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:272, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:273, fun:(function anonymous() {allElements[6].style.height = "10%";})},
+{origCount:274, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:275, fun:(function anonymous() {allElements[6].style.display = "block";})},
+{origCount:276, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:277, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:278, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:279, fun:(function anonymous() {allElements[2].style.height = "10%";})},
+{origCount:280, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:281, fun:(function anonymous() {allElements[6].style.clear = "both";})},
+{origCount:282, fun:(function anonymous() {allElements[6].style.display = "-moz-box";})},
+{origCount:283, fun:(function anonymous() {allElements[3].style.height = "100px";})},
+{origCount:284, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:285, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:286, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:287, fun:(function anonymous() {allElements[5].style.height = "auto";})},
+{origCount:288, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:289, fun:(function anonymous() {allElements[5].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:290, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:291, fun:(function anonymous() {allElements[3].style.overflow = "auto";})},
+{origCount:292, fun:(function anonymous() {allElements[10].style.display = "-moz-stack";})},
+{origCount:293, fun:(function anonymous() {allElements[2].style.color = "red";})},
+{origCount:294, fun:(function anonymous() {allElements[0].style.display = "-moz-groupbox";})},
+{origCount:295, fun:(function anonymous() {allElements[7].style.position = "fixed";})},
+{origCount:296, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:297, fun:(function anonymous() {allElements[9].style.display = "-moz-box";})},
+{origCount:298, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:299, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:300, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:301, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:302, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:303, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:304, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:305, fun:(function anonymous() {allElements[8].style.width = "20em";})},
+{origCount:306, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:307, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:308, fun:(function anonymous() {allElements[2].style.display = "-moz-inline-box";})},
+{origCount:309, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:310, fun:(function anonymous() {allElements[7].style.display = "-moz-deck";})},
+{origCount:311, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:312, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:313, fun:(function anonymous() {allElements[6].style['float'] = "left";})},
+{origCount:314, fun:(function anonymous() {allElements[12].style.position = "static";})},
+{origCount:315, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:316, fun:(function anonymous() {allElements[8].style.visibility = "visible";})},
+{origCount:317, fun:(function anonymous() {allElements[8].style.background = "#fcd";})},
+{origCount:318, fun:(function anonymous() {allElements[1].style.visibility = "collapse";})},
+{origCount:319, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:320, fun:(function anonymous() {allElements[8].style.overflow = "hidden";})},
+{origCount:321, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:322, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:323, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:324, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:325, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:326, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:327, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:328, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:329, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:330, fun:(function anonymous() {allElements[8].style.visibility = "visible";})},
+{origCount:331, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:332, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:333, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:334, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:335, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:336, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-line";})},
+{origCount:337, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:338, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:339, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:340, fun:(function anonymous() {allElements[2].style.display = "-moz-groupbox";})},
+{origCount:341, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:342, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:343, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:344, fun:(function anonymous() {allElements[8].style.clear = "right";})},
+{origCount:345, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:346, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:347, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:348, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:349, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:350, fun:(function anonymous() {allElements[11].style.width = "10%";})},
+{origCount:351, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:352, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:353, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:354, fun:(function anonymous() {allElements[9].style.position = "static";})},
+{origCount:355, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:356, fun:(function anonymous() {allElements[1].style.position = "fixed";})},
+{origCount:357, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:358, fun:(function anonymous() {allElements[12].style.display = "block";})},
+{origCount:359, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-block";})},
+{origCount:360, fun:(function anonymous() {allElements[6].style.height = "100px";})},
+{origCount:361, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:362, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:363, fun:(function anonymous() {allElements[0].style.display = "-moz-grid-group";})},
+{origCount:364, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:365, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:366, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:367, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:368, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:369, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:370, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:371, fun:(function anonymous() {allElements[4].style.color = "red";})},
+{origCount:372, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:373, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:374, fun:(function anonymous() {allElements[2].style.width = "20em";})},
+{origCount:375, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:376, fun:(function anonymous() {allElements[12].style.position = "relative";})},
+{origCount:377, fun:(function anonymous() {allElements[0].style.display = "-moz-grid";})},
+{origCount:378, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:379, fun:(function anonymous() {allElements[8].style.color = "green";})},
+{origCount:380, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:381, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:382, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:383, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:384, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:385, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:386, fun:(function anonymous() {allElements[11].style.display = "table-row";})},
+{origCount:387, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:388, fun:(function anonymous() {allElements[2].style.height = "200%";})},
+{origCount:389, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:390, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:391, fun:(function anonymous() {allElements[4].style.position = "relative";})},
+{origCount:392, fun:(function anonymous() {allElements[7].style.position = "fixed";})},
+{origCount:393, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:394, fun:(function anonymous() {allElements[2].style.height = "200%";})},
+{origCount:395, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:396, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:397, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:398, fun:(function anonymous() {allElements[2].style.position = "static";})},
+{origCount:399, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:400, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:401, fun:(function anonymous() {allElements[10].style.color = "green";})},
+{origCount:402, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:403, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:404, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:405, fun:(function anonymous() {allElements[4].style.display = "block";})},
+{origCount:406, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:407, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:408, fun:(function anonymous() {allElements[0].style.position = "static";})},
+{origCount:409, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:410, fun:(function anonymous() {allElements[1].style.display = "-moz-grid-group";})},
+{origCount:411, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:412, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:413, fun:(function anonymous() {allElements[2].style.width = "auto";})},
+{origCount:414, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:415, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:416, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:417, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:418, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:419, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:420, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:421, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:422, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:423, fun:(function anonymous() {allElements[8].style.display = "-moz-inline-box";})},
+{origCount:424, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:425, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:426, fun:(function anonymous() {allElements[12].style.overflow = "scroll";})},
+{origCount:427, fun:(function anonymous() {allElements[4].style.height = "200%";})},
+{origCount:428, fun:(function anonymous() {allElements[12].style.visibility = "collapse";})},
+{origCount:429, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:430, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:431, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:432, fun:(function anonymous() {allElements[9].style.clear = "right";})},
+{origCount:433, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:434, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:435, fun:(function anonymous() {allElements[9].style.width = "10%";})},
+{origCount:436, fun:(function anonymous() {allElements[11].style.display = "table-column-group";})},
+{origCount:437, fun:(function anonymous() {allElements[0].style.visibility = "visible";})},
+{origCount:438, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:439, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:440, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:441, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:442, fun:(function anonymous() {allElements[3].style.color = "black";})},
+{origCount:443, fun:(function anonymous() {allElements[9].style.height = "200%";})},
+{origCount:444, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:445, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:446, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:447, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:448, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:449, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:450, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:451, fun:(function anonymous() {allElements[9].style.color = "blue";})},
+{origCount:452, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:453, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:454, fun:(function anonymous() {allElements[8].style.display = "table-cell";})},
+{origCount:455, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:456, fun:(function anonymous() {allElements[2].style.overflow = "auto";})},
+{origCount:457, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:458, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:459, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:460, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:461, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:462, fun:(function anonymous() {allElements[7].style.color = "blue";})},
+{origCount:463, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:464, fun:(function anonymous() {allElements[5].style.display = "-moz-popup";})},
+{origCount:465, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:466, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:467, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:468, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:469, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:470, fun:(function anonymous() {allElements[0].style.display = "table-row";})},
+{origCount:471, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:472, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:473, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:474, fun:(function anonymous() {allElements[1].style.color = "red";})},
+{origCount:475, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:476, fun:(function anonymous() {allElements[7].style.display = "-moz-grid";})},
+{origCount:477, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:478, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:479, fun:(function anonymous() {allElements[5].style.clear = "none";})},
+{origCount:480, fun:(function anonymous() {allElements[3].style.overflow = "hidden";})},
+{origCount:481, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:482, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:483, fun:(function anonymous() {allElements[11].style.height = "100px";})},
+{origCount:484, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:485, fun:(function anonymous() {allElements[7].style.display = "block";})},
+{origCount:486, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:487, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:488, fun:(function anonymous() {allElements[5].style.width = "200%";})},
+{origCount:489, fun:(function anonymous() {allElements[8].style['float'] = "right";})},
+{origCount:490, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:491, fun:(function anonymous() {allElements[8].style.display = "-moz-deck";})},
+{origCount:492, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:493, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:494, fun:(function anonymous() {allElements[8].style.overflow = "visible";})},
+{origCount:495, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:496, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:497, fun:(function anonymous() {allElements[8].style.clear = "right";})},
+{origCount:498, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:499, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:500, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:501, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:502, fun:(function anonymous() {allElements[0].style.display = "-moz-grid";})},
+{origCount:503, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:504, fun:(function anonymous() {allElements[12].style.visibility = "visible";})},
+{origCount:505, fun:(function anonymous() {allElements[8].style.background = "#fcd";})},
+{origCount:506, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:507, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:508, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:509, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:510, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:511, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:512, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:513, fun:(function anonymous() {allElements[11].style.display = "table-caption";})},
+{origCount:514, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:515, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:516, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:517, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:518, fun:(function anonymous() {allElements[12].style.overflow = "scroll";})},
+{origCount:519, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:520, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:521, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:522, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:523, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:524, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:525, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:526, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:527, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:528, fun:(function anonymous() {allElements[5].style.background = "transparent";})},
+{origCount:529, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:530, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:531, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:532, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:533, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:534, fun:(function anonymous() {allElements[10].style.width = "20em";})},
+{origCount:535, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:536, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:537, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:538, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:539, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:540, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:541, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:542, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:543, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:544, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:545, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:546, fun:(function anonymous() {allElements[4].style.width = "auto";})},
+{origCount:547, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:548, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:549, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:550, fun:(function anonymous() {allElements[1].style.height = "auto";})},
+{origCount:551, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:552, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:553, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:554, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:555, fun:(function anonymous() {allElements[8].style.color = "green";})},
+{origCount:556, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:557, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:558, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:559, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:560, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:561, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:562, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:563, fun:(function anonymous() {allElements[1].style.overflow = "hidden";})},
+{origCount:564, fun:(function anonymous() {allElements[6].style.display = "inline";})},
+{origCount:565, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:566, fun:(function anonymous() {allElements[7].style.visibility = "visible";})},
+{origCount:567, fun:(function anonymous() {allElements[1].style.color = "blue";})},
+{origCount:568, fun:(function anonymous() {allElements[1].style.clear = "both";})},
+{origCount:569, fun:(function anonymous() {allElements[0].style.position = "relative";})},
+{origCount:570, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:571, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:572, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:573, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:574, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:575, fun:(function anonymous() {allElements[12].style.display = "-moz-popup";})},
+{origCount:576, fun:(function anonymous() {allElements[2].style.position = "absolute";})},
+{origCount:577, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:578, fun:(function anonymous() {allElements[11].style.overflow = "visible";})},
+{origCount:579, fun:(function anonymous() {allElements[2].style.display = "-moz-inline-box";})},
+{origCount:580, fun:(function anonymous() {allElements[0].style.display = "-moz-popup";})},
+{origCount:581, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:582, fun:(function anonymous() {allElements[12].style.height = "10%";})},
+{origCount:583, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:584, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:585, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:586, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:587, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:588, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:589, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:590, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:591, fun:(function anonymous() {allElements[12].style.overflow = "visible";})},
+{origCount:592, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:593, fun:(function anonymous() {allElements[2].style.display = "table-cell";})},
+{origCount:594, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:595, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:596, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:597, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:598, fun:(function anonymous() {allElements[10].style.display = "inline";})},
+{origCount:599, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:600, fun:(function anonymous() {allElements[7].style.width = "10%";})},
+{origCount:601, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:602, fun:(function anonymous() {allElements[6].style.width = "10%";})},
+{origCount:603, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:604, fun:(function anonymous() {allElements[11].style.position = "static";})},
+{origCount:605, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:606, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:607, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:608, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:609, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:610, fun:(function anonymous() {allElements[11].style.overflow = "scroll";})},
+{origCount:611, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:612, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:613, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:614, fun:(function anonymous() {allElements[11].style.height = "auto";})},
+{origCount:615, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:616, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:617, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:618, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:619, fun:(function anonymous() {allElements[11].style.height = "10%";})},
+{origCount:620, fun:(function anonymous() {allElements[4].style.height = "200%";})},
+{origCount:621, fun:(function anonymous() {allElements[6].style.display = "-moz-popup";})},
+{origCount:622, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:623, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:624, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:625, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:626, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:627, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:628, fun:(function anonymous() {allElements[5].style.display = "list-item";})},
+{origCount:629, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:630, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:631, fun:(function anonymous() {allElements[11].style.clear = "both";})},
+{origCount:632, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:633, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:634, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:635, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:636, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:637, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:638, fun:(function anonymous() {allElements[6].style.display = "table-header-group";})},
+{origCount:639, fun:(function anonymous() {allElements[10].style.display = "-moz-box";})},
+{origCount:640, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:641, fun:(function anonymous() {allElements[6].style.width = "200%";})},
+{origCount:642, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:643, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:644, fun:(function anonymous() {allElements[8].style.width = "1px";})},
+{origCount:645, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:646, fun:(function anonymous() {allElements[2].style.display = "table-row-group";})},
+{origCount:647, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:648, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:649, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:650, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:651, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:652, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:653, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:654, fun:(function anonymous() {allElements[2].style.clear = "none";})},
+{origCount:655, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:656, fun:(function anonymous() {allElements[10].style.width = "200%";})},
+{origCount:657, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:658, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:659, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:660, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:661, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:662, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:663, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:664, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:665, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:666, fun:(function anonymous() {allElements[4].style.width = "1px";})},
+{origCount:667, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:668, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:669, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:670, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:671, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:672, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:673, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:674, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:675, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:676, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:677, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:678, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:679, fun:(function anonymous() {allElements[7].style.position = "relative";})},
+{origCount:680, fun:(function anonymous() {allElements[1].style.background = "transparent";})},
+{origCount:681, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:682, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:683, fun:(function anonymous() {allElements[0].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:684, fun:(function anonymous() {allElements[7].style.display = "-moz-grid-line";})},
+{origCount:685, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:686, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:687, fun:(function anonymous() {allElements[3].style.background = "#fcd";})},
+{origCount:688, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:689, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:690, fun:(function anonymous() {allElements[10].style.display = "table-cell";})},
+{origCount:691, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:692, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:693, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:694, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:695, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:696, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:697, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:698, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:699, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:700, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:701, fun:(function anonymous() {allElements[10].style.display = "-moz-deck";})},
+{origCount:702, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:703, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:704, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:705, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:706, fun:(function anonymous() {allElements[8].style.overflow = "hidden";})},
+{origCount:707, fun:(function anonymous() {allElements[11].style.display = "-moz-grid-group";})},
+{origCount:708, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:709, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:710, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:711, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:712, fun:(function anonymous() {allElements[2].style.clear = "left";})},
+{origCount:713, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:714, fun:(function anonymous() {allElements[11].style.display = "table-header-group";})},
+{origCount:715, fun:(function anonymous() {allElements[8].style.height = "2em";})},
+{origCount:716, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:717, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:718, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:719, fun:(function anonymous() {allElements[10].style.height = "2em";})},
+{origCount:720, fun:(function anonymous() {allElements[8].style.width = "auto";})},
+{origCount:721, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:722, fun:(function anonymous() {allElements[9].style.display = "table-row-group";})},
+{origCount:723, fun:(function anonymous() {allElements[8].style.overflow = "scroll";})},
+{origCount:724, fun:(function anonymous() {allElements[2].style.display = "table-caption";})},
+{origCount:725, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:726, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:727, fun:(function anonymous() {allElements[12].style.position = "absolute";})},
+{origCount:728, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:729, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:730, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:731, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:732, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:733, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:734, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:735, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:736, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:737, fun:(function anonymous() {allElements[12].style.height = "10%";})},
+{origCount:738, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:739, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:740, fun:(function anonymous() {allElements[7].style.visibility = "hidden";})},
+{origCount:741, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:742, fun:(function anonymous() {allElements[11].style.display = "-moz-inline-box";})},
+{origCount:743, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:744, fun:(function anonymous() {allElements[0].style.display = "-moz-box";})},
+{origCount:745, fun:(function anonymous() {allElements[11].style.clear = "both";})},
+{origCount:746, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:747, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:748, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:749, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:750, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:751, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:752, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:753, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:754, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:755, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:756, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:757, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:758, fun:(function anonymous() {allElements[8].style.color = "black";})},
+{origCount:759, fun:(function anonymous() {allElements[0].style.position = "relative";})},
+{origCount:760, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:761, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:762, fun:(function anonymous() {allElements[0].style.visibility = "collapse";})},
+{origCount:763, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:764, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:765, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:766, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:767, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:768, fun:(function anonymous() {allElements[1].style.display = "table-cell";})},
+{origCount:769, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:770, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:771, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:772, fun:(function anonymous() {allElements[6].style.display = "-moz-inline-box";})},
+{origCount:773, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:774, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:775, fun:(function anonymous() {allElements[0].style.clear = "left";})},
+{origCount:776, fun:(function anonymous() {allElements[12].style.display = "table-cell";})},
+{origCount:777, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:778, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:779, fun:(function anonymous() {allElements[3].style.overflow = "scroll";})},
+{origCount:780, fun:(function anonymous() {allElements[2].style.width = "1px";})},
+{origCount:781, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:782, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:783, fun:(function anonymous() {allElements[3].style.color = "green";})},
+{origCount:784, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:785, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:786, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:787, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:788, fun:(function anonymous() {allElements[6].style.overflow = "scroll";})},
+{origCount:789, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:790, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-line";})},
+{origCount:791, fun:(function anonymous() {allElements[2].style.visibility = "collapse";})},
+{origCount:792, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:793, fun:(function anonymous() {allElements[11].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:794, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:795, fun:(function anonymous() {allElements[5].style.display = "table-column";})},
+{origCount:796, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:797, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:798, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:799, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:800, fun:(function anonymous() {allElements[8].style.overflow = "visible";})},
+{origCount:801, fun:(function anonymous() {allElements[10].style.height = "100px";})},
+{origCount:802, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:803, fun:(function anonymous() {allElements[9].style.color = "black";})},
+{origCount:804, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:805, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:806, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:807, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:808, fun:(function anonymous() {allElements[4].style.overflow = "visible";})},
+{origCount:809, fun:(function anonymous() {allElements[5].style.display = "table-row";})},
+{origCount:810, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:811, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:812, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:813, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:814, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:815, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:816, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:817, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:818, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:819, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:820, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:821, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:822, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:823, fun:(function anonymous() {allElements[9].style.position = "static";})},
+{origCount:824, fun:(function anonymous() {allElements[11].style.position = "absolute";})},
+{origCount:825, fun:(function anonymous() {allElements[9].style.width = "200%";})},
+{origCount:826, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:827, fun:(function anonymous() {allElements[11].style.position = "static";})},
+{origCount:828, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:829, fun:(function anonymous() {allElements[5].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:830, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:831, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:832, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:833, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:834, fun:(function anonymous() {allElements[3].style.overflow = "scroll";})},
+{origCount:835, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:836, fun:(function anonymous() {allElements[0].style.position = "static";})},
+{origCount:837, fun:(function anonymous() {allElements[8].style.display = "-moz-grid-line";})},
+{origCount:838, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:839, fun:(function anonymous() {allElements[5].style.width = "1px";})},
+{origCount:840, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:841, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:842, fun:(function anonymous() {allElements[6].style.display = "table-column";})},
+{origCount:843, fun:(function anonymous() {allElements[7].style.visibility = "visible";})},
+{origCount:844, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:845, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:846, fun:(function anonymous() {allElements[5].style.display = "table-column";})},
+{origCount:847, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:848, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:849, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:850, fun:(function anonymous() {allElements[9].style.overflow = "scroll";})},
+{origCount:851, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:852, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:853, fun:(function anonymous() {allElements[5].style.clear = "none";})},
+{origCount:854, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:855, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:856, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:857, fun:(function anonymous() {allElements[8].style.width = "10%";})},
+{origCount:858, fun:(function anonymous() {allElements[4].style.color = "red";})},
+{origCount:859, fun:(function anonymous() {allElements[9].style.height = "10%";})},
+{origCount:860, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:861, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:862, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:863, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:864, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:865, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:866, fun:(function anonymous() {allElements[6].style.width = "auto";})},
+{origCount:867, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:868, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-block";})},
+{origCount:869, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:870, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:871, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:872, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:873, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:874, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:875, fun:(function anonymous() {allElements[1].style['float'] = "right";})},
+{origCount:876, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:877, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:878, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:879, fun:(function anonymous() {allElements[11].style.display = "inline";})},
+{origCount:880, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:881, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:882, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:883, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:884, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:885, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:886, fun:(function anonymous() {allElements[0].style.display = "list-item";})},
+{origCount:887, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:888, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:889, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:890, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:891, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:892, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:893, fun:(function anonymous() {allElements[11].style.position = "absolute";})},
+{origCount:894, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:895, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:896, fun:(function anonymous() {allElements[10].style.display = "-moz-box";})},
+{origCount:897, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:898, fun:(function anonymous() {allElements[1].style.overflow = "scroll";})},
+{origCount:899, fun:(function anonymous() {allElements[3].style.width = "10%";})},
+{origCount:900, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:901, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:902, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:903, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:904, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:905, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:906, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:907, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:908, fun:(function anonymous() {allElements[12].style.display = "table-row";})},
+{origCount:909, fun:(function anonymous() {allElements[5].style.height = "10%";})},
+{origCount:910, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:911, fun:(function anonymous() {allElements[10].style.display = "-moz-stack";})},
+{origCount:912, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:913, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:914, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:915, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:916, fun:(function anonymous() {allElements[8].style.display = "table-header-group";})},
+{origCount:917, fun:(function anonymous() {allElements[12].style.display = "-moz-grid-group";})},
+{origCount:918, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:919, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:920, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:921, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:922, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:923, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:924, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:925, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:926, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:927, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:928, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:929, fun:(function anonymous() {allElements[0].style.clear = "left";})},
+{origCount:930, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:931, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:932, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:933, fun:(function anonymous() {allElements[4].style.width = "1px";})},
+{origCount:934, fun:(function anonymous() {allElements[5].style.display = "table-row";})},
+{origCount:935, fun:(function anonymous() {allElements[12].style.height = "2em";})},
+{origCount:936, fun:(function anonymous() {allElements[4].style.visibility = "collapse";})},
+{origCount:937, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:938, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:939, fun:(function anonymous() {allElements[11].style.overflow = "scroll";})},
+{origCount:940, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:941, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:942, fun:(function anonymous() {allElements[0].style.width = "20em";})},
+{origCount:943, fun:(function anonymous() {allElements[1].style.overflow = "scroll";})},
+{origCount:944, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:945, fun:(function anonymous() {allElements[3].style.display = "table";})},
+{origCount:946, fun:(function anonymous() {allElements[2].style.display = "table-footer-group";})},
+{origCount:947, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:948, fun:(function anonymous() {allElements[9].style.display = "-moz-inline-block";})},
+{origCount:949, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:950, fun:(function anonymous() {allElements[4].style.overflow = "visible";})},
+{origCount:951, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:952, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:953, fun:(function anonymous() {allElements[2].style.height = "auto";})},
+{origCount:954, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:955, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:956, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:957, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:958, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:959, fun:(function anonymous() {allElements[9].style.position = "fixed";})},
+{origCount:960, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:961, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:962, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:963, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:964, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:965, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:966, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:967, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:968, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:969, fun:(function anonymous() {allElements[2].style.clear = "both";})},
+{origCount:970, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:971, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:972, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:973, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:974, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:975, fun:(function anonymous() {allElements[2].style.position = "relative";})},
+{origCount:976, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:977, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:978, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:979, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:980, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:981, fun:(function anonymous() {allElements[1].style.color = "blue";})},
+{origCount:982, fun:(function anonymous() {allElements[6].style.height = "100px";})},
+{origCount:983, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:984, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:985, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:986, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:987, fun:(function anonymous() {allElements[0].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:988, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:989, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:990, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:991, fun:(function anonymous() {allElements[2].style.clear = "left";})},
+{origCount:992, fun:(function anonymous() {allElements[8].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:993, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:994, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:995, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:996, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:997, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:998, fun:(function anonymous() {allElements[12].style.position = "fixed";})},
+{origCount:999, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:1000, fun:(function anonymous() {allElements[6].style.display = "-moz-box";})},
+{origCount:1001, fun:(function anonymous() {allElements[5].style.overflow = "auto";})},
+{origCount:1002, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:1003, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:1004, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:1005, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1006, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1007, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:1008, fun:(function anonymous() {allElements[7].style.overflow = "scroll";})},
+{origCount:1009, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:1010, fun:(function anonymous() {allElements[3].style.overflow = "hidden";})},
+{origCount:1011, fun:(function anonymous() {allElements[7].style.display = "table-header-group";})},
+{origCount:1012, fun:(function anonymous() {allElements[5].style.display = "-moz-box";})},
+{origCount:1013, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:1014, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:1015, fun:(function anonymous() {allElements[2].style.overflow = "auto";})},
+{origCount:1016, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1017, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:1018, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:1019, fun:(function anonymous() {allElements[11].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1020, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:1021, fun:(function anonymous() {allElements[3].style.clear = "both";})},
+{origCount:1022, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:1023, fun:(function anonymous() {allElements[4].style.overflow = "auto";})},
+{origCount:1024, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1025, fun:(function anonymous() {allElements[7].style.display = "table";})},
+{origCount:1026, fun:(function anonymous() {allElements[6].style.color = "blue";})},
+{origCount:1027, fun:(function anonymous() {allElements[2].style.color = "black";})},
+{origCount:1028, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:1029, fun:(function anonymous() {allElements[8].style['float'] = "right";})},
+{origCount:1030, fun:(function anonymous() {allElements[2].style.display = "-moz-grid-group";})},
+{origCount:1031, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1032, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:1033, fun:(function anonymous() {allElements[1].style.clear = "both";})},
+{origCount:1034, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:1035, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:1036, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:1037, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:1038, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1039, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:1040, fun:(function anonymous() {allElements[7].style.height = "200%";})},
+{origCount:1041, fun:(function anonymous() {allElements[11].style.width = "200%";})},
+{origCount:1042, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1043, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:1044, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:1045, fun:(function anonymous() {allElements[7].style.width = "10%";})},
+{origCount:1046, fun:(function anonymous() {allElements[2].style.height = "100px";})},
+{origCount:1047, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:1048, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:1049, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:1050, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:1051, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1052, fun:(function anonymous() {allElements[9].style.height = "auto";})},
+{origCount:1053, fun:(function anonymous() {allElements[11].style.display = "-moz-grid";})},
+{origCount:1054, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:1055, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:1056, fun:(function anonymous() {allElements[0].style.height = "100px";})},
+{origCount:1057, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1058, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:1059, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:1060, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-box";})},
+{origCount:1061, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1062, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1063, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:1064, fun:(function anonymous() {allElements[7].style.overflow = "auto";})},
+{origCount:1065, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1066, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:1067, fun:(function anonymous() {allElements[11].style.height = "200%";})},
+{origCount:1068, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:1069, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:1070, fun:(function anonymous() {allElements[11].style.display = "-moz-groupbox";})},
+{origCount:1071, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:1072, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:1073, fun:(function anonymous() {allElements[10].style.width = "auto";})},
+{origCount:1074, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:1075, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1076, fun:(function anonymous() {allElements[0].style.width = "200%";})},
+{origCount:1077, fun:(function anonymous() {allElements[10].style.clear = "left";})},
+{origCount:1078, fun:(function anonymous() {allElements[7].style.display = "-moz-deck";})},
+{origCount:1079, fun:(function anonymous() {allElements[9].style.color = "green";})},
+{origCount:1080, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:1081, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:1082, fun:(function anonymous() {allElements[2].style.position = "fixed";})},
+{origCount:1083, fun:(function anonymous() {allElements[3].style.height = "100px";})},
+{origCount:1084, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:1085, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:1086, fun:(function anonymous() {allElements[6].style.clear = "both";})},
+{origCount:1087, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1088, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:1089, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:1090, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:1091, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:1092, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:1093, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1094, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:1095, fun:(function anonymous() {allElements[1].style.display = "-moz-deck";})},
+{origCount:1096, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:1097, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:1098, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:1099, fun:(function anonymous() {allElements[3].style.color = "green";})},
+{origCount:1100, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:1101, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:1102, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:1103, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:1104, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:1105, fun:(function anonymous() {allElements[2].style.clear = "none";})},
+{origCount:1106, fun:(function anonymous() {allElements[10].style.color = "blue";})},
+{origCount:1107, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:1108, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:1109, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1110, fun:(function anonymous() {allElements[7].style.display = "-moz-grid-group";})},
+{origCount:1111, fun:(function anonymous() {allElements[12].style.overflow = "visible";})},
+{origCount:1112, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1113, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1114, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:1115, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:1116, fun:(function anonymous() {allElements[11].style.display = "table-caption";})},
+{origCount:1117, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:1118, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:1119, fun:(function anonymous() {allElements[8].style.background = "transparent";})},
+{origCount:1120, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1121, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1122, fun:(function anonymous() {allElements[1].style.display = "list-item";})},
+{origCount:1123, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:1124, fun:(function anonymous() {allElements[8].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1125, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:1126, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:1127, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:1128, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:1129, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:1130, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:1131, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:1132, fun:(function anonymous() {allElements[4].style.width = "10%";})},
+{origCount:1133, fun:(function anonymous() {allElements[2].style.display = "-moz-grid";})},
+{origCount:1134, fun:(function anonymous() {allElements[4].style.height = "100px";})},
+{origCount:1135, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:1136, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:1137, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:1138, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1139, fun:(function anonymous() {allElements[3].style.display = "table-cell";})},
+{origCount:1140, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1141, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:1142, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:1143, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:1144, fun:(function anonymous() {allElements[7].style.display = "-moz-inline-block";})},
+{origCount:1145, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:1146, fun:(function anonymous() {allElements[2].style.visibility = "collapse";})},
+{origCount:1147, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:1148, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1149, fun:(function anonymous() {allElements[6].style.width = "1px";})},
+{origCount:1150, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:1151, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:1152, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:1153, fun:(function anonymous() {allElements[2].style.width = "20em";})},
+{origCount:1154, fun:(function anonymous() {allElements[0].style.display = "-moz-popup";})},
+{origCount:1155, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:1156, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1157, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:1158, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:1159, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:1160, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1161, fun:(function anonymous() {allElements[6].style.display = "block";})},
+{origCount:1162, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:1163, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:1164, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:1165, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:1166, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:1167, fun:(function anonymous() {allElements[10].style.width = "200%";})},
+{origCount:1168, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:1169, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:1170, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1171, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1172, fun:(function anonymous() {allElements[11].style.visibility = "visible";})},
+{origCount:1173, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1174, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:1175, fun:(function anonymous() {allElements[12].style.position = "fixed";})},
+{origCount:1176, fun:(function anonymous() {allElements[5].style.display = "table-column-group";})},
+{origCount:1177, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:1178, fun:(function anonymous() {allElements[9].style.overflow = "hidden";})},
+{origCount:1179, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:1180, fun:(function anonymous() {allElements[4].style.position = "relative";})},
+{origCount:1181, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:1182, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:1183, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1184, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:1185, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:1186, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:1187, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1188, fun:(function anonymous() {allElements[1].style.position = "fixed";})},
+{origCount:1189, fun:(function anonymous() {allElements[9].style.width = "1px";})},
+{origCount:1190, fun:(function anonymous() {allElements[0].style.color = "blue";})},
+{origCount:1191, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:1192, fun:(function anonymous() {allElements[4].style.overflow = "hidden";})},
+{origCount:1193, fun:(function anonymous() {allElements[2].style.position = "relative";})},
+{origCount:1194, fun:(function anonymous() {allElements[4].style.position = "absolute";})},
+{origCount:1195, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:1196, fun:(function anonymous() {allElements[7].style.color = "black";})},
+{origCount:1197, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1198, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1199, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:1200, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1201, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:1202, fun:(function anonymous() {allElements[12].style.position = "static";})},
+{origCount:1203, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1204, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:1205, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:1206, fun:(function anonymous() {allElements[7].style.clear = "right";})},
+{origCount:1207, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1208, fun:(function anonymous() {allElements[4].style.display = "list-item";})},
+{origCount:1209, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1210, fun:(function anonymous() {allElements[7].style['float'] = "left";})},
+{origCount:1211, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:1212, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:1213, fun:(function anonymous() {allElements[9].style.clear = "right";})},
+{origCount:1214, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:1215, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:1216, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1217, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1218, fun:(function anonymous() {allElements[5].style.position = "relative";})},
+{origCount:1219, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:1220, fun:(function anonymous() {allElements[10].style.overflow = "visible";})},
+{origCount:1221, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1222, fun:(function anonymous() {allElements[8].style.visibility = "hidden";})},
+{origCount:1223, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:1224, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1225, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:1226, fun:(function anonymous() {allElements[12].style['float'] = "left";})},
+{origCount:1227, fun:(function anonymous() {allElements[9].style.display = "list-item";})},
+{origCount:1228, fun:(function anonymous() {allElements[1].style.width = "20em";})},
+{origCount:1229, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1230, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:1231, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:1232, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:1233, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:1234, fun:(function anonymous() {allElements[5].style.display = "table-cell";})},
+{origCount:1235, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1236, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:1237, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:1238, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:1239, fun:(function anonymous() {allElements[7].style.overflow = "auto";})},
+{origCount:1240, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1241, fun:(function anonymous() {allElements[9].style.visibility = "visible";})},
+{origCount:1242, fun:(function anonymous() {allElements[2].style.display = "-moz-deck";})},
+{origCount:1243, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:1244, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1245, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:1246, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:1247, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:1248, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:1249, fun:(function anonymous() {allElements[3].style.clear = "both";})},
+{origCount:1250, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:1251, fun:(function anonymous() {allElements[0].style.overflow = "visible";})},
+{origCount:1252, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:1253, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:1254, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:1255, fun:(function anonymous() {allElements[1].style.overflow = "hidden";})},
+{origCount:1256, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:1257, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:1258, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1259, fun:(function anonymous() {allElements[3].style.overflow = "auto";})},
+{origCount:1260, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:1261, fun:(function anonymous() {allElements[10].style.width = "auto";})},
+{origCount:1262, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:1263, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:1264, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:1265, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1266, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:1267, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:1268, fun:(function anonymous() {allElements[5].style.position = "fixed";})},
+{origCount:1269, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:1270, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:1271, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1272, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:1273, fun:(function anonymous() {allElements[12].style.clear = "both";})},
+{origCount:1274, fun:(function anonymous() {allElements[11].style.visibility = "visible";})},
+{origCount:1275, fun:(function anonymous() {allElements[11].style.position = "fixed";})},
+{origCount:1276, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1277, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:1278, fun:(function anonymous() {allElements[10].style.display = "list-item";})},
+{origCount:1279, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:1280, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:1281, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:1282, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:1283, fun:(function anonymous() {allElements[0].style.height = "10%";})},
+{origCount:1284, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:1285, fun:(function anonymous() {allElements[10].style.clear = "both";})},
+{origCount:1286, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:1287, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:1288, fun:(function anonymous() {allElements[9].style.display = "-moz-box";})},
+{origCount:1289, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:1290, fun:(function anonymous() {allElements[8].style.color = "black";})},
+{origCount:1291, fun:(function anonymous() {allElements[1].style['float'] = "right";})},
+{origCount:1292, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:1293, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:1294, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:1295, fun:(function anonymous() {allElements[12].style.color = "red";})},
+{origCount:1296, fun:(function anonymous() {allElements[6].style.display = "-moz-inline-block";})},
+{origCount:1297, fun:(function anonymous() {allElements[4].style.width = "10%";})},
+{origCount:1298, fun:(function anonymous() {allElements[11].style.height = "2em";})},
+{origCount:1299, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:1300, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:1301, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:1302, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:1303, fun:(function anonymous() {allElements[5].style.overflow = "auto";})},
+{origCount:1304, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:1305, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:1306, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1307, fun:(function anonymous() {allElements[6].style['float'] = "left";})},
+{origCount:1308, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:1309, fun:(function anonymous() {allElements[6].style.clear = "none";})},
+{origCount:1310, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1311, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-group";})},
+{origCount:1312, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1313, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:1314, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:1315, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:1316, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:1317, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:1318, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:1319, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:1320, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:1321, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1322, fun:(function anonymous() {allElements[6].style.display = "-moz-deck";})},
+{origCount:1323, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:1324, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:1325, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:1326, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:1327, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:1328, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:1329, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:1330, fun:(function anonymous() {allElements[6].style.overflow = "visible";})},
+{origCount:1331, fun:(function anonymous() {allElements[8].style.width = "auto";})},
+{origCount:1332, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:1333, fun:(function anonymous() {allElements[11].style.width = "200%";})},
+{origCount:1334, fun:(function anonymous() {allElements[10].style.visibility = "collapse";})},
+{origCount:1335, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:1336, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:1337, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1338, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:1339, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:1340, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:1341, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:1342, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:1343, fun:(function anonymous() {allElements[2].style.display = "-moz-box";})},
+{origCount:1344, fun:(function anonymous() {allElements[12].style.color = "red";})},
+{origCount:1345, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:1346, fun:(function anonymous() {allElements[10].style.clear = "left";})},
+{origCount:1347, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:1348, fun:(function anonymous() {allElements[0].style.visibility = "collapse";})},
+{origCount:1349, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:1350, fun:(function anonymous() {allElements[0].style.position = "absolute";})},
+{origCount:1351, fun:(function anonymous() {allElements[6].style.display = "-moz-grid-group";})},
+{origCount:1352, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:1353, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:1354, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1355, fun:(function anonymous() {allElements[5].style.display = "table-footer-group";})},
+{origCount:1356, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:1357, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:1358, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:1359, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:1360, fun:(function anonymous() {allElements[3].style.background = "#fcd";})},
+{origCount:1361, fun:(function anonymous() {allElements[5].style.display = "block";})},
+{origCount:1362, fun:(function anonymous() {allElements[11].style.width = "1px";})},
+{origCount:1363, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:1364, fun:(function anonymous() {allElements[8].style.display = "table-column";})},
+{origCount:1365, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:1366, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:1367, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:1368, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:1369, fun:(function anonymous() {allElements[5].style.width = "200%";})},
+{origCount:1370, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:1371, fun:(function anonymous() {allElements[2].style.color = "red";})},
+{origCount:1372, fun:(function anonymous() {allElements[2].style.width = "auto";})},
+{origCount:1373, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1374, fun:(function anonymous() {allElements[5].style.width = "10%";})},
+{origCount:1375, fun:(function anonymous() {allElements[6].style.overflow = "visible";})},
+{origCount:1376, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-block";})},
+{origCount:1377, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:1378, fun:(function anonymous() {allElements[7].style.display = "inline";})},
+{origCount:1379, fun:(function anonymous() {allElements[11].style.position = "fixed";})},
+{origCount:1380, fun:(function anonymous() {allElements[1].style.display = "-moz-stack";})},
+{origCount:1381, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:1382, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:1383, fun:(function anonymous() {allElements[0].style.height = "10%";})},
+{origCount:1384, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:1385, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:1386, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1387, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:1388, fun:(function anonymous() {allElements[7].style.width = "auto";})},
+{origCount:1389, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:1390, fun:(function anonymous() {allElements[12].style.width = "10%";})},
+{origCount:1391, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1392, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1393, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:1394, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1395, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1396, fun:(function anonymous() {allElements[0].style.height = "200%";})},
+{origCount:1397, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:1398, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:1399, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:1400, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:1401, fun:(function anonymous() {allElements[7].style.display = "-moz-box";})},
+{origCount:1402, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:1403, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:1404, fun:(function anonymous() {allElements[10].style.height = "100px";})},
+{origCount:1405, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:1406, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:1407, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:1408, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:1409, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:1410, fun:(function anonymous() {allElements[0].style.height = "200%";})},
+{origCount:1411, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:1412, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:1413, fun:(function anonymous() {allElements[6].style.color = "green";})},
+{origCount:1414, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1415, fun:(function anonymous() {allElements[7].style.overflow = "visible";})}
+
+ ];
+
+
+var output = eval(commands.toSource().replace(/anonymous/g,"")).toSource().replace( /\)\},/g , ")},\n");
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-311792-01.js b/js/src/tests/non262/extensions/regress-311792-01.js
new file mode 100644
index 0000000000..8579b7c933
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311792-01.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311792;
+var summary = 'Root Array.prototype methods';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function index_getter()
+{
+ gc();
+ return 100;
+}
+
+var a = [0, 1];
+a.__defineGetter__(0, index_getter);
+
+a.slice(0, 1).join();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-311792-02.js b/js/src/tests/non262/extensions/regress-311792-02.js
new file mode 100644
index 0000000000..3b01415598
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311792-02.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311792;
+var summary = 'Root Array.prototype methods';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var subverted = 0;
+
+function index_getter()
+{
+ delete a[0];
+ gc();
+ for (var i = 0; i != 1 << 14; ++i) {
+ var tmp = new String("test");
+ tmp = null;
+ }
+ return 1;
+}
+
+function index_setter(value)
+{
+ subverted = value;
+}
+
+var a = [ Math.sqrt(2), 0 ];
+a.__defineGetter__(1, index_getter);
+a.__defineSetter__(1, index_setter);
+
+a.reverse();
+printStatus(subverted)
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-313763.js b/js/src/tests/non262/extensions/regress-313763.js
new file mode 100644
index 0000000000..c5ecfb2d8e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-313763.js
@@ -0,0 +1,46 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313763;
+var summary = 'Root jsarray.c creatures';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+printStatus ('This bug requires TOO_MUCH_GC');
+
+var N = 0x80000002;
+var array = Array(N);
+array[N - 1] = 1;
+array[N - 2] = 2;
+
+// Set getter not to wait until engine loops through 2^31 holes in the array.
+var LOOP_TERMINATOR = "stop_long_loop";
+array.__defineGetter__(N - 2, function() {
+ throw "stop_long_loop";
+ });
+
+var prepared_string = String(1);
+array.__defineGetter__(N - 1, function() {
+ var tmp = prepared_string;
+ prepared_string = null;
+ return tmp;
+ })
+
+
+ try {
+ array.unshift(1);
+ } catch (e) {
+ if (e !== LOOP_TERMINATOR)
+ throw e;
+ }
+
+var expect = "1";
+var actual = array[N];
+printStatus(expect === actual);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-314874.js b/js/src/tests/non262/extensions/regress-314874.js
new file mode 100644
index 0000000000..867e127044
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-314874.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 314874;
+var summary = 'Function.call/apply with non-primitive argument';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var thisArg = { valueOf: function() { return {a: 'a', b: 'b'}; } };
+
+ var f = function () { return (this); };
+
+ expect = f.call(thisArg);
+
+ thisArg.f = f;
+
+ actual = thisArg.f();
+
+ delete thisArg.f;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-315509-02.js b/js/src/tests/non262/extensions/regress-315509-02.js
new file mode 100644
index 0000000000..40e64b7ea4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-315509-02.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 315509;
+var summary = 'Array.prototype.unshift do not crash on Arrays with holes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function x1() {
+ var a = new Array(1);
+ a.unshift(1);
+}
+function x2() {
+ var a = new Array(1);
+ a.unshift.call(a, 1);
+}
+function x3() {
+ var a = new Array(1);
+ a.x = a.unshift;
+ a.x(1);
+}
+function x4() {
+ var a = new Array(1);
+ a.__defineSetter__("x", a.unshift);
+ a.x = 1;
+}
+
+for (var i = 0; i < 10; i++)
+{
+ x1();
+ x2();
+ x3();
+ x4();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-319683.js b/js/src/tests/non262/extensions/regress-319683.js
new file mode 100644
index 0000000000..47e0e8042d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-319683.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319683;
+var summary = 'Do not crash in call_enumerate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function crash(){
+ function f(){
+ var x;
+ function g(){
+ x=1; //reference anything here or will not crash.
+ }
+ }
+
+ //apply an object to the __proto__ attribute
+ f.__proto__={};
+
+ //the following call will cause crash
+ f();
+}
+
+crash();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-320854.js b/js/src/tests/non262/extensions/regress-320854.js
new file mode 100644
index 0000000000..8486924d60
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-320854.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 320854;
+var summary = 'o.hasOwnProperty("length") should not lie when o has function in proto chain';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {__proto__:function(){}};
+
+expect = false;
+actual = o.hasOwnProperty('length')
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-327170.js b/js/src/tests/non262/extensions/regress-327170.js
new file mode 100644
index 0000000000..f9f63be4b2
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-327170.js
@@ -0,0 +1,25 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 327170;
+var summary = 'Reuse of RegExp in string.replace(rx.compile(...), function() { rx.compile(...); }) causes a crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var g_rx = /(?:)/;
+
+"this is a test-string".replace(g_rx.compile("test", "g"),
+ function()
+ {
+ // re-use of the g_rx RegExp object,
+ // that's currently in use by the replace fn.
+ g_rx.compile("string", "g");
+ });
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-327608.js b/js/src/tests/non262/extensions/regress-327608.js
new file mode 100644
index 0000000000..64162d6741
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-327608.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 327608;
+var summary = 'Do not assume we will find the prototype property';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print('This test runs only in the browser');
+
+function countProps(obj)
+{
+ var c;
+ for (var prop in obj)
+ ++c;
+ return c;
+}
+
+function init()
+{
+ var inp = document.getElementsByTagName("input")[0];
+ countProps(inp);
+ gc();
+ var blurfun = inp.blur;
+ blurfun.__proto__ = null;
+ countProps(blurfun);
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+document.write('<input>');
+window.addEventListener("load", init, false);
diff --git a/js/src/tests/non262/extensions/regress-328443.js b/js/src/tests/non262/extensions/regress-328443.js
new file mode 100644
index 0000000000..897ee8fc1b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-328443.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328443;
+var summary = 'Uncatchable exception with |new (G.call) (F);| when F proto is null';
+var actual = '';
+var expect = 'Exception caught';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var F = (function(){});
+F.__proto__ = null;
+
+var G = (function(){});
+
+var z;
+
+z = "uncatchable exception!!!";
+try {
+ new (G.call) (F);
+
+ actual = "No exception";
+} catch (er) {
+ actual = "Exception caught";
+ printStatus("Exception was caught: " + er);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-330569.js b/js/src/tests/non262/extensions/regress-330569.js
new file mode 100644
index 0000000000..57114781a6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-330569.js
@@ -0,0 +1,91 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330569;
+var summary = 'RegExp - throw InternalError on too complex regular expressions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var s;
+ expect = 'InternalError: regular expression too complex';
+
+ s = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' +
+ '<html>\n' +
+ '<head>\n' +
+ '<meta http-equiv="content-type" content="text/html; charset=windows-1250">\n' +
+ '<meta name="generator" content="PSPad editor, www.pspad.com">\n' +
+ '<title></title>\n'+
+ '</head>\n' +
+ '<body>\n' +
+ '<!-- hello -->\n' +
+ '<script language="JavaScript">\n' +
+ 'var s = document. body. innerHTML;\n' +
+ 'var d = s. replace (/<!--(.*|\n)*-->/, "");\n' +
+ 'alert (d);\n' +
+ '</script>\n' +
+ '</body>\n' +
+ '</html>\n';
+
+ try
+ {
+ /<!--(.*|\n)*-->/.exec(s);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': /<!--(.*|\\n)*-->/.exec(s)');
+
+ function testre( re, n ) {
+ for ( var i= 0; i <= n; ++i ) {
+ re.test( Array( i+1 ).join() );
+ }
+ }
+
+ try
+ {
+ testre( /(?:,*)*x/, 22 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': testre( /(?:,*)*x/, 22 )');
+
+ try
+ {
+ testre( /(?:,|,)*x/, 22 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': testre( /(?:,|,)*x/, 22 )');
+
+ try
+ {
+ testre( /(?:,|,|,|,|,)*x/, 10 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': testre( /(?:,|,|,|,|,)*x/, 10 )');
+}
diff --git a/js/src/tests/non262/extensions/regress-333541.js b/js/src/tests/non262/extensions/regress-333541.js
new file mode 100644
index 0000000000..d577ad9124
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-333541.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 333541;
+var summary = '1..toSource()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function a(){
+ return 1..toSource();
+}
+
+try
+{
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = a.toString();
+ compareSource(expect, actual, summary + ': 1');
+}
+catch(ex)
+{
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 1');
+}
+
+if (Function.prototype.toSource) {
+ try
+ {
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = a.toSource();
+ compareSource(expect, actual, summary + ': 2');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 2');
+ }
+}
+
+expect = a;
+actual = a.valueOf();
+reportCompare(expect, actual, summary + ': 3');
+
+try
+{
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = "" + a;
+ compareSource(expect, actual, summary + ': 4');
+}
+catch(ex)
+{
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/extensions/regress-336409-1.js b/js/src/tests/non262/extensions/regress-336409-1.js
new file mode 100644
index 0000000000..1f03dfd2b6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336409-1.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource||!xulRuntime.shell||Android) slow -- no results reported.
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336409;
+var summary = 'Integer overflow in js_obj_toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 64;
+ printStatus('Creating ' + n + 'MB string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating object');
+ var o = {f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+ print(actual);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336409-2.js b/js/src/tests/non262/extensions/regress-336409-2.js
new file mode 100644
index 0000000000..545350150b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336409-2.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&((Android||(isDebugBuild&&xulRuntime.OS=="Linux")||xulRuntime.XPCOMABI.match(/x86_64/))))) slow -- can fail silently due to out of memory, bug 615011 - timeouts on slow debug Linux
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336409;
+var summary = 'Integer overflow in js_obj_toSource';
+var actual = 'No Crash';
+var expect = /(No Crash|InternalError: allocation size overflow|out of memory)/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 128;
+ printStatus('Creating ' + n + 'MB string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating object');
+ var o = {f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ actual = ex + '';
+ print(actual);
+}
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336410-1.js b/js/src/tests/non262/extensions/regress-336410-1.js
new file mode 100644
index 0000000000..869a7b9429
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336410-1.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource||!xulRuntime.shell||Android) slow -- can fail silently due to out of memory
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336410;
+var summary = 'Integer overflow in array_toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 64;
+ printStatus('Creating ' + n + 'M length string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating array');
+ var o=[r, r, r, r, r, r, r, r, r];
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ expect = '\(InternalError: allocation size overflow|out of memory\)';
+ actual = ex + '';
+ print(actual);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336410-2.js b/js/src/tests/non262/extensions/regress-336410-2.js
new file mode 100644
index 0000000000..bd0952e9e6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336410-2.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&((isDebugBuild&&xulRuntime.OS=="Linux")||Android||xulRuntime.XPCOMABI.match(/x86_64/)||xulRuntime.OS=="WINNT"))) slow -- can fail silently due to out of memory, bug 621348 - timeouts on slow debug Linux
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336410;
+var summary = 'Integer overflow in array_toSource';
+var actual = 'No Crash';
+var expect = /(No Crash|InternalError: allocation size overflow|out of memory)/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 128;
+ printStatus('Creating ' + n + 'M length string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating array');
+ var o=[r, r, r, r, r, r, r, r, r];
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ actual = ex + '';
+ print(actual);
+}
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-339685.js b/js/src/tests/non262/extensions/regress-339685.js
new file mode 100644
index 0000000000..295a080686
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-339685.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 339685;
+var summary = 'Setting __proto__ null should not affect __iterator__';
+var actual = '';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var d = { a:2, b:3 };
+
+d.__proto__ = null;
+
+try {
+ for (var p in d)
+ ;
+ actual = 'No Error';
+} catch(e) {
+ actual = e + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-341956-01.js b/js/src/tests/non262/extensions/regress-341956-01.js
new file mode 100644
index 0000000000..2e40bd9350
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-01.js
@@ -0,0 +1,65 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - unshift';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+
+ var a = [];
+ a[N - 1] = 1;
+ a.__defineGetter__(N - 1, function() {
+ var tmp = [];
+ tmp[N - 2] = 0;
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return 10;
+ });
+
+
+// The following always-throw getter is to stop unshift from doing
+// 2^32 iterations.
+ var toStop = "stringToStop";
+ a[N - 3] = 0;
+ a.__defineGetter__(N - 3, function() { throw toStop; });
+
+ var good = false;
+
+ try {
+ a.unshift(1);
+ } catch (e) {
+ if (e === toStop)
+ good = true;
+ }
+
+ expect = true;
+ actual = good;
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-341956-02.js b/js/src/tests/non262/extensions/regress-341956-02.js
new file mode 100644
index 0000000000..0957c03ae5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-02.js
@@ -0,0 +1,52 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - pop';
+var actual = '';
+var expect = 'GETTER RESULT';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+ var a = [];
+ a[N - 1] = 0;
+
+ var expected = "GETTER RESULT";
+
+ a.__defineGetter__(N - 1, function() {
+ delete a[N - 1];
+ var tmp = [];
+ tmp[N - 2] = 1;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return expected;
+ });
+
+ actual = a.pop();
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-341956-03.js b/js/src/tests/non262/extensions/regress-341956-03.js
new file mode 100644
index 0000000000..2985dfb2bc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-03.js
@@ -0,0 +1,69 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - reverse';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+ var a = [];
+ a[N - 1] = 0;
+
+ var expected = "GETTER RESULT";
+
+ a.__defineGetter__(N - 1, function() {
+ delete a[N - 1];
+ var tmp = [];
+ tmp[N - 2] = 1;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return expected;
+ });
+
+// The following always-throw getter is to stop unshift from doing
+// 2^32 iterations.
+ var toStop = "stringToStop";
+ a[N - 3] = 0;
+ a.__defineGetter__(N - 3, function() { throw toStop; });
+
+
+ var good = false;
+
+ try {
+ a.reverse();
+ } catch (e) {
+ if (e === toStop)
+ good = true;
+ }
+
+ expect = true;
+ actual = good;
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-342960.js b/js/src/tests/non262/extensions/regress-342960.js
new file mode 100644
index 0000000000..d7d8f8a0c1
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-342960.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&(Android||xulRuntime.OS=="WINNT"||xulRuntime.OS=="Linux"))) silentfail slow -- bug 528464
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 342960;
+var summary = 'Do not crash on large string toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expectExitCode(0);
+ expectExitCode(5);
+
+ function v()
+ {
+ var meg="";
+ var r="";
+ var i;
+ print("don't interrupt the script. let it go.");
+ for(i=0;i<1024*1024;i++) meg += "v";
+ for(i=0;i<1024/8;i++) r += meg;
+ var o={f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ print('done obj');
+ var rr=r.toSource();
+ print('done toSource()');
+ }
+
+ v();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-345967.js b/js/src/tests/non262/extensions/regress-345967.js
new file mode 100644
index 0000000000..0ca7f71c91
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-345967.js
@@ -0,0 +1,65 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345967;
+var summary = 'Yet another unrooted atom in jsarray.c';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expectExitCode(0);
+ expectExitCode(3);
+
+ print('This test will probably run out of memory');
+ print('This test really should only fail on 64 bit machines');
+
+ var JSVAL_INT_MAX = (1 << 30) - 1;
+
+ var a = new Array(JSVAL_INT_MAX + 2);
+ a[JSVAL_INT_MAX] = 0;
+ a[JSVAL_INT_MAX + 1] = 1;
+
+ a.__defineGetter__(JSVAL_INT_MAX, function() { return 0; });
+
+ a.__defineSetter__(JSVAL_INT_MAX, function(value) {
+ delete a[JSVAL_INT_MAX + 1];
+ var tmp = [];
+ tmp[JSVAL_INT_MAX + 2] = 2;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ });
+
+
+ a.shift();
+
+ expect = 0;
+ actual = a[JSVAL_INT_MAX];
+ if (expect !== actual)
+ print("BAD");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-346642-06.js b/js/src/tests/non262/extensions/regress-346642-06.js
new file mode 100644
index 0000000000..e2617038f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-346642-06.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346642;
+var summary = 'decompilation of destructuring assignment';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 3;
+ actual = '';
+ "" + function() { [] = 3 }; actual = 3;
+ actual = 3;
+ reportCompare(expect, actual, summary + ': 1');
+
+ try
+ {
+ var z = 6;
+ var f = eval('(function (){for(let [] = []; false;) let z; return z})');
+ expect = f();
+ actual = eval("("+f+")")()
+ reportCompare(expect, actual, summary + ': 2');
+ }
+ catch(ex)
+ {
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=408957
+ var summarytrunk = 'let declaration must be direct child of block or top-level implicit block';
+ expect = 'SyntaxError';
+ actual = ex.name;
+ reportCompare(expect, actual, summarytrunk);
+ }
+
+ expect = 3;
+ actual = '';
+ "" + function () { for(;; [[a]] = [5]) { } }; actual = 3;
+ reportCompare(expect, actual, summary + ': 3');
+
+ expect = 3;
+ actual = '';
+ "" + function () { for(;; ([[,]] = p)) { } }; actual = 3;
+ reportCompare(expect, actual, summary + ': 4');
+
+ expect = 3;
+ actual = '';
+ actual = 1; try {for(x in (function ([y]) { })() ) { }}catch(ex){} actual = 3;
+ reportCompare(expect, actual, summary + ': 5');
+}
diff --git a/js/src/tests/non262/extensions/regress-346773.js b/js/src/tests/non262/extensions/regress-346773.js
new file mode 100644
index 0000000000..024da5c720
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-346773.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346773;
+var summary = 'Do not crash compiling with misplaced branches in function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var src =
+ ' var it = {foo:"5"};' +
+ ' it.__iterator__ =' +
+ ' function(valsOnly)' +
+ ' {' +
+ ' var gen =' +
+ ' function()' +
+ ' {' +
+ ' for (var i = 0; i < keys.length; i++)' +
+ ' {' +
+ ' if (valsOnly)' +
+ ' yield vals[i];' +
+ ' else' +
+ ' yield [keys[i], vals[i]];' +
+ ' }' +
+ ' return gen();' +
+ ' }' +
+ ' }';
+ eval(src);
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-350312-01.js b/js/src/tests/non262/extensions/regress-350312-01.js
new file mode 100644
index 0000000000..84ee0cd4a3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-350312-01.js
@@ -0,0 +1,43 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350312;
+var summary = 'Accessing wrong stack slot with nested catch/finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var tmp;
+
+ function f()
+ {
+ try {
+ try {
+ throw 1;
+ } catch (e) {
+ throw e;
+ } finally {
+ tmp = true;
+ }
+ } catch (e) {
+ return e;
+ }
+ }
+
+ var ex = f();
+
+ var passed = ex === 1;
+ reportCompare(true, passed, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-350312.js b/js/src/tests/non262/extensions/regress-350312.js
new file mode 100644
index 0000000000..c10d849018
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-350312.js
@@ -0,0 +1,66 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350312;
+var summary = 'Accessing wrong stack slot with nested catch/finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var iter;
+ function* gen()
+ {
+ try {
+ yield iter;
+ } catch (e) {
+ if (e != null)
+ throw e;
+ actual += 'CATCH,';
+ print("CATCH");
+ } finally {
+ actual += 'FINALLY';
+ print("FINALLY");
+ }
+ }
+
+ expect = 'FINALLY';
+ actual = '';
+ (iter = gen()).next().value.return();
+ reportCompare(expect, actual, summary);
+
+ expect = 'FINALLY';
+ actual = '';
+ try
+ {
+ (iter = gen()).next().value.throw(1);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+
+ expect = 'CATCH,FINALLY';
+ actual = '';
+ try
+ {
+ (iter = gen()).next().value.throw(null);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+
+ reportCompare((iter = gen()).next().value.next().value, undefined, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-351070-02.js b/js/src/tests/non262/extensions/regress-351070-02.js
new file mode 100644
index 0000000000..ec288d859d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351070-02.js
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351070;
+var summary = 'decompilation of let declaration should not change scope';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var pfx = "(function f() { var n = 2, a = 2; ",
+ decl = " let a = 3;",
+ end = " return a; })";
+
+ var table = [
+ ["if (!!true)", ""],
+ ["if (!!true)", " else foopy();"],
+ ["if (!true); else", ""],
+ ["do ", " while (false);"],
+ ["while (--n)", ""],
+ ["for (--n;n;--n)", ""],
+ ["for (a in this)", ""],
+ ["with (this)", ""],
+ ];
+
+ expect = 3;
+
+ for (i = 0; i < table.length; i++) {
+ var src = pfx + table[i][0] + decl + table[i][1] + end;
+ print('src: ' + src);
+ var fun = eval(src);
+ var testval = fun();
+ reportCompare(expect, testval, summary + ': ' + src);
+ if (testval != expect) {
+ break;
+ }
+ var declsrc = '(' +
+ src.slice(1, -1).replace('function f', 'function f' + i) + ')';
+ print('declsrc: ' + declsrc);
+ this['f' + i] = eval(declsrc);
+ print('f' + i + ': ' + this['f' + i]);
+ }
+ }
+ catch(ex)
+ {
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=408957
+ summary = 'let declaration must be direct child of block or top-level implicit block';
+ expect = 'SyntaxError';
+ actual = ex.name;
+ reportCompare(expect, actual, summary);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-351448.js b/js/src/tests/non262/extensions/regress-351448.js
new file mode 100644
index 0000000000..9384d21b17
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351448.js
@@ -0,0 +1,59 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351448;
+var summary = 'RegExp - throw InternalError on too complex regular expressions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var strings = [
+ "/.X(.+)+X/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+X/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+XX/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+XX/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X]/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X]/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X][X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X][X]/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+[X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+[X]/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X]/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X]/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X][X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X][X]/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X][X](.+)+[X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X][X](.+)+[X]/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"
+ ];
+
+ expect = 'InternalError: regular expression too complex';
+
+ for (var i = 0; i < strings.length; i++)
+ {
+ try
+ {
+ eval(strings[i]);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + strings[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-351463-01.js b/js/src/tests/non262/extensions/regress-351463-01.js
new file mode 100644
index 0000000000..e7a9ce7ce7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351463-01.js
@@ -0,0 +1,250 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351463;
+var summary = 'Treat hyphens as not special adjacent to CharacterClassEscapes in character classes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var r;
+ var s = 'a0- z';
+
+ r = '([\\d-\\s]+)';
+ expect = ['0- ', '0- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\d]+)';
+ expect = ['0- ', '0- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\D-\\s]+)';
+ expect = ['a', 'a'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\D]+)';
+ expect = ['a', 'a'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\d-\\S]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\d]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\D-\\S]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\D]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+// --
+
+ r = '([\\w-\\s]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\w]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\W-\\s]+)';
+ expect = ['- ', '- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\W]+)';
+ expect = ['- ', '- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\w-\\S]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\w]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\W-\\S]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\W]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+}
diff --git a/js/src/tests/non262/extensions/regress-351973.js b/js/src/tests/non262/extensions/regress-351973.js
new file mode 100644
index 0000000000..a24c3ab6f6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351973.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351973;
+var summary = 'GC hazard with unrooted ids in Object.toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function removeAllProperties(o)
+ {
+ for (var prop in o)
+ delete o[prop];
+ for (var i = 0; i != 50*1000; ++i) {
+ var tmp = Math.sqrt(i+0.2);
+ tmp = 0;
+ }
+ if (typeof gc == "function")
+ gc();
+ }
+
+ function run_test()
+ {
+
+ var o = {};
+ o.first = { toSource: function() { removeAllProperties(o); } };
+ for (var i = 0; i != 10; ++i) {
+ o[Math.sqrt(i + 0.1)] = 1;
+ }
+ return o.toSource();
+ }
+
+ print(run_test());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-352291.js b/js/src/tests/non262/extensions/regress-352291.js
new file mode 100644
index 0000000000..f3c19b06c8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352291.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352291;
+var summary = 'disassembly of regular expression';
+var actual = '';
+var expect = 'TypeError: /g/g is not a function';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis != 'function')
+ {
+ actual = expect = 'disassembly not supported, test skipped.';
+ }
+ else
+ {
+ try
+ {
+ dis(/g/g)
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-352372.js b/js/src/tests/non262/extensions/regress-352372.js
new file mode 100644
index 0000000000..106d8673ca
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352372.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352372;
+var summary = 'Do not assert eval("setter/*...")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'ReferenceError: setter is not defined';
+ try
+ {
+ eval("setter/*\n*/;");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/;")');
+
+ try
+ {
+ eval("setter/*\n*/g");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/g")');
+
+ try
+ {
+ eval("setter/*\n*/ ;");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/ ;")');
+
+ try
+ {
+ eval("setter/*\n*/ g");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/ g")');
+}
diff --git a/js/src/tests/non262/extensions/regress-352604.js b/js/src/tests/non262/extensions/regress-352604.js
new file mode 100644
index 0000000000..106c04e97b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352604.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352604;
+var summary = 'Do not assert: !OBJ_GET_PROTO(cx, ctor)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f() {}
+ delete Function;
+ var g = function () {};
+
+ expect = f.__proto__;
+ actual = g.__proto__;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-353116.js b/js/src/tests/non262/extensions/regress-353116.js
new file mode 100644
index 0000000000..cdb19bff32
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-353116.js
@@ -0,0 +1,75 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353116;
+var summary = 'Improve errors messages for null, undefined properties';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: (undefined has no properties|can't access property "y" of undefined)/;
+ actual = 'No Error';
+
+ try
+ {
+ undefined.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: (null has no properties|can't access property "y" of null)/;
+ actual = 'No Error';
+
+ try
+ {
+ null.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: .*x is undefined/;
+ actual = 'No Error';
+
+ try
+ {
+ x = undefined;
+ x.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: .*x is null/;
+ actual = 'No Error';
+
+ try
+ {
+ x = null;
+ x.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-353214-02.js b/js/src/tests/non262/extensions/regress-353214-02.js
new file mode 100644
index 0000000000..9a6317a066
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-353214-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353214;
+var summary = 'bug 353214';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function ([x]) { let y; }
+ expect = 'function ([x]) { let y; }';
+ actual = f + '';
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-354297.js b/js/src/tests/non262/extensions/regress-354297.js
new file mode 100644
index 0000000000..a0cdbdc6aa
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-354297.js
@@ -0,0 +1,27 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 354297;
+var summary = 'getter/setter can be on index';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test requires GC_MARK_DEBUG');
+
+ var o = {}; o.__defineGetter__(1, Math.sin); gc()
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-01.js b/js/src/tests/non262/extensions/regress-355052-01.js
new file mode 100644
index 0000000000..73bcb5125a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-01.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ ( {valueOf: gc} - [function(){}].__iterator__ )();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-02.js b/js/src/tests/non262/extensions/regress-355052-02.js
new file mode 100644
index 0000000000..a6e0a9816e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-02.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ ( {valueOf: gc} - [].a )();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-03.js b/js/src/tests/non262/extensions/regress-355052-03.js
new file mode 100644
index 0000000000..6393a7441a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-03.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ var obj = {valueOf: gc };
+
+ function f() {
+ ( obj * [].a )();
+ }
+
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355410.js b/js/src/tests/non262/extensions/regress-355410.js
new file mode 100644
index 0000000000..38eb133964
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355410.js
@@ -0,0 +1,37 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355410;
+var summary = 'GC hazard in for([k,v] in o){...}';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var address = 0xbadf00d0, basket = { food: {} };
+ var AP = Array.prototype, rooter = {};
+ AP.__defineGetter__(0, function() { return this[-1]; });
+ AP.__defineSetter__(0, function(v) {
+ basket.food = null;
+ for(var i = 0; i < 8 * 1024; i++) {
+ rooter[i] = 0x10000000000000 + address; // IEEE754!
+ }
+ return this[-1] = v;
+ });
+ for(var [key, value] in basket) { value.trigger; }
+
+ delete Array.prototype[0];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355497.js b/js/src/tests/non262/extensions/regress-355497.js
new file mode 100644
index 0000000000..efaf280d66
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355497.js
@@ -0,0 +1,58 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355497;
+var summary = 'Do not overflow stack with Array.slice, getter';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'InternalError: too much recursion';
+
+ try
+ {
+ var a = { length: 1 };
+ a.__defineGetter__(0, [].slice);
+ a[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ try
+ {
+ var b = { length: 1 };
+ b.__defineGetter__(0, function () { return Array.prototype.slice.call(b); });
+ b[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ try
+ {
+ var c = [];
+ c.__defineSetter__(0, c.unshift);
+ c[0] = 1;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/extensions/regress-363040-01.js b/js/src/tests/non262/extensions/regress-363040-01.js
new file mode 100644
index 0000000000..f8a382d3be
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363040-01.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce application in continued fraction';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Print x as a continued fraction in compact abbreviated notation and return
+// the convergent [n, d] such that x - (n / d) <= epsilon.
+ function contfrac(x, epsilon) {
+ let i = Math.floor(x);
+ let a = [i];
+ x = x - i;
+ let maxerr = x;
+ while (maxerr > epsilon) {
+ x = 1 / x;
+ i = Math.floor(x);
+ a.push(i);
+ x = x - i;
+ maxerr = x * maxerr / i;
+ }
+ print(a);
+ a.push([1, 0]);
+ a.reverse();
+ return a.reduce(function (x, y) {return [x[0] * y + x[1], x[0]];});
+ }
+
+ if (!Array.prototype.reduce)
+ {
+ print('Test skipped. Array.prototype.reduce not implemented');
+ }
+ else
+ {
+// Show contfrac in action.
+ for (num of [Math.PI, Math.sqrt(2), 1 / (Math.sqrt(Math.E) - 1)]) {
+ print('Continued fractions for', num);
+ for (eps of [1e-2, 1e-3, 1e-5, 1e-7, 1e-10]) {
+ let frac = contfrac(num, eps);
+ let est = frac[0] / frac[1];
+ let err = num - est;
+ print(frac, est, err);
+ }
+ print();
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363040-02.js b/js/src/tests/non262/extensions/regress-363040-02.js
new file mode 100644
index 0000000000..8309d8c6be
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363040-02.js
@@ -0,0 +1,61 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce application in continued fraction';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+// Print x as a continued fraction in compact abbreviated notation and return
+// the convergent [n, d] such that x - (n / d) <= epsilon.
+ function contfrac(x, epsilon) {
+ let i = Math.floor(x);
+ let a = [i];
+ x = x - i;
+ let maxerr = x;
+ while (maxerr > epsilon) {
+ x = 1 / x;
+ i = Math.floor(x);
+ a.push(i);
+ x = x - i;
+ maxerr = x * maxerr / i;
+ }
+ print(a);
+ return a.reduceRight(function (x, y) {return [x[0] * y + x[1], x[0]];}, [1, 0]);
+ }
+
+ if (!Array.prototype.reduceRight)
+ {
+ print('Test skipped. Array.prototype.reduceRight not implemented');
+ }
+ else
+ {
+// Show contfrac in action on some interesting numbers.
+ for (num of [Math.PI, Math.sqrt(2), 1 / (Math.sqrt(Math.E) - 1)]) {
+ print('Continued fractions for', num);
+ for (eps of [1e-2, 1e-3, 1e-5, 1e-7, 1e-10]) {
+ let frac = contfrac(num, eps);
+ let est = frac[0] / frac[1];
+ let err = num - est;
+ print(frac, est, err);
+ }
+ print();
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363258.js b/js/src/tests/non262/extensions/regress-363258.js
new file mode 100644
index 0000000000..fe01008aae
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363258.js
@@ -0,0 +1,45 @@
+// |reftest| random -- bug 524788
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363258;
+var summary = 'Timer resolution';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = 0;
+ var stop = 0;
+ var i;
+ var limit = 0;
+ var incr = 10;
+ var resolution = 5;
+
+ while (stop - start == 0)
+ {
+ limit += incr;
+ start = Date.now();
+ for (i = 0; i < limit; i++) {}
+ stop = Date.now();
+ }
+
+ print('limit=' + limit + ', resolution=' + resolution + ', time=' + (stop - start));
+
+ expect = true;
+ actual = (stop - start <= resolution);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363988.js b/js/src/tests/non262/extensions/regress-363988.js
new file mode 100644
index 0000000000..372bd92914
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363988.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363988;
+var summary = 'Do not crash at JS::GetPrivate with large script';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function crash() {
+ var town = new Array;
+
+ for (var i = 0; i < 0x4001; ++i) {
+ var si = String(i);
+ town[i] = [ si, "x" + si, "y" + si, "z" + si ];
+ }
+
+ return "town=" + JSON.stringify(town) + ";function f() {}";
+ }
+
+ if (typeof document != "undefined")
+ {
+ // this is required to reproduce the crash.
+ document.write("<script>", crash(), "<\/script>");
+ }
+ else
+ {
+ crash();
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-365527.js b/js/src/tests/non262/extensions/regress-365527.js
new file mode 100644
index 0000000000..29357b6266
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365527.js
@@ -0,0 +1,63 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365527;
+var summary = 'JSOP_ARGUMENTS should set obj register';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ counter = 500*1000;
+
+ var obj;
+
+ function getter()
+ {
+ obj = { get x() {
+ return getter();
+ }, counter: counter};
+ return obj;
+ }
+
+
+ var x;
+
+ function g()
+ {
+ x += this.counter;
+ if (--counter == 0)
+ throw "Done";
+ }
+
+
+ function f()
+ {
+ arguments=g;
+ try {
+ for (;;) {
+ arguments();
+ obj.x;
+ }
+ } catch (e) {
+ }
+ }
+
+
+ getter();
+ f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-365692.js b/js/src/tests/non262/extensions/regress-365692.js
new file mode 100644
index 0000000000..106b8071a5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365692.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365692;
+var summary = 'getter/setter bytecodes should support atoms over 64k';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function g()
+{
+ return 10;
+}
+
+try
+{
+ var N = 100*1000;
+ var src = 'var x = ["';
+ var array = Array(N);
+ for (var i = 0; i != N; ++i)
+ array[i] = i;
+ src += array.join('","')+'"]; x.a getter = g; return x.a;';
+ var f = Function(src);
+ if (f() != 10)
+ throw "Unexpected result";
+}
+catch(ex)
+{
+ if (ex == "Unexpected result")
+ {
+ actual = ex;
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-365869.js b/js/src/tests/non262/extensions/regress-365869.js
new file mode 100644
index 0000000000..6ec88e7970
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365869.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365869;
+var summary = 'strict warning for object literal with duplicate propery names';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('test crash from bug 371292 Comment 9');
+
+ try
+ {
+ expect = "TypeError: can't redefine non-configurable property 5";
+ "012345".__defineSetter__(5, function(){});
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-366288.js b/js/src/tests/non262/extensions/regress-366288.js
new file mode 100644
index 0000000000..05f0d2565d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366288.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366288;
+var summary = 'Do not assert !SPROP_HAS_STUB_GETTER with __defineSetter__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__defineSetter__("x", function(){});
+x = 3;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366292.js b/js/src/tests/non262/extensions/regress-366292.js
new file mode 100644
index 0000000000..19879769cc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366292.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366292;
+var summary = '__defineSetter__ and JSPROP_SHARED regression';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'undefined';
+this.__defineSetter__("x", function(){});
+actual = String(x);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366396.js b/js/src/tests/non262/extensions/regress-366396.js
new file mode 100644
index 0000000000..4369be821b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366396.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366396;
+var summary = 'Do not assert !SPROP_HAS_STUB_GETTER on Setter with %=';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__defineSetter__("x", function() {}); x %= 5;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366668-01.js b/js/src/tests/non262/extensions/regress-366668-01.js
new file mode 100644
index 0000000000..e4d8db6168
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366668-01.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366668;
+var summary = 'decompilation of "for (let x in x.p)" ';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ f = function() { for(let x in x.p) { } };
+ expect = 'function() { for(let x in x.p) { } }';
+ actual = f + '';
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-01.js b/js/src/tests/non262/extensions/regress-367501-01.js
new file mode 100644
index 0000000000..7446c13999
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-01.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter issues';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = 'undefined';
+ var a = { set x(v) {} };
+ actual = a.x + '';
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-02.js b/js/src/tests/non262/extensions/regress-367501-02.js
new file mode 100644
index 0000000000..033ef777e7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-02.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = 'undefined';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 92169 - 3; ++i) a[i] = 1;
+ actual = a.x + '';
+ actual = a.x + '';
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-03.js b/js/src/tests/non262/extensions/regress-367501-03.js
new file mode 100644
index 0000000000..c1f9433712
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-03.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = actual = 'No Crash';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 0x4bf20 - 3; ++i) a[i] = 1;
+ a.x;
+ a.x.x;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-04.js b/js/src/tests/non262/extensions/regress-367501-04.js
new file mode 100644
index 0000000000..e88b3e1fa6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-04.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = actual = 'No Crash';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 0x10050c - 3; ++i) a[i] = 1;
+ a.x;
+ typeof a.x;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367589.js b/js/src/tests/non262/extensions/regress-367589.js
new file mode 100644
index 0000000000..29aa1b61b6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367589.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367589;
+var summary = 'Do not assert !SPROP_HAS_STUB_SETTER(sprop) || (sprop->attrs & JSPROP_GETTER)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+ document.write('<button id="button" onclick="document.getElementsByTagName(\'button\')[0] = \'wtf\';">Crash</button>');
+ window.addEventListener('load', crash, false);
+}
+
+function crash()
+{
+ document.getElementById('button').click();
+ setTimeout(checkCrash, 0);
+}
+
+function checkCrash()
+{
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
diff --git a/js/src/tests/non262/extensions/regress-368213.js b/js/src/tests/non262/extensions/regress-368213.js
new file mode 100644
index 0000000000..c1f9be735a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368213.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368213;
+var summary = 'Do not crash with group assignment and sharp variable defn';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(function() { [] = [] });
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-368224.js b/js/src/tests/non262/extensions/regress-368224.js
new file mode 100644
index 0000000000..c6b394e0ea
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368224.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368224;
+var summary = 'Do not assert: pnprop->pn_type == TOK_COLON';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ ({ x: a } = {});
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-368516.js b/js/src/tests/non262/extensions/regress-368516.js
new file mode 100644
index 0000000000..667b5c1535
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368516.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368516;
+var summary = 'Treat unicode BOM characters as whitespace';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var bomchars = ['\uFEFF'];
+
+ for (var i = 0; i < bomchars.length; i++)
+ {
+ expect = 'howdie';
+ actual = '';
+
+ try
+ {
+ eval("var" + bomchars[i] + "hithere = 'howdie';");
+ actual = hithere;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': ' + i);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-369404.js b/js/src/tests/non262/extensions/regress-369404.js
new file mode 100644
index 0000000000..d1e25f8c4f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369404.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369404;
+var summary = 'Do not assert: !SPROP_HAS_STUB_SETTER(sprop) || (sprop->attrs & JSPROP_GETTER) ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+ document.write('<span id="r"> </span>' +
+ '<script>' +
+ 'f = function(){};' +
+ 'f.prototype = document.getElementById("r").childNodes;' +
+ 'j = new f();' +
+ 'j[0] = null;' +
+ '</script>');
+ window.addEventListener('load', crash, false);
+}
+
+function crash()
+{
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-01.js b/js/src/tests/non262/extensions/regress-369696-01.js
new file mode 100644
index 0000000000..5b2f12cc98
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-01.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ q = [];
+ q.__defineGetter__("0", q.toString);
+ q[2] = q;
+ assertEq(q.toSource(), "[\"\", , []]", "wrong string");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-02.js b/js/src/tests/non262/extensions/regress-369696-02.js
new file mode 100644
index 0000000000..5cc18edf7c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-02.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+// Bug 762908 requires us to set sp=null;
+if (this.window) window.SpecialPowers = null;
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function fun() {}
+ n = fun.prototype;
+ n.__defineGetter__("prototype", n.toSource);
+ p = n.__lookupGetter__("prototype");
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+ assertEq(p, Object.prototype.toSource);
+
+ n["prototype"] = [n];
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+ assertEq(p, Object.prototype.toSource);
+
+ p2 = n["prototype"];
+
+ assertEq(Array.isArray(p2), true);
+ assertEq(p2[0], Object.prototype.toSource);
+
+ n = p2;
+
+ assertEq(n.toString, Array.prototype.toString);
+ n.__defineGetter__("0", n.toString);
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+
+ n.call(this);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-03.js b/js/src/tests/non262/extensions/regress-369696-03.js
new file mode 100644
index 0000000000..3d02428b67
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-03.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x = [[[ { toSource: function() { gc(); }}]]];
+
+ var a = [];
+ a[0] = a;
+ a.toSource = a.toString;
+ Array.prototype.toSource.call(a);
+
+//cx->sharpObjectMap.depth == -2
+
+ (function() {
+ var tmp = [];
+ for (var i = 0; i != 30*1000; ++i) {
+ var tmp2 = [];
+ tmp.push(tmp2);
+ tmp2.toSource();
+ }
+ })();
+
+ gc();
+ x.toSource();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-372309.js b/js/src/tests/non262/extensions/regress-372309.js
new file mode 100644
index 0000000000..950c0a5461
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-372309.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 372309;
+var summary = 'Root new array objects';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var width = 600;
+ var height = 600;
+
+ var img1canvas = document.createElement("canvas");
+ var img2canvas = document.createElement("canvas");
+
+ img1canvas.width = img2canvas.width = width;
+ img1canvas.height = img2canvas.height = height;
+ img1canvas.getContext("2d").getImageData(0, 0, width, height).data;
+ img2canvas.getContext("2d").getImageData(0, 0, width, height).data;
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", test, false);
diff --git a/js/src/tests/non262/extensions/regress-375183.js b/js/src/tests/non262/extensions/regress-375183.js
new file mode 100644
index 0000000000..6c351c8c79
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-375183.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375183;
+var summary = '__noSuchMethod__ should not allocate beyond fp->script->depth';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj = { get __noSuchMethod__() {
+ print("Executed");
+ return new Object();
+ }};
+
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':1');
+
+ obj = { __noSuchMethod__: {} };
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':2');
+
+ obj = { }
+ obj.__noSuchMethod__ = {};
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':3');
+}
diff --git a/js/src/tests/non262/extensions/regress-375344.js b/js/src/tests/non262/extensions/regress-375344.js
new file mode 100644
index 0000000000..41d9eeb15a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-375344.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375344;
+var summary = 'accessing prototype of DOM objects should throw catchable error';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof HTMLElement != 'undefined')
+{
+ expect = /TypeError/;
+ try
+ {
+ print(HTMLElement.prototype.nodeName);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ print(actual);
+ }
+ reportMatch(expect, actual, summary);
+}
+else
+{
+ expect = actual = 'Test can only run in a Gecko 1.9 browser or later.';
+ print(actual);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-379566.js b/js/src/tests/non262/extensions/regress-379566.js
new file mode 100644
index 0000000000..17461a49e9
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-379566.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379566;
+var summary = 'Keywords after get|set';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({' +
+ 'get in() { return this.for; }, ' +
+ 'set in(value) { this.for = value; }' +
+ '})';
+ try
+ {
+ var obj = eval('({ ' +
+ 'get in() { return this.for; }, ' +
+ 'set in(value) { this.for = value; } ' +
+ '})');
+ actual = obj.toSource();
+
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-380889.js b/js/src/tests/non262/extensions/regress-380889.js
new file mode 100644
index 0000000000..fedd51f01f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-380889.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 380889;
+var summary = 'Source disassembler assumes SRC_SWITCH has jump table';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(i)
+ {
+ switch(i){
+ case 1:
+ case xyzzy:
+ }
+ }
+
+ if (typeof dis != 'undefined')
+ {
+ dis(f);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-381303.js b/js/src/tests/non262/extensions/regress-381303.js
new file mode 100644
index 0000000000..7d113ac293
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-381303.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381303;
+var summary = 'object toSource when a property has both a getter and a setter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj = {set inn(value) {this.for = value;}, get inn() {return this.for;}};
+ expect = '({' +
+ 'get inn() {return this.for;}' +
+ ', ' +
+ 'set inn(value) {this.for = value;}' +
+ '})';
+ actual = obj.toSource();
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-381304.js b/js/src/tests/non262/extensions/regress-381304.js
new file mode 100644
index 0000000000..168da0866c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-381304.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381304;
+var summary = 'getter/setter with keywords';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj;
+
+ print('1');
+
+ obj = {
+ set inn(value) {this.for = value;},
+ get inn() {return this.for;}
+ };
+
+ expect = '({get inn() {return this.for;}, set inn(value) {this.for = value;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 1');
+
+ print('2');
+
+ obj = {
+ set in(value) {this.for = value;},
+ get in() {return this.for;}
+ };
+
+ expect = '({get in() {return this.for;}, set in(value) {this.for = value;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 2');
+
+ print('3');
+
+ obj = {
+ set inn(value) {this.for = value;},
+ get in() {return this.for;}
+ };
+
+ expect = '({set inn(value) {this.for = value;}, get in() {return this.for;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 4');
+
+ print('4');
+
+ obj = {
+ set in(value) {this.for = value;},
+ get inn() {return this.for;}
+ };
+
+ expect = '({set in(value) {this.for = value;}, get inn() {return this.for;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 5');
+}
diff --git a/js/src/tests/non262/extensions/regress-385393-02.js b/js/src/tests/non262/extensions/regress-385393-02.js
new file mode 100644
index 0000000000..cb6d0c94cd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-385393-02.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (4).__lookupGetter__("w");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-385393-08.js b/js/src/tests/non262/extensions/regress-385393-08.js
new file mode 100644
index 0000000000..b00cafde9c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-385393-08.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ this.__proto__ = [];
+ [1,2,3,4].map.call();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-390598.js b/js/src/tests/non262/extensions/regress-390598.js
new file mode 100644
index 0000000000..d190615a18
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-390598.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 390598;
+var summary = 'array_length_setter is exploitable';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exploit() {
+ var fun = function () {};
+ fun.__proto__ = [];
+ fun.length = 0x50505050 >> 1;
+ fun();
+ }
+ exploit();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-394967.js b/js/src/tests/non262/extensions/regress-394967.js
new file mode 100644
index 0000000000..a82f1f5424
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-394967.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 394967;
+var summary = 'Do not assert: !vp[1].isPrimitive()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx == 'undefined')
+ {
+ print('Skipping. This test requires evalcx.');
+ }
+ else
+ {
+ var sandbox = evalcx("");
+ try
+ {
+ evalcx("(1)()", sandbox);
+ }
+ catch(ex)
+ {
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-396326-01.js b/js/src/tests/non262/extensions/regress-396326-01.js
new file mode 100644
index 0000000000..60913f4a42
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-396326-01.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 396326;
+var summary = 'Do not assert trying to disassemble get(var|arg) prop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ print('disassembly not supported. test skipped.');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ function f4() { let local; return local.prop };
+ dis(f4);
+ reportCompare(expect, actual, summary +
+ ': function f4() { let local; return local.prop };');
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-396326.js b/js/src/tests/non262/extensions/regress-396326.js
new file mode 100644
index 0000000000..45f3170bbb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-396326.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 396326;
+var summary = 'Do not assert trying to disassemble get(var|arg) prop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ print('disassembly not supported. test skipped.');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ function f1() { var v; return v.prop };
+ dis(f1);
+ reportCompare(expect, actual, summary +
+ ': function f1() { var v; return v.prop };');
+
+ function f2(arg) { return arg.prop };
+ dis(f2);
+ reportCompare(expect, actual, summary +
+ ': function f2(arg) { return arg.prop };');
+
+ function f3() { return this.prop };
+ dis(f3);
+ reportCompare(expect, actual, summary +
+ ': function f3() { return this.prop };');
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-406572.js b/js/src/tests/non262/extensions/regress-406572.js
new file mode 100644
index 0000000000..4911d05bc7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-406572.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 406572;
+var summary = 'JSOP_CLOSURE unconditionally replaces properties of the variable object - Browser only';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof window != 'undefined')
+{
+ try {
+ actual = "FAIL: Unexpected exception thrown";
+
+ var win = window;
+ var windowString = String(window);
+ window = 1;
+ reportCompare(windowString, String(window), "window should be readonly");
+
+ if (1)
+ function window() { return 1; }
+
+ // We should reach this line without throwing. Annex B means the
+ // block-scoped function above gets an assignment to 'window' in the
+ // nearest 'var' environment, but since 'window' is read-only, the
+ // assignment silently fails.
+ actual = "";
+
+ // The test harness might rely on window having its original value:
+ // restore it.
+ window = win;
+ } catch (e) {
+ }
+}
+else
+{
+ expect = actual = 'Test can only run in a Gecko 1.9 browser or later.';
+ print(actual);
+}
+reportCompare(expect, actual, summary);
+
+
diff --git a/js/src/tests/non262/extensions/regress-407501.js b/js/src/tests/non262/extensions/regress-407501.js
new file mode 100644
index 0000000000..267497464f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-407501.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407501;
+var summary = 'JSOP_NEWINIT lacks SAVE_SP_AND_PC ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ var a = [[[[[[[0]]]]]]];
+ if (a.toString() !== "0")
+ throw "Unexpected result";
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/extensions/regress-407720.js b/js/src/tests/non262/extensions/regress-407720.js
new file mode 100644
index 0000000000..f5b4cf0f83
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-407720.js
@@ -0,0 +1,44 @@
+// |reftest| skip slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407720;
+var summary = 'js_FindClassObject causes crashes with getter/setter - Browser only';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// stop the test after 60 seconds
+var start = new Date();
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+document.write('<iframe onload="onLoad()"><\/iframe>');
+
+function onLoad()
+{
+
+ if ( (new Date() - start) < 60*1000)
+ {
+ var x = frames[0].Window.prototype;
+ x.a = x.b = x.c = 1;
+ x.__defineGetter__("HTML document.all class", function() {});
+ frames[0].document.all;
+
+ // retry
+ frames[0].location = "about:blank";
+ }
+ else
+ {
+ actual = 'No Crash';
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-412926.js b/js/src/tests/non262/extensions/regress-412926.js
new file mode 100644
index 0000000000..ffb356a5f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-412926.js
@@ -0,0 +1,54 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 412926;
+var summary = 'JS_ValueToId(cx, JSVAL_NULL) should return atom for "null" string';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual = expect = 'No Errors';
+
+ var obj = { 'null': 1 };
+
+ var errors = [];
+
+ if (!obj.hasOwnProperty(null))
+ errors.push('null property is not owned');
+
+ if (!obj.propertyIsEnumerable(null))
+ errors.push('null property is not enumerable');
+
+ var getter_was_called = false;
+ obj.__defineGetter__(null, function() { getter_was_called = true; return 1; });
+ obj['null'];
+
+ if (!getter_was_called)
+ errors.push('getter was not assigned to the null property');
+
+ var setter_was_called = false;
+ obj.__defineSetter__(null, function() { setter_was_called = true; });
+ obj['null'] = 2;
+
+ if (!setter_was_called)
+ errors.push('setter was not assigned to the null property');
+
+ if (errors.length)
+ actual = errors.join('; ');
+
+ gc();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-414098.js b/js/src/tests/non262/extensions/regress-414098.js
new file mode 100644
index 0000000000..aa2b6e9de8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-414098.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 414098;
+var summary = 'Getter behavior on arrays';
+var actual = '';
+var expect = '';
+
+var a=[1,2,3];
+var foo = 44;
+a.__defineGetter__(1, function() { return foo + 10; });
+actual = String(a);
+reportCompare("1,54,3", actual, "getter 1");
+
+actual = String(a.reverse());
+reportCompare("3,54,1", actual, "reverse");
+
+var s = "";
+a.forEach(function(e) { s += e + "|"; });
+actual = s;
+reportCompare("3|54|1|", actual, "forEach");
+
+actual = a.join(' - ');
+reportCompare("3 - 54 - 1", actual, "join");
+
+a[2]=3;
+actual = a.pop();
+reportCompare(actual, 3, "pop");
+
+actual = a.pop();
+reportCompare(actual, 54, "pop 2");
diff --git a/js/src/tests/non262/extensions/regress-414755.js b/js/src/tests/non262/extensions/regress-414755.js
new file mode 100644
index 0000000000..6d8057ceba
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-414755.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 414755;
+var summary = 'GC hazard due to missing SAVE_SP_AND_PC';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f()
+ {
+ var a = 1e10;
+ var b = 2e10;
+ var c = 3e10;
+
+ return (a*2) * ((b*2) * c);
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ expect = f();
+
+ gczeal(2);
+
+ actual = f();
+ }
+ else
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416354.js b/js/src/tests/non262/extensions/regress-416354.js
new file mode 100644
index 0000000000..e697776a9d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416354.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416354;
+var summary = 'GC hazard due to missing SAVE_SP_AND_PC';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(a, b, c)
+ {
+ return (-a) * ((-b) * (-c));
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ expect = f(1.5, 1.25, 1.125);
+ gczeal(2);
+ actual = f(1.5, 1.25, 1.125);
+ }
+ else
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416460.js b/js/src/tests/non262/extensions/regress-416460.js
new file mode 100644
index 0000000000..63ac875719
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416460.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416460;
+var summary = 'Do not assert: SCOPE_GET_PROPERTY(OBJ_SCOPE(pobj), ATOM_TO_JSID(atom))';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /a/.__proto__.__proto__ = { "2": 3 };
+ var b = /b/;
+ b["2"];
+ b["2"];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416834.js b/js/src/tests/non262/extensions/regress-416834.js
new file mode 100644
index 0000000000..ffd145cf39
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416834.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416834;
+var summary = 'Do not assert: !entry || entry->kpc == ((PCVCAP_TAG(entry->vcap) > 1) ? (jsbytecode *) JSID_TO_ATOM(id) : cx->fp->pc)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__proto__.x = eval;
+for (i = 0; i < 16; ++i)
+ delete eval;
+(function w() { x = 1; })();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-420869-01.js b/js/src/tests/non262/extensions/regress-420869-01.js
new file mode 100644
index 0000000000..48c3ffecdc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-420869-01.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420869;
+var summary = 'Throw too much recursion instead of script stack space quota';
+var actual = 'No Error';
+var expect = 'InternalError: too much recursion';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(i) {
+ if (i == 0)
+ return 1;
+ return i*f(i-1);
+ }
+
+ try
+ {
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-422592.js b/js/src/tests/non262/extensions/regress-422592.js
new file mode 100644
index 0000000000..48964ad250
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-422592.js
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 422592;
+var summary = 'js.c dis/dissrc should not kill script execution';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ expect = actual = 'Test requires function dis. Not tested';
+ print(expect);
+ }
+ else
+ {
+ expect = 'Completed';
+ actual = 'Not Completed';
+ print('Before dis');
+ try
+ {
+ dis(print);
+ }
+ catch(ex)
+ {
+ }
+ print('After dis');
+ actual = 'Completed';
+ }
+ reportCompare(expect, actual, summary);
+
+ if (typeof dissrc == 'undefined')
+ {
+ expect = actual = 'Test requires function dissrc. Not tested';
+ print(expect);
+ }
+ else
+ {
+ print('Before dissrc');
+ expect = 'Completed';
+ actual = 'Not Completed';
+ try
+ {
+ dissrc(print);
+ }
+ catch(ex)
+ {
+ }
+ print('After dissrc');
+ actual = 'Completed';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-424683-01.js b/js/src/tests/non262/extensions/regress-424683-01.js
new file mode 100644
index 0000000000..80595f070c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-424683-01.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 424683;
+var summary = 'Throw too much recursion instead of script stack space quota';
+var actual = 'No Error';
+var expect = 'InternalError: too much recursion';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f() { f(); }
+
+ try
+ {
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-426711.js b/js/src/tests/non262/extensions/regress-426711.js
new file mode 100644
index 0000000000..8bc3e5854a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-426711.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 426711;
+var summary = 'Setting window.__count__ causes a crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window != 'undefined' && '__count__' in window)
+ {
+ window.__count__ = 0;
+ }
+ else
+ {
+ expect = actual = 'Test skipped. Requires window.__count__';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-01.js b/js/src/tests/non262/extensions/regress-427196-01.js
new file mode 100644
index 0000000000..7b6f359e89
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-01.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function boom()
+ {
+ var b = {};
+ Array.__proto__ = b;
+ b.__proto__ = {};
+ var c = {};
+ c.__proto__ = [];
+ try { c.__defineSetter__("t", undefined); } catch(e) { }
+ c.__proto__ = Array;
+ try { c.__defineSetter__("v", undefined); } catch(e) { }
+ }
+
+ boom();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-02.js b/js/src/tests/non262/extensions/regress-427196-02.js
new file mode 100644
index 0000000000..c41c431383
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-02.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function boom()
+ {
+ var c = {__proto__: []};
+ var a = {__proto__: {__proto__: {}}};
+ c.hasOwnProperty("t");
+ c.__proto__ = a;
+ c.hasOwnProperty("v");
+ }
+
+ boom();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-03.js b/js/src/tests/non262/extensions/regress-427196-03.js
new file mode 100644
index 0000000000..6d8a14aeb3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-03.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var c = {__proto__: []};
+ var a = {__proto__: {__proto__: {}}};
+ c.hasOwnProperty;
+ c.__proto__ = a;
+ c.hasOwnProperty;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-429739.js b/js/src/tests/non262/extensions/regress-429739.js
new file mode 100644
index 0000000000..5c164a2947
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-429739.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 429739;
+var summary = 'Do not assert: OBJ_GET_CLASS(cx, obj)->flags & JSCLASS_HAS_PRIVATE';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var actual;
+ try
+ {
+ var o = { __noSuchMethod__: Function };
+ actual = (new o.y) + '';
+ throw new Error("didn't throw, produced a value");
+ }
+ catch(ex)
+ {
+ actual = ex;
+ }
+
+ reportCompare("TypeError", actual.name, "bad error name");
+ reportCompare(true, /is not a constructor/.test(actual), summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-430740.js b/js/src/tests/non262/extensions/regress-430740.js
new file mode 100644
index 0000000000..d6d6e32d04
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-430740.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430740;
+var summary = 'Do not strip format-control characters from string literals';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function doevil() {
+ print('evildone');
+ return 'evildone';
+ }
+
+ expect = 'a%E2%80%8D,+doevil()%5D)//';
+ actual += eval("(['a\\\u200d', '+doevil()])//'])");
+ actual = encodeURI(actual);
+ reportCompare(expect, actual, summary);
+
+ expect = 'a%EF%BF%BE,+doevil()%5D)//';
+ actual = eval("(['a\\\ufffe', '+doevil()])//'])");
+ actual = encodeURI(actual);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-434837-01.js b/js/src/tests/non262/extensions/regress-434837-01.js
new file mode 100644
index 0000000000..16f9450601
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-434837-01.js
@@ -0,0 +1,87 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 434837;
+var summary = '|this| in accessors in prototype chain of array';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x = [ "one", "two" ];
+ Array.prototype.__defineGetter__('test1', function() { actual = (this === x); });
+ x.test1;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test1');
+
+ try
+ {
+ expect = false;
+ actual = null;
+ Array.prototype.__defineGetter__('test2', function() { actual = (this === Array.prototype) });
+ x.test2;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test2');
+
+ Array.prototype.__defineGetter__('test3', function() { actual = (this === x) });
+ Array.prototype.__defineSetter__('test3', function() { actual = (this === x) });
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 (1)');
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3 = 5;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 = 5');
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 (2)');
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-01.js b/js/src/tests/non262/extensions/regress-435497-01.js
new file mode 100644
index 0000000000..87b8914413
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-01.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x, x setter = 0, y; const x; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-02.js b/js/src/tests/non262/extensions/regress-435497-02.js
new file mode 100644
index 0000000000..ac107687ea
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-02.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x setter = 0, y; const x; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-03.js b/js/src/tests/non262/extensions/regress-435497-03.js
new file mode 100644
index 0000000000..9ea783510f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-03.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x getter= function(){} ; var x5, x = 0x99; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-436741.js b/js/src/tests/non262/extensions/regress-436741.js
new file mode 100644
index 0000000000..8e85138cf0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-436741.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 436741;
+var summary = 'Do not assert: OBJ_IS_NATIVE(obj)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window == 'undefined')
+ {
+ print('This test is only meaningful in the browser.');
+ }
+ else
+ {
+ try { window.__proto__.__proto__ = [{}]; } catch (e) {}
+ for (var j in window);
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-437288-01.js b/js/src/tests/non262/extensions/regress-437288-01.js
new file mode 100644
index 0000000000..725554dd52
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-437288-01.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 437288;
+var summary = 'for loop turning into a while loop';
+var actual = 'No Hang';
+var expect = 'No Hang';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { const x = 1; for (x in null); })();');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-44009.js b/js/src/tests/non262/extensions/regress-44009.js
new file mode 100644
index 0000000000..253262fe78
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-44009.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 26 Feb 2001
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=44009
+ *
+ * SUMMARY: Testing that we don't crash on obj.toSource()
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 44009;
+var summary = "Testing that we don't crash on obj.toSource()";
+var obj1 = {};
+var sToSource = '';
+var self = this; //capture a reference to the global JS object -
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj2 = {};
+
+ // test various objects and scopes -
+ testThis(self);
+ testThis(this);
+ testThis(obj1);
+ testThis(obj2);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+// We're just testing that we don't crash by doing this -
+function testThis(obj)
+{
+ sToSource = obj.toSource();
+ obj.prop = obj;
+ sToSource = obj.toSource();
+}
diff --git a/js/src/tests/non262/extensions/regress-443569.js b/js/src/tests/non262/extensions/regress-443569.js
new file mode 100644
index 0000000000..dbfc1d8114
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-443569.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 443569;
+var summary = 'Do not assert: OBJ_IS_NATIVE(obj)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", boom, false);
+
+function boom()
+{
+ var r = RegExp.prototype;
+ r["-1"] = 0;
+ Array.prototype.__proto__ = r;
+ []["-1"];
+
+ reportCompare(expect, actual, summary);
+
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+
diff --git a/js/src/tests/non262/extensions/regress-446386.js b/js/src/tests/non262/extensions/regress-446386.js
new file mode 100644
index 0000000000..25359054f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-446386.js
@@ -0,0 +1,44 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 446386;
+var summary = 'Do not crash throwing error without compiler pseudo-frame';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx == 'undefined')
+ {
+ print(expect = actual = 'Test skipped. evalcx required.');
+ }
+ else {
+ try
+ {
+ try {
+ evalcx(".");
+ throw "must throw";
+ } catch (e) {
+ if (e.name != "SyntaxError")
+ throw e;
+ }
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452168.js b/js/src/tests/non262/extensions/regress-452168.js
new file mode 100644
index 0000000000..998ceca951
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452168.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452168;
+var summary = 'Do not crash with gczeal 2, JIT: @ avmplus::List or @ nanojit::LirBuffer::validate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'undefined')
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+ else
+ {
+ // Enumerate the global once before we turn on gczeal, so we're not
+ // trying to do all the enumerate hook object creation with a gc on
+ // every object, because that makes tests time out.
+ for (z in this);
+ gczeal(2);
+
+ var a, b; gczeal(2); (function() { for (var p in this) { } })();
+
+ gczeal(0);
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452178.js b/js/src/tests/non262/extensions/regress-452178.js
new file mode 100644
index 0000000000..360bc273b9
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452178.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452178;
+var summary = 'Do not assert with JIT: !(sprop->attrs & JSPROP_SHARED)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ Object.defineProperty(this, "q", { get: function(){}, enumerable: true, configurable: true });
+ for (var j = 0; j < 4; ++j) q = 1;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452329.js b/js/src/tests/non262/extensions/regress-452329.js
new file mode 100644
index 0000000000..e2d94944c6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452329.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452329;
+var summary = 'Do not assert: *data->pc == JSOP_CALL || *data->pc == JSOP_NEW';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ this.__defineGetter__("x", "".match); if (x) 3;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452338.js b/js/src/tests/non262/extensions/regress-452338.js
new file mode 100644
index 0000000000..2b6842fe5e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452338.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452338;
+var summary = 'Do not assert with JIT: obj2 == obj';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) __count__ = 3;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452498-162.js b/js/src/tests/non262/extensions/regress-452498-162.js
new file mode 100644
index 0000000000..543c9a1b06
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452498-162.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #162 From Gary Kwong
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Assertion failure: !OBJ_GET_CLASS(cx, proto)->getObjectOps, at ../jsobj.cpp:2030
+
+this.__defineGetter__("x3", Function);
+parseInt = x3;
+parseInt.prototype = [];
+for (var z = 0; z < 4; ++z) { new parseInt() }
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-452498-196.js b/js/src/tests/non262/extensions/regress-452498-196.js
new file mode 100644
index 0000000000..5429b04384
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452498-196.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #196 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: lexdep->isLet(), at ../jsparse.cpp:1900
+
+ (function (){
+ var x;
+ eval("var x; (function () { return x; })");
+ }
+ )();
+
+ reportCompare(expect, actual, summary + ': 2');
+}
diff --git a/js/src/tests/non262/extensions/regress-452565.js b/js/src/tests/non262/extensions/regress-452565.js
new file mode 100644
index 0000000000..6ca0e87c4e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452565.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452565;
+var summary = 'Do not assert with JIT: !(sprop->attrs & JSPROP_READONLY)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var c = undefined; (function() { for (var j=0;j<5;++j) { c = 1; } })();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-452913.js b/js/src/tests/non262/extensions/regress-452913.js
new file mode 100644
index 0000000000..464d403ddf
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452913.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452913;
+var summary = 'Do not crash with defined getter and for (let)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(this.__defineGetter__("x", function (x) { return 'foo'.replace(/o/g, [1].push); }));
+for(let y in [,,,]) for(let y in [,,,]) x = x;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-453249.js b/js/src/tests/non262/extensions/regress-453249.js
new file mode 100644
index 0000000000..910353da9a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-453249.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453249;
+var summary = 'Do not assert with JIT: s0->isQuad()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+this.__proto__.a = 3; for (var j = 0; j < 4; ++j) { [a]; }
+
+this.a = 3; for (var j = 0; j < 4; ++j) { [a]; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-454744.js b/js/src/tests/non262/extensions/regress-454744.js
new file mode 100644
index 0000000000..a686889d63
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-454744.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 454744;
+var summary = 'Do not assert with JIT: PCVAL_IS_SPROP(entry->vword)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ try
+ {
+ this.__defineGetter__('x', function() { return 2; }); for (var j=0;j<4;++j) { x=1; }
+ }
+ catch(ex)
+ {
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-455380.js b/js/src/tests/non262/extensions/regress-455380.js
new file mode 100644
index 0000000000..f0405621da
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-455380.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455380;
+var summary = 'Do not assert with JIT: !lhs->isQuad() && !rhs->isQuad()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+const IS_TOKEN_ARRAY =
+ [0, 0, 0, 0, 0, 0, 0, 0, // 0
+ 0, 0, 0, 0, 0, 0, 0, 0, // 8
+ 0, 0, 0, 0, 0, 0, 0, 0, // 16
+ 0, 0, 0, 0, 0, 0, 0, 0, // 24
+
+ 0, 1, 0, 1, 1, 1, 1, 1, // 32
+ 0, 0, 1, 1, 0, 1, 1, 0, // 40
+ 1, 1, 1, 1, 1, 1, 1, 1, // 48
+ 1, 1, 0, 0, 0, 0, 0, 0, // 56
+
+ 0, 1, 1, 1, 1, 1, 1, 1, // 64
+ 1, 1, 1, 1, 1, 1, 1, 1, // 72
+ 1, 1, 1, 1, 1, 1, 1, 1, // 80
+ 1, 1, 1, 0, 0, 0, 1, 1, // 88
+
+ 1, 1, 1, 1, 1, 1, 1, 1, // 96
+ 1, 1, 1, 1, 1, 1, 1, 1, // 104
+ 1, 1, 1, 1, 1, 1, 1, 1, // 112
+ 1, 1, 1, 0, 1, 0, 1]; // 120
+
+const headerUtils = {
+normalizeFieldName: function(fieldName)
+{
+ if (fieldName == "")
+ throw "error: empty string";
+
+ for (var i = 0, sz = fieldName.length; i < sz; i++)
+ {
+ if (!IS_TOKEN_ARRAY[fieldName.charCodeAt(i)])
+ {
+ throw (fieldName + " is not a valid header field name!");
+ }
+ }
+
+ return fieldName.toLowerCase();
+}
+};
+
+headerUtils.normalizeFieldName("Host");
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-455408.js b/js/src/tests/non262/extensions/regress-455408.js
new file mode 100644
index 0000000000..2f3796c1eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-455408.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455408;
+var summary = 'Do not assert with JIT: "Should not move data from GPR to XMM": false';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { if (({}).__proto__ = 1) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-456826.js b/js/src/tests/non262/extensions/regress-456826.js
new file mode 100644
index 0000000000..009e29790b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-456826.js
@@ -0,0 +1,126 @@
+// |reftest| skip-if(!xulRuntime.shell||Android) slow -- bug 504632
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456826;
+var summary = 'Do not assert with JIT during OOM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ if (typeof gcparam != 'undefined')
+ {
+ gc();
+ gc();
+ gcparam("maxBytes", gcparam("gcBytes") + 4*1024);
+ expectExitCode(5);
+ expectExitCode(3);
+ }
+
+ const numRows = 600;
+ const numCols = 600;
+ var scratch = {};
+ var scratchZ = {};
+
+ function complexMult(a, b) {
+ var newr = a.r * b.r - a.i * b.i;
+ var newi = a.r * b.i + a.i * b.r;
+ scratch.r = newr;
+ scratch.i = newi;
+ return scratch;
+ }
+
+ function complexAdd(a, b) {
+ scratch.r = a.r + b.r;
+ scratch.i = a.i + b.i;
+ return scratch;
+ }
+
+ function abs(a) {
+ return Math.sqrt(a.r * a.r + a.i * a.i);
+ }
+
+ function computeEscapeSpeed(c) {
+ scratchZ.r = scratchZ.i = 0;
+ const scaler = 5;
+ const threshold = (colors.length - 1) * scaler + 1;
+ for (var i = 1; i < threshold; ++i) {
+ scratchZ = complexAdd(c, complexMult(scratchZ, scratchZ));
+ if (scratchZ.r * scratchZ.r + scratchZ.i * scratchZ.i > 4) {
+ return Math.floor((i - 1) / scaler) + 1;
+ }
+ }
+ return 0;
+ }
+
+ const colorStrings = [
+ "black",
+ "green",
+ "blue",
+ "red",
+ "purple",
+ "orange",
+ "cyan",
+ "yellow",
+ "magenta",
+ "brown",
+ "pink",
+ "chartreuse",
+ "darkorange",
+ "crimson",
+ "gray",
+ "deeppink",
+ "firebrick",
+ "lavender",
+ "lawngreen",
+ "lightsalmon",
+ "lime",
+ "goldenrod"
+ ];
+
+ var colors = [];
+
+ function createMandelSet(realRange, imagRange) {
+ var start = new Date();
+
+ // Set up our colors
+ for (var color of colorStrings) {
+ var [r, g, b] = [0, 0, 0];
+ colors.push([r, g, b, 0xff]);
+ }
+
+ var realStep = (realRange.max - realRange.min)/numCols;
+ var imagStep = (imagRange.min - imagRange.max)/numRows;
+ for (var i = 0, curReal = realRange.min;
+ i < numCols;
+ ++i, curReal += realStep) {
+ for (var j = 0, curImag = imagRange.max;
+ j < numRows;
+ ++j, curImag += imagStep) {
+ var c = { r: curReal, i: curImag }
+ var n = computeEscapeSpeed(c);
+ }
+ }
+ print(Date.now() - start);
+ }
+
+ var realRange = { min: -2.1, max: 2 };
+ var imagRange = { min: -2, max: 2 };
+ createMandelSet(realRange, imagRange);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-459606.js b/js/src/tests/non262/extensions/regress-459606.js
new file mode 100644
index 0000000000..5d7e868133
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-459606.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459606;
+var summary = '(0.1).toFixed()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "0";
+ actual = (0.1).toFixed();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-462734-02.js b/js/src/tests/non262/extensions/regress-462734-02.js
new file mode 100644
index 0000000000..f7ccb5977d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-02.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ for (x in function(){}) ([]);
+ this.__defineGetter__("x", Function);
+ var obj = Object.create(x);
+ obj.prototype += [];
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-462734-03.js b/js/src/tests/non262/extensions/regress-462734-03.js
new file mode 100644
index 0000000000..c350154fc8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-03.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ Function.prototype.prototype;
+ var obj = Object.create(Function());
+ obj.prototype = obj.prototype;
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-462734-04.js b/js/src/tests/non262/extensions/regress-462734-04.js
new file mode 100644
index 0000000000..a7fbe8f07d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-04.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj;
+try
+{
+ Function.prototype.prototype = function() { return 42; }
+ obj = Object.create(Function());
+ obj.prototype = obj.prototype;
+}
+catch(ex)
+{
+}
+
+expect = 'object';
+actual = typeof obj.prototype;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-465276.js b/js/src/tests/non262/extensions/regress-465276.js
new file mode 100644
index 0000000000..7eb90f91ab
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465276.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465276;
+var summary = '((1 * (1))|""';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ empty = [];
+ out = [];
+ for (var j=0;j<10;++j) { empty[42]; out.push((1 * (1)) | ""); }
+
+ assertEqArray(out, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465337.js b/js/src/tests/non262/extensions/regress-465337.js
new file mode 100644
index 0000000000..f5167cb42a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465337.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465337;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var out = [];
+ for (let j = 0; j < 5; ++j) { out.push(6 - ((void 0) ^ 0x80000005)); }
+
+ assertEqArray(out, [2147483649, 2147483649, 2147483649, 2147483649, 2147483649]);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465443.js b/js/src/tests/non262/extensions/regress-465443.js
new file mode 100644
index 0000000000..4d0e9c13eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465443.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465443;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: invalid assignment to const \'b\'';
+
+
+ try
+ {
+ eval('(function () { const b = 16; var out = []; for (b of [true, "", true, "", true, ""]) out.push(b >> 1) })();');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465453.js b/js/src/tests/non262/extensions/regress-465453.js
new file mode 100644
index 0000000000..084276f202
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465453.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465453;
+var summary = 'Do not convert (undefined) to "undefined"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "true,,true,true,,,,,";
+
+ var out = [];
+ for (var e of [(new Boolean(true)),
+ (void 0),
+ (new Boolean(true)),
+ (new Boolean(true)),
+ (void 0),
+ (void 0),
+ "",
+ "",
+ (void 0)])
+ out.push(e);
+ print(actual = out.toString());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-466905-04.js b/js/src/tests/non262/extensions/regress-466905-04.js
new file mode 100644
index 0000000000..c724d0ce00
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-466905-04.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466905;
+var summary = 'Prototypes of sandboxed arrays';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx != 'function')
+ {
+ expect = actual = 'Test skipped: requires evalcx support';
+ }
+ else
+ {
+ expect = true;
+
+ function createArray()
+ {
+ var a;
+ for (var i = 0; i < 10; i++)
+ a = [1, 2, 3, 4, 5];
+ return a;
+ }
+
+ var sandbox = evalcx("lazy");
+ sandbox.createArray = createArray;
+ var p1 = Object.getPrototypeOf(createArray());
+ var p2 = Object.getPrototypeOf(evalcx("createArray()", sandbox));
+ print(actual = (p1 === p2));
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469234.js b/js/src/tests/non262/extensions/regress-469234.js
new file mode 100644
index 0000000000..2ed0475c62
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469234.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469234;
+var summary = 'TM: Do not assert: !JS_ON_TRACE(cx)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for(var j=0;j<3;++j)({__proto__:[]}).__defineSetter__('x',function(){});
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469405-01.js b/js/src/tests/non262/extensions/regress-469405-01.js
new file mode 100644
index 0000000000..b1113d9b57
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469405-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469405;
+var summary = 'Do not assert: !regs.sp[-2].isPrimitive()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ (function() {
+ var a, b;
+ for (a of [{}, {__iterator__: function(){}}]) for (b in a) { }
+ })();
+}
+catch(ex)
+{
+ print('caught ' + ex);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-469405-02.js b/js/src/tests/non262/extensions/regress-469405-02.js
new file mode 100644
index 0000000000..196557e699
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469405-02.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469405;
+var summary = 'Do not assert: !regs.sp[-2].isPrimitive()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval("__proto__.__iterator__ = [].toString");
+ for (var z = 0; z < 3; ++z) { if (z % 3 == 2) { for(let y in []); } }
+}
+catch(ex)
+{
+ print('caught ' + ex);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-469625-01.js b/js/src/tests/non262/extensions/regress-469625-01.js
new file mode 100644
index 0000000000..aa4d5bbc7d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469625-01.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469625;
+var summary = 'TM: Array prototype and expression closures';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: [].__proto__ is not a function';
+
+
+ Array.prototype.__proto__ = function () { return 3; };
+
+ try
+ {
+ [].__proto__();
+ }
+ catch(ex)
+ {
+ print(actual = ex + '');
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469625.js b/js/src/tests/non262/extensions/regress-469625.js
new file mode 100644
index 0000000000..84610b4889
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469625.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469625;
+var summary = 'TM: Do not crash @ js_String_getelem';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ [].__proto__[0] = 'a';
+ for (var j = 0; j < 3; ++j) [[, ]] = [,];
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469761.js b/js/src/tests/non262/extensions/regress-469761.js
new file mode 100644
index 0000000000..2866d18935
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469761.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469761;
+var summary = 'TM: Do not assert: STOBJ_GET_SLOT(callee_obj, JSSLOT_PRIVATE).isInt32()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var o = { __proto__: function(){} };
+ for (var j = 0; j < 3; ++j) { try { o.call(3); } catch (e) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470300-01.js b/js/src/tests/non262/extensions/regress-470300-01.js
new file mode 100644
index 0000000000..59e10868bf
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470300-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470300;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let a = 0; a < 3; ++a) { let b = '' + []; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470300-02.js b/js/src/tests/non262/extensions/regress-470300-02.js
new file mode 100644
index 0000000000..6e760e091c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470300-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470300;
+var summary = 'TM: Do not assert: !fp->blockChain || OBJ_GET_PARENT(cx, obj) == fp->blockChain';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let a = 0; a < 7; ++a) { let e = 8; if (a > 3) { let x; } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470310.js b/js/src/tests/non262/extensions/regress-470310.js
new file mode 100644
index 0000000000..460a60cc80
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470310.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470310;
+var summary = 'Do not assert: (uint32_t)((atoms - script->atomMap.vector + ' +
+ '((uintN)(((regs.pc + 0)[1] << 8) | (regs.pc + 0)[2])))) < objects_->length';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: 6 is not a function';
+
+ this.__defineSetter__('m', [].map);
+ function f() { for (var j = 0; j < 4; ++j) if (j == 3) m = 6; }
+ try { f(); } catch(e) { print(actual = e + ''); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472450-03.js b/js/src/tests/non262/extensions/regress-472450-03.js
new file mode 100644
index 0000000000..72609e4d23
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472450-03.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472450;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var cyclic = [];
+ cyclic[0] = cyclic;
+ ({__proto__: cyclic})
+ for (var y = 0; y < 3; ++y) { for (let z of ['', function(){}]) { let x =
+ 1, c = []; } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472450-04.js b/js/src/tests/non262/extensions/regress-472450-04.js
new file mode 100644
index 0000000000..56c7e5597c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472450-04.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472450;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var cyclic = [];
+ cyclic[0] = cyclic;
+ ({__proto__: cyclic});
+ function f(){
+ eval("for (var y = 0; y < 1; ++y) { for (let z of [null, function(){}, null, '', null, '', null]) { let x = 1, c = []; } }");
+ }
+ f();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472599.js b/js/src/tests/non262/extensions/regress-472599.js
new file mode 100644
index 0000000000..474e0b6336
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472599.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472599;
+var summary = 'Do not assert: STOBJ_GET_SLOT(callee_obj, JSSLOT_PRIVATE).isInt32()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = (function(){}).prototype;
+ a.__proto__ = a.toString;
+ for (var i = 0; i < 4; ++i) { try{ a.call({}); } catch(e) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-473040.js b/js/src/tests/non262/extensions/regress-473040.js
new file mode 100644
index 0000000000..95eb543e6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-473040.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 473040;
+var summary = 'Do not assert: tm->reservedDoublePoolPtr > tm->reservedDoublePool';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+Object.defineProperty(__proto__, "functional",
+{
+ enumerable: true, configurable: true,
+ get: new Function("gc()")
+});
+for (let x of [new Boolean(true), new Boolean(true), -0, new
+ Boolean(true), -0]) { undefined; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-474771-01.js b/js/src/tests/non262/extensions/regress-474771-01.js
new file mode 100644
index 0000000000..b9905947b1
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-474771-01.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'TM: do not assert: jumpTable == interruptJumpTable';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var o = {};
+ o.__defineSetter__('x', function(){});
+ for (let j = 0; j < 4; ++j) o.x = 3;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-474771-02.js b/js/src/tests/non262/extensions/regress-474771-02.js
new file mode 100644
index 0000000000..127351858a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-474771-02.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'TM: do not assert: jumpTable == interruptJumpTable';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+this.__defineSetter__('x', function(){});
+for (var j = 0; j < 5; ++j) { x = 3; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476414-01.js b/js/src/tests/non262/extensions/regress-476414-01.js
new file mode 100644
index 0000000000..2b0db43ab5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476414-01.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!xulRuntime.shell) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476414;
+var summary = 'Do not crash @ GetGCThingFlags';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function whatToTestSpidermonkeyTrunk(code)
+{
+ return {
+ allowExec: true
+ };
+}
+whatToTest = whatToTestSpidermonkeyTrunk;
+function tryItOut(code)
+{
+ var wtt = whatToTest(code.replace(/\n/g, " ").replace(/\r/g, " "));
+ var f = new Function(code);
+ if (wtt.allowExec && f) {
+ rv = tryRunning(f, code);
+ }
+}
+function tryRunning(f, code)
+{
+ try {
+ var rv = f();
+ } catch(runError) {}
+}
+var realFunction = Function;
+var realToString = toString;
+function tryEnsureSanity()
+{
+ delete Function;
+ delete toString;
+ Function = realFunction;
+ toString = realToString;
+}
+for (let iters = 0; iters < 2000; ++iters) {
+ count=27745; tryItOut("with({x: (c) = (x2 = [])})false;");
+ tryEnsureSanity();
+ count=35594; tryItOut("switch(null) { case this.__defineSetter__(\"window\", function* () { yield \"\" } ): break; }");
+ tryEnsureSanity();
+ count=45020; tryItOut("with({}) { (this.__defineGetter__(\"x\", function (y){ return this; })); } ");
+ tryEnsureSanity();
+ count=45197; tryItOut("M:with((p={}, (p.z = false )()))/*TUUL*/for (let y of [true, {}, {}, (void 0), true, true, true, (void 0), true, (void 0)]) { return; }");
+ tryEnsureSanity();
+ gc();
+ tryEnsureSanity();
+ count=45254; tryItOut("for (NaN in this);");
+ tryEnsureSanity();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476414-02.js b/js/src/tests/non262/extensions/regress-476414-02.js
new file mode 100644
index 0000000000..5a1cb1fe91
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476414-02.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!xulRuntime.shell) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476414;
+var summary = 'Do not crash @ js_NativeSet';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function whatToTestSpidermonkeyTrunk(code)
+{
+ return {
+ allowExec: true
+ };
+}
+whatToTest = whatToTestSpidermonkeyTrunk;
+function tryItOut(code)
+{
+ var wtt = whatToTest(code.replace(/\n/g, " ").replace(/\r/g, " "));
+ var f = new Function(code);
+ if (wtt.allowExec && f) {
+ rv = tryRunning(f, code);
+ }
+}
+function tryRunning(f, code)
+{
+ try {
+ var rv = f();
+ } catch(runError) {}
+}
+var realFunction = Function;
+var realToString = toString;
+function tryEnsureSanity()
+{
+ delete Function;
+ delete toString;
+ Function = realFunction;
+ toString = realToString;
+}
+for (let iters = 0; iters < 2000; ++iters) {
+ count=27745; tryItOut("with({x: (c) = (x2 = [])})false;");
+ tryEnsureSanity();
+ count=35594; tryItOut("switch(null) { case this.__defineSetter__(\"window\", function* () { yield \"\" } ): break; }");
+ tryEnsureSanity();
+ count=45020; tryItOut("with({}) { (this.__defineGetter__(\"x\", function (y) { return this; })); } ");
+ tryEnsureSanity();
+ count=45197; tryItOut("M:with((p={}, (p.z = false )()))/*TUUL*/for (let y of [true, {}, {}, (void 0), true, true, true, (void 0), true, (void 0)]) { return; }");
+ tryEnsureSanity();
+ gc();
+ tryEnsureSanity();
+ count=45254; tryItOut("for (NaN in this);");
+ tryEnsureSanity();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476447.js b/js/src/tests/non262/extensions/regress-476447.js
new file mode 100644
index 0000000000..ccac0b3019
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476447.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476447;
+var summary = 'Array getter/setter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype.__defineGetter__('lastElement',(function() { return this[this.length-1]}));
+ Array.prototype.__defineSetter__('lastElement',(function(num){this[this.length-1]=num}));
+ var testArr=[1,2,3,4];
+
+ expect = 4;
+ actual = testArr.lastElement;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-476653.js b/js/src/tests/non262/extensions/regress-476653.js
new file mode 100644
index 0000000000..f0d27713e0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476653.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476653;
+var summary = 'Do not crash @ QuoteString';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+for (let x1 of [''])
+for (i = 0; i < 1; ++i) {}
+for (i = 0; i < 1; ++i) {}
+for (let x of [new String('q'), '', /x/, '', /x/]) {
+ for (var y = 0; y < 7; ++y) { if (y == 2 || y == 6) { setter = x; } }
+}
+try
+{
+ this.f(z);
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/extensions/regress-476869.js b/js/src/tests/non262/extensions/regress-476869.js
new file mode 100644
index 0000000000..39f3dcd3dd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476869.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476869;
+var summary = 'Do not assert: v != JSVAL_ERROR_COOKIE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'undefined')
+ {
+ gczeal = (function (){});
+ }
+
+
+ function f()
+ {
+ (new Function("gczeal(1); for (let y of [/x/,'',new Boolean(false),new Boolean(false),new Boolean(false),'',/x/,new Boolean(false),new Boolean(false)]){}"))();
+ }
+ __proto__.__iterator__ = this.__defineGetter__("", function(){})
+ f();
+
+
+ delete __proto__.__iterator__;
+
+ gczeal(0);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-477158.js b/js/src/tests/non262/extensions/regress-477158.js
new file mode 100644
index 0000000000..d3696813ef
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-477158.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477158;
+var summary = 'Do not assert: v == JSVAL_TRUE || v == JSVAL_FALSE';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ x = 0;
+ x = x.prop;
+ for (let [] of ['', '']) { switch(x) { default: (function(){}); } };
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-477187.js b/js/src/tests/non262/extensions/regress-477187.js
new file mode 100644
index 0000000000..031ddd83dd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-477187.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477187;
+var summary = 'timeout script';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window != 'undefined' || typeof timeout != 'function')
+ {
+ print(expect = actual = 'Test skipped due to lack of timeout function');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ expectExitCode(6);
+ timeout(0.01);
+ // Call reportCompare early here to get a result. The test will fail if
+ // the timeout doesn't work and the test framework is forced to terminate
+ // the test.
+ reportCompare(expect, actual, summary);
+
+ while(1);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-479487.js b/js/src/tests/non262/extensions/regress-479487.js
new file mode 100644
index 0000000000..357c33d435
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-479487.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479487;
+var summary = 'js_Array_dense_setelem can call arbitrary JS code';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ Array.prototype[1] = 2;
+
+ Array.prototype.__defineSetter__(32, function() { print("Hello from arbitrary JS");});
+ Array.prototype.__defineGetter__(32, function() { return 11; });
+
+ function f()
+ {
+ var a = [];
+ for (var i = 0; i != 10; ++i) {
+ a[1 << i] = 9999;
+ }
+ return a;
+ }
+
+ f();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-479551.js b/js/src/tests/non262/extensions/regress-479551.js
new file mode 100644
index 0000000000..a08f941f22
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-479551.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479551;
+var summary = 'Do not assert: (cx)->requestDepth || (cx)->thread == (cx)->runtime->gcThread';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof shapeOf != 'function')
+ {
+ print(expect = actual = 'Test skipped: requires shell');
+ }
+ else
+ {
+
+ var o = {a:3, b:2};
+ shapeOf(o);
+ var p = {};
+ p.a =3;
+ p.b=2;
+ shapeOf(p);
+
+
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-480579.js b/js/src/tests/non262/extensions/regress-480579.js
new file mode 100644
index 0000000000..f28fe3a1fa
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-480579.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 480579;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '12';
+
+ a = {x: 1};
+ b = {__proto__: a};
+ c = {__proto__: b};
+ for (i = 0; i < 2; i++) {
+ print(actual += c.x);
+ b.x = 2;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-481516.js b/js/src/tests/non262/extensions/regress-481516.js
new file mode 100644
index 0000000000..e6bf1007f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-481516.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 481516;
+var summary = 'TM: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '1111222';
+
+ a = {x: 1};
+ b = {__proto__: a};
+ c = {__proto__: b};
+ objs = [{__proto__: a}, {__proto__: a}, {__proto__: a}, b, {__proto__: a},
+ {__proto__: a}];
+ for (i = 0; i < 6; i++) {
+ print(actual += ""+c.x);
+ objs[i].x = 2;
+ }
+ print(actual += c.x);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-482263.js b/js/src/tests/non262/extensions/regress-482263.js
new file mode 100644
index 0000000000..57159dc999
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-482263.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 482263;
+var summary = 'TM: Do not assert: x->oprnd2() == lirbuf->sp || x->oprnd2() == gp_ins';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+Object.defineProperty(__proto__, "x",
+{
+ enumerable: true, configurable: true,
+ get: function () { return ([]) }
+});
+for (let x of []) { for (let x of ['', '']) { } }
+
+
+reportCompare(expect, actual, summary);
+
+delete __proto__.x;
diff --git a/js/src/tests/non262/extensions/regress-50447-1.js b/js/src/tests/non262/extensions/regress-50447-1.js
new file mode 100644
index 0000000000..6af94b9a19
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-50447-1.js
@@ -0,0 +1,179 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/*
+ * SUMMARY: New properties fileName, lineNumber have been added to Error objects
+ * in SpiderMonkey. These are non-ECMA extensions and do not exist in Rhino.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=50447
+ *
+ * 2005-04-05 Modified by bclary to support changes to error reporting
+ * which set default values for the error's fileName and
+ * lineNumber properties.
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 50447;
+var summary = 'Test (non-ECMA) Error object properties fileName, lineNumber';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ testRealError();
+ test1();
+ test2();
+ test3();
+ test4();
+
+
+}
+
+// Normalize filenames so this test can work on Windows. This
+// function is also used on strings that contain filenames.
+function normalize(filename)
+{
+ // Also convert double-backslash to single-slash to handle
+ // escaped filenames in string literals.
+ return filename.replace(/\\{1,2}/g, '/');
+}
+
+function testRealError()
+{
+ /* throw a real error, and see what it looks like */
+
+
+ try
+ {
+ blabla;
+ }
+ catch (e)
+ {
+ if (e.fileName.search (/-50447-1\.js$/i) == -1)
+ reportCompare('PASS', 'FAIL', "expected fileName to end with '-50447-1.js'");
+
+ reportCompare(60, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+ }
+
+
+}
+
+
+function test1()
+{
+ /* generate an error with msg, file, and lineno properties */
+
+
+ var e = new InternalError ("msg", "file", 2);
+ if (Error.prototype.toSource) {
+ reportCompare ("(new InternalError(\"msg\", \"file\", 2))",
+ e.toSource(),
+ "toSource() returned unexpected result.");
+ }
+ reportCompare ("file", e.fileName,
+ "fileName property returned unexpected value.");
+ reportCompare (2, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test2()
+{
+ /* generate an error with only msg property */
+
+
+ /* note this test incorporates the path to the
+ test file and assumes the path to the test case
+ is a subdirectory of the directory containing jsDriver.pl
+ */
+ var expectedLine = 108;
+ var expectedFileName = 'non262/extensions/regress-50447-1.js';
+ var expectedSource = /\(new InternalError\("msg", "([^"]+)", ([0-9]+)\)\)/;
+
+ var e = new InternalError ("msg");
+
+ if (Error.prototype.toSource) {
+ var actual = expectedSource.exec(e.toSource());
+ reportCompare (normalize(actual[1]).endsWith(expectedFileName), true,
+ "toSource() returned unexpected result (filename).");
+ reportCompare (actual[2], String(expectedLine),
+ "toSource() returned unexpected result (line).");
+ }
+ reportCompare (normalize(e.fileName).endsWith(expectedFileName), true,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test3()
+{
+ /* generate an error with only msg and lineNo properties */
+
+ /* note this test incorporates the path to the
+ test file and assumes the path to the test case
+ is a subdirectory of the directory containing jsDriver.pl
+ */
+
+
+
+ var expectedLine = 10;
+ var expectedFileName = 'non262/extensions/regress-50447-1.js';
+ var expectedSource = /\(new InternalError\("msg", "([^"]+)", ([0-9]+)\)\)/;
+
+ var e = new InternalError ("msg");
+ e.lineNumber = expectedLine;
+
+ if (Error.prototype.toSource) {
+ var actual = expectedSource.exec(e.toSource());
+ reportCompare (normalize(actual[1]).endsWith(expectedFileName), true,
+ "toSource() returned unexpected result (filename).");
+ reportCompare (actual[2], String(expectedLine),
+ "toSource() returned unexpected result (line).");
+ }
+ reportCompare (normalize(e.fileName).endsWith(expectedFileName), true,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test4()
+{
+ /* generate an error with only msg and filename properties */
+
+
+ var expectedLine = 167;
+
+ var e = new InternalError ("msg", "file");
+ if (Error.prototype.toSource) {
+ reportCompare ("(new InternalError(\"msg\", \"file\", " + expectedLine + "))",
+ e.toSource(),
+ "toSource() returned unexpected result.");
+ }
+ reportCompare ("file", e.fileName,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
diff --git a/js/src/tests/non262/extensions/regress-543839.js b/js/src/tests/non262/extensions/regress-543839.js
new file mode 100644
index 0000000000..ce968bfba7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-543839.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Igor Bukanov
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 543839;
+var summary = 'js_GetMutableScope caller must lock the object';
+var actual;
+var expect = 1;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function test()
+{
+ for (var i = 0; i != 100; ++i)
+ var tmp = { a: 1 };
+ return 1;
+}
+
+if (typeof evalcx == 'undefined')
+{
+ print('Skipping. This test requires evalcx.');
+ actual = expect;
+} else {
+ test();
+ test();
+ test();
+ actual = evalcx("test()", this);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-591450.js b/js/src/tests/non262/extensions/regress-591450.js
new file mode 100644
index 0000000000..f1ebcf6758
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-591450.js
@@ -0,0 +1,12 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * This was causing the parser to assert at one point. Now it's not. Yay!
+ */
+function f(a,[x,y],b,[w,z],c) { function b() { } }
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/extensions/regress-636818.js b/js/src/tests/non262/extensions/regress-636818.js
new file mode 100644
index 0000000000..9fa1bc3798
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-636818.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+a = evalcx('');
+a.__proto__ = ''.__proto__;
+a.length = 3; // don't assert
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-645160.js b/js/src/tests/non262/extensions/regress-645160.js
new file mode 100644
index 0000000000..933d3e2614
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-645160.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function potatoMasher(obj, arg) { this.eval(arg); }
+potatoMasher(this, "var s = Error().stack");
+assertEq(/potatoMasher/.exec(s) instanceof Array, true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-650753.js b/js/src/tests/non262/extensions/regress-650753.js
new file mode 100644
index 0000000000..a518ec52a3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-650753.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var x = {}, h = new WeakMap;
+h.set(x, null);
+gc();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-696109.js b/js/src/tests/non262/extensions/regress-696109.js
new file mode 100644
index 0000000000..4a56340d36
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-696109.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Dave Herman <dherman@mozilla.com>
+ */
+
+// Bug 696109 - fixed a precedence bug in with/while nodes
+Reflect.parse("with({foo})bar");
+Reflect.parse("while({foo})bar");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/regress-90596-001.js b/js/src/tests/non262/extensions/regress-90596-001.js
new file mode 100644
index 0000000000..7a22ec8b37
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-90596-001.js
@@ -0,0 +1,264 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 28 August 2001
+ *
+ * SUMMARY: A [DontEnum] prop, if overridden, should appear in toSource().
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
+ *
+ * NOTE: some inefficiencies in the test are made for the sake of readability.
+ * Sorting properties alphabetically is done for definiteness in comparisons.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90596;
+var summary = 'A [DontEnum] prop, if overridden, should appear in toSource()';
+var cnCOMMA = ',';
+var cnLBRACE = '{';
+var cnRBRACE = '}';
+var cnLPAREN = '(';
+var cnRPAREN = ')';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj = {};
+
+
+status = inSection(1);
+obj = {toString:9};
+actual = obj.toSource();
+expect = '({toString:9})';
+addThis();
+
+status = inSection(2);
+obj = {hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(3);
+obj = {toString:9, hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(4);
+obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN EVAL CODE
+var s = '';
+
+status = inSection(5);
+s = 'obj = {toString:9}';
+eval(s);
+actual = obj.toSource();
+expect = '({toString:9})';
+addThis();
+
+status = inSection(6);
+s = 'obj = {hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(7);
+s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(8);
+s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN FUNCTION CODE
+function A()
+{
+ status = inSection(9);
+ var s = 'obj = {toString:9}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({toString:9})';
+ addThis();
+}
+A();
+
+function B()
+{
+ status = inSection(10);
+ var s = 'obj = {hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({hasOwnProperty:"Hi"})';
+ addThis();
+}
+B();
+
+function C()
+{
+ status = inSection(11);
+ var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+C();
+
+function D()
+{
+ status = inSection(12);
+ var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+D();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Sort properties alphabetically -
+ */
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = sortThis(actual);
+ expectedvalues[UBound] = sortThis(expect);
+ UBound++;
+}
+
+
+/*
+ * Takes string of form '({"c", "b", "a", 2})' and returns '({"a","b","c",2})'
+ */
+function sortThis(sList)
+{
+ sList = compactThis(sList);
+ sList = stripParens(sList);
+ sList = stripBraces(sList);
+ var arr = sList.split(cnCOMMA);
+ arr = arr.sort();
+ var ret = String(arr);
+ ret = addBraces(ret);
+ ret = addParens(ret);
+ return ret;
+}
+
+
+/*
+ * Strips out any whitespace from the text -
+ */
+function compactThis(text)
+{
+ var charCode = 0;
+ var ret = '';
+
+ for (var i=0; i<text.length; i++)
+ {
+ charCode = text.charCodeAt(i);
+
+ if (!isWhiteSpace(charCode))
+ ret += text.charAt(i);
+ }
+
+ return ret;
+}
+
+
+function isWhiteSpace(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0009):
+ case (0x000B):
+ case (0x000C):
+ case (0x0020):
+ case (0x000A): // '\n'
+ case (0x000D): // '\r'
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+/*
+ * strips off parens at beginning and end of text -
+ */
+function stripParens(text)
+{
+ // remember to escape the parens...
+ var arr = text.match(/^\((.*)\)$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+/*
+ * strips off braces at beginning and end of text -
+ */
+function stripBraces(text)
+{
+ // remember to escape the braces...
+ var arr = text.match(/^\{(.*)\}$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+function addBraces(text)
+{
+ return cnLBRACE + text + cnRBRACE;
+}
+
+
+function addParens(text)
+{
+ return cnLPAREN + text + cnRPAREN;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-96284-001.js b/js/src/tests/non262/extensions/regress-96284-001.js
new file mode 100644
index 0000000000..ec0992f6a4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-96284-001.js
@@ -0,0 +1,147 @@
+// |reftest| skip-if(!Error.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 03 September 2001
+ *
+ * SUMMARY: Double quotes should be escaped in Error.prototype.toSource()
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96284
+ *
+ * The real point here is this: we should be able to reconstruct an object
+ * from its toSource() property. We'll test this on various types of objects.
+ *
+ * Method: define obj2 = eval(obj1.toSource()) and verify that
+ * obj2.toSource() == obj1.toSource().
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96284;
+var summary = 'Double quotes should be escaped in Error.prototype.toSource()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj1 = {};
+var obj2 = {};
+var cnTestString = '"This is a \" STUPID \" test string!!!"\\';
+
+
+// various NativeError objects -
+status = inSection(1);
+obj1 = Error(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(2);
+obj1 = EvalError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(3);
+obj1 = RangeError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(4);
+obj1 = ReferenceError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(5);
+obj1 = SyntaxError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(6);
+obj1 = TypeError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(7);
+obj1 = URIError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+// other types of objects -
+status = inSection(8);
+obj1 = new String(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(9);
+obj1 = {color:'red', texture:cnTestString, hasOwnProperty:42};
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(10);
+obj1 = function(x) {function g(y){return y+1;} return g(x);};
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(11);
+obj1 = new Number(eval('6'));
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(12);
+obj1 = /ad;(lf)kj(2309\/\/)\/\//;
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-bug607284.js b/js/src/tests/non262/extensions/regress-bug607284.js
new file mode 100644
index 0000000000..7d2c4921d2
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-bug607284.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if ("evalcx" in this) {
+ var sandbox = evalcx("");
+ var obj = { get foo() { throw("FAIL"); } };
+ var getter = obj.__lookupGetter__("foo");
+ var desc = sandbox.Object.getOwnPropertyDescriptor(obj, "foo");
+ reportCompare(desc.get, getter, "getter is correct");
+ reportCompare(desc.set, undefined, "setter is correct");
+}
+else {
+ reportCompare(true, true);
+}
diff --git a/js/src/tests/non262/extensions/regress-bug629723.js b/js/src/tests/non262/extensions/regress-bug629723.js
new file mode 100644
index 0000000000..6c826e0c20
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-bug629723.js
@@ -0,0 +1,16 @@
+function f(foo) {
+ "use strict";
+ foo.bar;
+}
+
+var actual;
+try {
+ f();
+ actual = "no error";
+} catch (x) {
+ actual = (x instanceof TypeError) ? "type error" : "some other error";
+ actual += (/use strict/.test(x)) ? " with directive" : " without directive";
+}
+
+reportCompare("type error without directive", actual,
+ "decompiled expressions in error messages should not include directive prologues");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js
new file mode 100644
index 0000000000..e51e199033
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js
@@ -0,0 +1,39 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901351;
+var summary = "Behavior when the JSON.parse reviver mutates the holder array";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var proxyObj = null;
+
+var arr = JSON.parse('[0, 1]', function(prop, v) {
+ if (prop === "0")
+ {
+ proxyObj = newGlobal().evaluate("({ c: 17, d: 42 })");
+ this[1] = proxyObj;
+ }
+ return v;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], proxyObj);
+assertEq(arr[1].c, 17);
+assertEq(arr[1].d, 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js
new file mode 100644
index 0000000000..de4ad7032e
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901380;
+var summary = "Behavior when JSON.parse walks over a non-native object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var typedArray = null;
+
+var observedTypedArrayElementCount = 0;
+
+var arr = JSON.parse('[0, 1]', function(prop, v) {
+ if (prop === "0" && Array.isArray(this)) // exclude typedArray[0]
+ {
+ typedArray = new Int8Array(1);
+ this[1] = typedArray;
+ }
+ if (this instanceof Int8Array)
+ {
+ assertEq(prop, "0");
+ observedTypedArrayElementCount++;
+ }
+ return v;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], typedArray);
+
+assertEq(observedTypedArrayElementCount, 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array.js
new file mode 100644
index 0000000000..f4f89ac0ab
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array.js
@@ -0,0 +1,39 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901351;
+var summary = "Behavior when the JSON.parse reviver mutates the holder array";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var proxyObj = null;
+
+var arr = JSON.parse('[0, 1]', function(prop, v) {
+ if (prop === "0")
+ {
+ proxyObj = new Proxy({ c: 17, d: 42 }, {});
+ this[1] = proxyObj;
+ }
+ return v;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], proxyObj);
+assertEq(arr[1].c, 17);
+assertEq(arr[1].d, 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js
new file mode 100644
index 0000000000..546a57e916
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901351;
+var summary = "Behavior when the JSON.parse reviver mutates the holder object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// A little trickiness to account for the undefined-ness of property
+// enumeration order.
+var first = "unset";
+
+var proxyObj = null;
+
+var obj = JSON.parse('{ "a": 0, "b": 1 }', function(prop, v) {
+ if (first === "unset")
+ {
+ first = prop;
+ var second = (prop === "a") ? "b" : "a";
+
+ proxyObj = newGlobal().evaluate("({ c: 42, d: 17 })");
+ Object.defineProperty(this, second, { value: proxyObj });
+ }
+ return v;
+});
+
+if (first === "a")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, proxyObj);
+ assertEq(obj.b.c, 42);
+ assertEq(obj.b.d, 17);
+}
+else
+{
+ assertEq(obj.a, proxyObj);
+ assertEq(obj.a.c, 42);
+ assertEq(obj.a.d, 17);
+ assertEq(obj.b, 1);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js
new file mode 100644
index 0000000000..1300f8dd0d
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901380;
+var summary = "Behavior when JSON.parse walks over a non-native object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// A little trickiness to account for the undefined-ness of property
+// enumeration order.
+var first = "unset";
+
+var observedTypedArrayElementCount = 0;
+
+var typedArray = null;
+
+var obj = JSON.parse('{ "a": 0, "b": 1 }', function(prop, v) {
+ if (first === "unset")
+ {
+ first = prop;
+ var second = (prop === "a") ? "b" : "a";
+ typedArray = new Int8Array(1);
+ Object.defineProperty(this, second, { value: typedArray });
+ }
+ if (this instanceof Int8Array)
+ {
+ assertEq(prop, "0");
+ observedTypedArrayElementCount++;
+ }
+ return v;
+});
+
+if (first === "a")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, typedArray);
+}
+else
+{
+ assertEq(obj.a, typedArray);
+ assertEq(obj.b, 1);
+}
+
+assertEq(observedTypedArrayElementCount, 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object.js
new file mode 100644
index 0000000000..973766e9ae
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901351;
+var summary = "Behavior when the JSON.parse reviver mutates the holder object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// A little trickiness to account for the undefined-ness of property
+// enumeration order.
+var first = "unset";
+
+var proxyObj = null;
+
+var obj = JSON.parse('{ "a": 0, "b": 1 }', function(prop, v) {
+ if (first === "unset")
+ {
+ first = prop;
+ var second = (prop === "a") ? "b" : "a";
+
+ proxyObj = new Proxy({ c: 42, d: 17 }, {});
+ Object.defineProperty(this, second, { value: proxyObj });
+ }
+ return v;
+});
+
+if (first === "a")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, proxyObj);
+ assertEq(obj.b.c, 42);
+ assertEq(obj.b.d, 17);
+}
+else
+{
+ assertEq(obj.a, proxyObj);
+ assertEq(obj.a.c, 42);
+ assertEq(obj.a.d, 17);
+ assertEq(obj.b, 1);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/scope-001.js b/js/src/tests/non262/extensions/scope-001.js
new file mode 100644
index 0000000000..f3157af01c
--- /dev/null
+++ b/js/src/tests/non262/extensions/scope-001.js
@@ -0,0 +1,84 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = '53268';
+var status = 'Testing scope after changing obj.__proto__';
+var expect= '';
+var actual = '';
+var obj = {};
+
+Object.defineProperty(this, "five", {
+ value: 5,
+ enumerable: true,
+ writable: false
+});
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (status);
+
+
+ status= 'Step 1: setting obj.__proto__ = global object';
+ obj.__proto__ = this;
+
+ actual = obj.five;
+ expect=5;
+ reportCompare (expect, actual, status);
+
+ obj.five=1;
+ actual = obj.five;
+ expect=5;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 2: setting obj.__proto__ = null';
+ obj.__proto__ = null;
+
+ actual = obj.five;
+ expect=undefined;
+ reportCompare (expect, actual, status);
+
+ obj.five=2;
+ actual = obj.five;
+ expect=2;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 3: setting obj.__proto__ to global object again';
+ obj.__proto__ = this;
+
+ actual = obj.five;
+ expect=2; //<--- (FROM STEP 2 ABOVE)
+ reportCompare (expect, actual, status);
+
+ obj.five=3;
+ actual = obj.five;
+ expect=3;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 4: setting obj.__proto__ to null again';
+ obj.__proto__ = null;
+
+ actual = obj.five;
+ expect=3; //<--- (FROM STEP 3 ABOVE)
+ reportCompare (expect, actual, status);
+
+ obj.five=4;
+ actual = obj.five;
+ expect=4;
+ reportCompare (expect, actual, status);
+}
diff --git a/js/src/tests/non262/extensions/set-property-non-extensible.js b/js/src/tests/non262/extensions/set-property-non-extensible.js
new file mode 100644
index 0000000000..096278d726
--- /dev/null
+++ b/js/src/tests/non262/extensions/set-property-non-extensible.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!xulRuntime.shell) -- preventExtensions on global
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 600128;
+var summary =
+ "Properly handle attempted addition of properties to non-extensible objects";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var o = Object.freeze({});
+for (var i = 0; i < 10; i++)
+ print(o.u = "");
+
+Object.freeze(this);
+for (let j = 0; j < 10; j++)
+ print(u = "");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/setImmutablePrototype.js b/js/src/tests/non262/extensions/setImmutablePrototype.js
new file mode 100644
index 0000000000..9d107472e5
--- /dev/null
+++ b/js/src/tests/non262/extensions/setImmutablePrototype.js
@@ -0,0 +1,196 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = "setImmutablePrototype.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1052139;
+var summary =
+ "Implement JSAPI and a shell function to prevent modifying an extensible " +
+ "object's [[Prototype]]";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+if (typeof evaluate !== "function")
+{
+ // Not totally faithful semantics, but approximately close enough for this
+ // test's purposes.
+ evaluate = eval;
+}
+
+var usingRealSetImmutablePrototype = true;
+
+if (typeof setImmutablePrototype !== "function")
+{
+ usingRealSetImmutablePrototype = false;
+
+ if (typeof SpecialPowers !== "undefined")
+ {
+ setImmutablePrototype =
+ SpecialPowers.Cu.getJSTestingFunctions().setImmutablePrototype;
+ }
+}
+
+if (typeof wrap !== "function")
+{
+ // good enough
+ wrap = function(x) { return x; };
+}
+
+function setViaProtoSetter(obj, newProto)
+{
+ var setter =
+ Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set;
+ setter.call(obj, newProto);
+}
+
+function checkPrototypeMutationFailure(obj, desc)
+{
+ var initialProto = Object.getPrototypeOf(obj);
+
+ // disconnected from any [[Prototype]] chains for use on any object at all
+ var newProto = Object.create(null);
+
+ function tryMutate(func, method)
+ {
+ try
+ {
+ func(obj, newProto);
+ throw new Error(desc + ": no error thrown, prototype " +
+ (Object.getPrototypeOf(obj) === initialProto
+ ? "wasn't"
+ : "was") +
+ " changed");
+ }
+ catch (e)
+ {
+ // Note: This is always a TypeError from *this* global object, because
+ // Object.setPrototypeOf and the __proto__ setter come from *this*
+ // global object.
+ assertEq(e instanceof TypeError, true,
+ desc + ": should have thrown TypeError setting [[Prototype]] " +
+ "via " + method + ", got " + e);
+ assertEq(Object.getPrototypeOf(obj), initialProto,
+ desc + ": shouldn't observe [[Prototype]] change");
+ }
+ }
+
+ tryMutate(Object.setPrototypeOf, "Object.setPrototypeOf");
+ tryMutate(setViaProtoSetter, "__proto__ setter");
+}
+
+function runNormalTests(global)
+{
+ if (typeof setImmutablePrototype !== "function")
+ {
+ print("no testable setImmutablePrototype function available, skipping tests");
+ return;
+ }
+
+ // regular old object, non-null [[Prototype]]
+
+ var emptyLiteral = global.evaluate("({})");
+ assertEq(setImmutablePrototype(emptyLiteral), true);
+ checkPrototypeMutationFailure(emptyLiteral, "empty literal");
+
+ // regular old object, null [[Prototype]]
+
+ var nullProto = global.Object.create(null);
+ assertEq(setImmutablePrototype(nullProto), true);
+ checkPrototypeMutationFailure(nullProto, "nullProto");
+
+ // Shocker: SpecialPowers's little mind doesn't understand proxies. Abort.
+ if (!usingRealSetImmutablePrototype)
+ return;
+
+ // direct proxies
+
+ var emptyTarget = global.evaluate("({})");
+ var directProxy = new global.Proxy(emptyTarget, {});
+ assertEq(setImmutablePrototype(directProxy), true);
+ checkPrototypeMutationFailure(directProxy, "direct proxy to empty target");
+ checkPrototypeMutationFailure(emptyTarget, "empty target");
+
+ var anotherTarget = global.evaluate("({})");
+ var anotherDirectProxy = new global.Proxy(anotherTarget, {});
+ assertEq(setImmutablePrototype(anotherTarget), true);
+ checkPrototypeMutationFailure(anotherDirectProxy, "another direct proxy to empty target");
+ checkPrototypeMutationFailure(anotherTarget, "another empty target");
+
+ var nestedTarget = global.evaluate("({})");
+ var nestedProxy = new global.Proxy(new Proxy(nestedTarget, {}), {});
+ assertEq(setImmutablePrototype(nestedProxy), true);
+ checkPrototypeMutationFailure(nestedProxy, "nested proxy to empty target");
+ checkPrototypeMutationFailure(nestedTarget, "nested target");
+
+ // revocable proxies
+
+ var revocableTarget = global.evaluate("({})");
+ var revocable = global.Proxy.revocable(revocableTarget, {});
+ assertEq(setImmutablePrototype(revocable.proxy), true);
+ checkPrototypeMutationFailure(revocableTarget, "revocable target");
+ checkPrototypeMutationFailure(revocable.proxy, "revocable proxy");
+
+ assertEq(revocable.revoke(), undefined);
+ try
+ {
+ setImmutablePrototype(revocable.proxy);
+ throw new Error("expected to throw on revoked proxy");
+ }
+ catch (e)
+ {
+ // Note: In the cross-compartment case, this is a TypeError from |global|,
+ // because the proxy's |setImmutablePrototype| method is what actually
+ // throws here. That's why we check for TypeError from either global.
+ // (Usually the method simply sets |*succeeded| to false and the
+ // caller handles or throws as needed after that. But not here.)
+ assertEq(e instanceof global.TypeError || e instanceof TypeError, true,
+ "expected TypeError, instead threw " + e);
+ }
+
+ var anotherRevocableTarget = global.evaluate("({})");
+ assertEq(setImmutablePrototype(anotherRevocableTarget), true);
+ checkPrototypeMutationFailure(anotherRevocableTarget, "another revocable target");
+
+ var anotherRevocable = global.Proxy.revocable(anotherRevocableTarget, {});
+ checkPrototypeMutationFailure(anotherRevocable.proxy, "another revocable target");
+
+ assertEq(anotherRevocable.revoke(), undefined);
+ try
+ {
+ var rv = setImmutablePrototype(anotherRevocable.proxy);
+ throw new Error("expected to throw on another revoked proxy, returned " + rv);
+ }
+ catch (e)
+ {
+ // NOTE: Again from |global| or |this|, as above.
+ assertEq(e instanceof global.TypeError || e instanceof TypeError, true,
+ "expected TypeError, instead threw " + e);
+ }
+}
+
+var global = this;
+runNormalTests(global); // same-global
+
+if (typeof newGlobal === "function")
+{
+ var otherGlobal = newGlobal();
+ var subsumingNothing = newGlobal({ principal: 0 });
+ var subsumingEverything = newGlobal({ principal: ~0 });
+
+ runNormalTests(otherGlobal); // cross-global
+ runNormalTests(subsumingNothing);
+ runNormalTests(subsumingEverything);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/shareddataview.js b/js/src/tests/non262/extensions/shareddataview.js
new file mode 100644
index 0000000000..30ec8ef68e
--- /dev/null
+++ b/js/src/tests/non262/extensions/shareddataview.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Test DataView on SharedArrayBuffer.
+
+if (this.SharedArrayBuffer) {
+
+var sab = new SharedArrayBuffer(4096);
+var dv = new DataView(sab);
+
+assertEq(sab, dv.buffer);
+assertEq(dv.byteLength, sab.byteLength);
+assertEq(ArrayBuffer.isView(dv), true);
+
+var dv2 = new DataView(sab, 1075, 2048);
+
+assertEq(sab, dv2.buffer);
+assertEq(dv2.byteLength, 2048);
+assertEq(dv2.byteOffset, 1075);
+assertEq(ArrayBuffer.isView(dv2), true);
+
+// Test that it is the same buffer memory for the two views
+
+dv.setInt8(1075, 37);
+assertEq(dv2.getInt8(0), 37);
+
+// Test that range checking works
+
+assertThrowsInstanceOf(() => dv.setInt32(4098, -1), RangeError);
+assertThrowsInstanceOf(() => dv.setInt32(4094, -1), RangeError);
+assertThrowsInstanceOf(() => dv.setInt32(-1, -1), RangeError);
+
+assertThrowsInstanceOf(() => dv2.setInt32(2080, -1), RangeError);
+assertThrowsInstanceOf(() => dv2.setInt32(2046, -1), RangeError);
+assertThrowsInstanceOf(() => dv2.setInt32(-1, -1), RangeError);
+
+}
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/sharedtypedarray.js b/js/src/tests/non262/extensions/sharedtypedarray.js
new file mode 100644
index 0000000000..56187d29f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/sharedtypedarray.js
@@ -0,0 +1,273 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Minimal test cases. Note that on 64-bit a SharedArrayBuffer is
+// very expensive under these rules - a 4GB area is reserved for it.
+// So don't go allocating a ton of them.
+//
+// These tests cannot test that sharing works across workers. There
+// are or will be tests, in dom/workers, that do that.
+
+var b;
+
+function testSharedArrayBuffer() {
+ b = new SharedArrayBuffer("4096"); // Test string conversion, too
+ assertEq(b instanceof SharedArrayBuffer, true);
+ assertEq(b.byteLength, 4096);
+
+ b.fnord = "Hi there";
+ assertEq(b.fnord, "Hi there");
+
+ SharedArrayBuffer.prototype.abracadabra = "no wishing for wishes!";
+ assertEq(b.abracadabra, "no wishing for wishes!");
+
+ // SharedArrayBuffer is not a conversion operator, not even for instances of itself
+ assertThrowsInstanceOf(() => SharedArrayBuffer(b), TypeError);
+
+ // can't convert any other object either
+ assertThrowsInstanceOf(() => SharedArrayBuffer({}), TypeError);
+
+ // byteLength can be invoked as per normal, indirectly
+ assertEq(Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype,"byteLength").get.call(b), 4096);
+
+ // however byteLength is not generic
+ assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype,"byteLength").get.call({}), TypeError);
+
+}
+
+function testSharedTypedArray() {
+ var x1 = new Int8Array(b);
+ var x2 = new Int32Array(b);
+
+ assertEq(ArrayBuffer.isView(x1), true); // ArrayBuffer.isView() works even if the buffer is a SharedArrayBuffer
+ assertEq(ArrayBuffer.isView(x2), true);
+ assertEq(ArrayBuffer.isView({}), false);
+
+ assertEq(x1.buffer, b);
+ assertEq(x2.buffer, b);
+
+ assertEq(x1.byteLength, b.byteLength);
+ assertEq(x2.byteLength, b.byteLength);
+
+ assertEq(x1.byteOffset, 0);
+ assertEq(x2.byteOffset, 0);
+
+ assertEq(x1.length, b.byteLength);
+ assertEq(x2.length, b.byteLength / 4);
+
+ var x3 = new Int8Array(b, 20);
+ assertEq(x3.length, b.byteLength - 20);
+ assertEq(x3.byteOffset, 20);
+
+ var x3 = new Int32Array(b, 20, 10);
+ assertEq(x3.length, 10);
+ assertEq(x3.byteOffset, 20);
+
+ // Mismatched type
+ assertThrowsInstanceOf(() => Int8Array(x2), TypeError);
+
+ // Unconvertable object
+ assertThrowsInstanceOf(() => Int8Array({}), TypeError);
+
+ // negative start
+ assertThrowsInstanceOf(() => new Int8Array(b, -7), RangeError);
+
+ // not congruent mod element size
+ assertThrowsInstanceOf(() => new Int32Array(b, 3), RangeError);
+
+ // start out of range
+ assertThrowsInstanceOf(() => new Int32Array(b, 4104), RangeError);
+
+ // end out of range
+ assertThrowsInstanceOf(() => new Int32Array(b, 4092, 2), RangeError);
+
+ // Views alias the storage
+ x2[0] = -1;
+ assertEq(x1[0], -1);
+ x1[0] = 1;
+ x1[1] = 1;
+ x1[2] = 1;
+ x1[3] = 1;
+ assertEq(x2[0], 0x01010101);
+
+ assertEq(x2[5], 0);
+ x3[0] = -1;
+ assertEq(x2[5], -1);
+
+ // Out-of-range accesses yield undefined
+ assertEq(x2[1023], 0);
+ assertEq(x2[1024], undefined);
+ assertEq(x2[2047], undefined);
+}
+
+function testSharedTypedArrayMethods() {
+ var v = new Int32Array(b);
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+
+ // Rudimentary tests - they don't test any boundary conditions
+
+ // subarray
+ var w = v.subarray(10, 20);
+ assertEq(w.length, 10);
+ for ( var i=0 ; i < w.length ; i++ )
+ assertEq(w[i], v[i+10]);
+ for ( var i=0 ; i < w.length ; i++ )
+ w[i] = -w[i];
+ for ( var i=0 ; i < w.length ; i++ )
+ assertEq(w[i], v[i+10]);
+
+ // copyWithin
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+ v.copyWithin(10, 20, 30);
+ for ( var i=0 ; i < 10 ; i++ )
+ assertEq(v[i], i);
+ for ( var i=10 ; i < 20 ; i++ )
+ assertEq(v[i], v[i+10]);
+
+ // set
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+ v.set([-1,-2,-3,-4,-5,-6,-7,-8,-9,-10], 5);
+ for ( var i=5 ; i < 15 ; i++ )
+ assertEq(v[i], -i+4);
+
+ // In the following two cases the two arrays will reference the same buffer,
+ // so there will be an overlapping copy.
+ //
+ // Case 1: Read from lower indices than are written
+ v.set(v.subarray(0, 7), 1);
+ assertEq(v[0], 0);
+ assertEq(v[1], 0);
+ assertEq(v[2], 1);
+ assertEq(v[3], 2);
+ assertEq(v[4], 3);
+ assertEq(v[5], 4);
+ assertEq(v[6], -1);
+ assertEq(v[7], -2);
+ assertEq(v[8], -4);
+ assertEq(v[9], -5);
+
+ // Case 2: Read from higher indices than are written
+ v.set(v.subarray(1, 5), 0);
+ assertEq(v[0], 0);
+ assertEq(v[1], 1);
+ assertEq(v[2], 2);
+ assertEq(v[3], 3);
+ assertEq(v[4], 3);
+ assertEq(v[5], 4);
+ assertEq(v[6], -1);
+ assertEq(v[7], -2);
+ assertEq(v[8], -4);
+ assertEq(v[9], -5);
+}
+
+function testClone1() {
+ var sab1 = b;
+ var blob = serialize(sab1, [], {SharedArrayBuffer: 'allow'});
+ var sab2 = deserialize(blob, {SharedArrayBuffer: 'allow'});
+ if (typeof sharedAddress != "undefined")
+ assertEq(sharedAddress(sab1), sharedAddress(sab2));
+}
+
+function testClone2() {
+ var sab = b;
+ var ia1 = new Int32Array(sab);
+ var blob = serialize(ia1, [], {SharedArrayBuffer: 'allow'});
+ var ia2 = deserialize(blob, {SharedArrayBuffer: 'allow'});
+ assertEq(ia1.length, ia2.length);
+ assertEq(ia1.buffer instanceof SharedArrayBuffer, true);
+ if (typeof sharedAddress != "undefined")
+ assertEq(sharedAddress(ia1.buffer), sharedAddress(ia2.buffer));
+ ia1[10] = 37;
+ assertEq(ia2[10], 37);
+}
+
+// Serializing a SharedArrayBuffer should fail if we've set its flag to 'deny' or if
+// the flag is bogus or if the flag is not set to 'allow' explicitly
+
+function testNoClone() {
+ // This just tests the API in serialize()
+ assertThrowsInstanceOf(() => serialize(b, [], {SharedArrayBuffer: false}), Error);
+
+ // This tests the actual cloning functionality - should fail
+ assertThrowsInstanceOf(() => serialize(b, [], {SharedArrayBuffer: 'deny'}), TypeError);
+
+ // This tests that cloning a SharedArrayBuffer is not allowed by default
+ assertThrowsInstanceOf(() => serialize(b), TypeError);
+
+ // Ditto - should succeed
+ assertEq(typeof serialize(b, [], {SharedArrayBuffer: 'allow'}), "object");
+
+ let blob = serialize(b, [], {SharedArrayBuffer: 'allow'});
+ // This just tests the API in deserialize()
+ assertThrowsInstanceOf(() => deserialize(blob, {SharedArrayBuffer: false}), Error);
+
+ // This tests the actual cloning functionality - should fail
+ assertThrowsInstanceOf(() => deserialize(blob, {SharedArrayBuffer: 'deny'}), TypeError);
+
+ // This tests that cloning a SharedArrayBuffer is not allowed by default
+ assertThrowsInstanceOf(() => deserialize(blob), TypeError);
+
+ // Ditto - should succeed
+ assertEq(typeof deserialize(blob, {SharedArrayBuffer: 'allow'}), "object");
+}
+
+function testRedundantTransfer() {
+ // Throws TypeError in the shell, DataCloneError in the browser.
+ assertThrowsInstanceOf(() => {
+ var sab1 = b;
+ var blob = serialize(sab1, [sab1], {SharedArrayBuffer: 'allow'});
+ }, TypeError);
+}
+
+function testApplicable() {
+ var sab = b;
+ var x;
+
+ // Just make sure we can create all the view types on shared memory.
+
+ x = new Int32Array(sab);
+ assertEq(x.length, sab.byteLength / Int32Array.BYTES_PER_ELEMENT);
+ x = new Uint32Array(sab);
+ assertEq(x.length, sab.byteLength / Uint32Array.BYTES_PER_ELEMENT);
+
+ x = new Int16Array(sab);
+ assertEq(x.length, sab.byteLength / Int16Array.BYTES_PER_ELEMENT);
+ x = new Uint16Array(sab);
+ assertEq(x.length, sab.byteLength / Uint16Array.BYTES_PER_ELEMENT);
+
+ x = new Int8Array(sab);
+ assertEq(x.length, sab.byteLength / Int8Array.BYTES_PER_ELEMENT);
+ x = new Uint8Array(sab);
+ assertEq(x.length, sab.byteLength / Uint8Array.BYTES_PER_ELEMENT);
+
+ // Though the atomic operations are illegal on Uint8ClampedArray and the
+ // float arrays, they can still be used to create views on shared memory.
+
+ x = new Uint8ClampedArray(sab);
+ assertEq(x.length, sab.byteLength / Uint8ClampedArray.BYTES_PER_ELEMENT);
+
+ x = new Float32Array(sab);
+ assertEq(x.length, sab.byteLength / Float32Array.BYTES_PER_ELEMENT);
+ x = new Float64Array(sab);
+ assertEq(x.length, sab.byteLength / Float64Array.BYTES_PER_ELEMENT);
+}
+
+if (this.SharedArrayBuffer) {
+ testSharedArrayBuffer();
+ testSharedTypedArray();
+ testSharedTypedArrayMethods();
+ testClone1();
+ testClone2();
+ testNoClone();
+ testRedundantTransfer();
+ testApplicable();
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/shell.js b/js/src/tests/non262/extensions/shell.js
new file mode 100644
index 0000000000..e7381a0b93
--- /dev/null
+++ b/js/src/tests/non262/extensions/shell.js
@@ -0,0 +1,345 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+(function(global) {
+ /*
+ * Date: 07 February 2001
+ *
+ * Functionality common to RegExp testing -
+ */
+ //-----------------------------------------------------------------------------
+
+ var MSG_PATTERN = '\nregexp = ';
+ var MSG_STRING = '\nstring = ';
+ var MSG_EXPECT = '\nExpect: ';
+ var MSG_ACTUAL = '\nActual: ';
+ var ERR_LENGTH = '\nERROR !!! match arrays have different lengths:';
+ var ERR_MATCH = '\nERROR !!! regexp failed to give expected match array:';
+ var ERR_NO_MATCH = '\nERROR !!! regexp FAILED to match anything !!!';
+ var ERR_UNEXP_MATCH = '\nERROR !!! regexp MATCHED when we expected it to fail !!!';
+ var CHAR_LBRACKET = '[';
+ var CHAR_RBRACKET = ']';
+ var CHAR_QT_DBL = '"';
+ var CHAR_QT = "'";
+ var CHAR_NL = '\n';
+ var CHAR_COMMA = ',';
+ var CHAR_SPACE = ' ';
+ var TYPE_STRING = typeof 'abc';
+
+
+
+ function testRegExp(statuses, patterns, strings, actualmatches, expectedmatches)
+ {
+ var status = '';
+ var pattern = new RegExp();
+ var string = '';
+ var actualmatch = new Array();
+ var expectedmatch = new Array();
+ var state = '';
+ var lActual = -1;
+ var lExpect = -1;
+
+
+ for (var i=0; i != patterns.length; i++)
+ {
+ status = statuses[i];
+ pattern = patterns[i];
+ string = strings[i];
+ actualmatch=actualmatches[i];
+ expectedmatch=expectedmatches[i];
+ state = getState(status, pattern, string);
+
+ description = status;
+
+ if(actualmatch)
+ {
+ actual = formatArray(actualmatch);
+ if(expectedmatch)
+ {
+ // expectedmatch and actualmatch are arrays -
+ lExpect = expectedmatch.length;
+ lActual = actualmatch.length;
+
+ var expected = formatArray(expectedmatch);
+
+ if (lActual != lExpect)
+ {
+ reportCompare(lExpect, lActual,
+ state + ERR_LENGTH +
+ MSG_EXPECT + expected +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ continue;
+ }
+
+ // OK, the arrays have same length -
+ if (expected != actual)
+ {
+ reportCompare(expected, actual,
+ state + ERR_MATCH +
+ MSG_EXPECT + expected +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ }
+ else
+ {
+ reportCompare(expected, actual, state)
+ }
+
+ }
+ else //expectedmatch is null - that is, we did not expect a match -
+ {
+ expected = expectedmatch;
+ reportCompare(expected, actual,
+ state + ERR_UNEXP_MATCH +
+ MSG_EXPECT + expectedmatch +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ }
+
+ }
+ else // actualmatch is null
+ {
+ if (expectedmatch)
+ {
+ actual = actualmatch;
+ reportCompare(expected, actual,
+ state + ERR_NO_MATCH +
+ MSG_EXPECT + expectedmatch +
+ MSG_ACTUAL + actualmatch +
+ CHAR_NL
+ );
+ }
+ else // we did not expect a match
+ {
+ // Being ultra-cautious. Presumably expectedmatch===actualmatch===null
+ expected = expectedmatch;
+ actual = actualmatch;
+ reportCompare (expectedmatch, actualmatch, state);
+ }
+ }
+ }
+ }
+
+ global.testRegExp = testRegExp;
+
+ function getState(status, pattern, string)
+ {
+ /*
+ * Escape \n's, etc. to make them LITERAL in the presentation string.
+ * We don't have to worry about this in |pattern|; such escaping is
+ * done automatically by pattern.toString(), invoked implicitly below.
+ *
+ * One would like to simply do: string = string.replace(/(\s)/g, '\$1').
+ * However, the backreference $1 is not a literal string value,
+ * so this method doesn't work.
+ *
+ * Also tried string = string.replace(/(\s)/g, escape('$1'));
+ * but this just inserts the escape of the literal '$1', i.e. '%241'.
+ */
+ string = string.replace(/\n/g, '\\n');
+ string = string.replace(/\r/g, '\\r');
+ string = string.replace(/\t/g, '\\t');
+ string = string.replace(/\v/g, '\\v');
+ string = string.replace(/\f/g, '\\f');
+
+ return (status + MSG_PATTERN + pattern + MSG_STRING + singleQuote(string));
+ }
+
+
+ /*
+ * If available, arr.toSource() gives more detail than arr.toString()
+ *
+ * var arr = Array(1,2,'3');
+ *
+ * arr.toSource()
+ * [1, 2, "3"]
+ *
+ * arr.toString()
+ * 1,2,3
+ *
+ * But toSource() doesn't exist in Rhino, so use our own imitation, below -
+ *
+ */
+ function formatArray(arr)
+ {
+ try
+ {
+ return arr.toSource();
+ }
+ catch(e)
+ {
+ return toSource(arr);
+ }
+ }
+
+
+ /*
+ * Imitate SpiderMonkey's arr.toSource() method:
+ *
+ * a) Double-quote each array element that is of string type
+ * b) Represent |undefined| and |null| by empty strings
+ * c) Delimit elements by a comma + single space
+ * d) Do not add delimiter at the end UNLESS the last element is |undefined|
+ * e) Add square brackets to the beginning and end of the string
+ */
+ function toSource(arr)
+ {
+ var delim = CHAR_COMMA + CHAR_SPACE;
+ var elt = '';
+ var ret = '';
+ var len = arr.length;
+
+ for (i=0; i<len; i++)
+ {
+ elt = arr[i];
+
+ switch(true)
+ {
+ case (typeof elt === TYPE_STRING) :
+ ret += doubleQuote(elt);
+ break;
+
+ case (elt === undefined || elt === null) :
+ break; // add nothing but the delimiter, below -
+
+ default:
+ ret += elt.toString();
+ }
+
+ if ((i < len-1) || (elt === undefined))
+ ret += delim;
+ }
+
+ return CHAR_LBRACKET + ret + CHAR_RBRACKET;
+ }
+
+
+ function doubleQuote(text)
+ {
+ return CHAR_QT_DBL + text + CHAR_QT_DBL;
+ }
+
+
+ function singleQuote(text)
+ {
+ return CHAR_QT + text + CHAR_QT;
+ }
+
+})(this);
+
+
+(function(global) {
+
+ // The Worker constructor can take a relative URL, but different test runners
+ // run in different enough environments that it doesn't all just automatically
+ // work. For the shell, we use just a filename; for the browser, see browser.js.
+ var workerDir = '';
+
+ // Assert that cloning b does the right thing as far as we can tell.
+ // Caveat: getters in b must produce the same value each time they're
+ // called. We may call them several times.
+ //
+ // If desc is provided, then the very first thing we do to b is clone it.
+ // (The self-modifying object test counts on this.)
+ //
+ function clone_object_check(b, desc) {
+ function classOf(obj) {
+ return Object.prototype.toString.call(obj);
+ }
+
+ function ownProperties(obj) {
+ return Object.getOwnPropertyNames(obj).
+ map(function (p) { return [p, Object.getOwnPropertyDescriptor(obj, p)]; });
+ }
+
+ function isArrayLength(obj, pair) {
+ return Array.isArray(obj) && pair[0] == "length";
+ }
+
+ function isCloneable(obj, pair) {
+ return isArrayLength(obj, pair) || (typeof pair[0] === 'string' && pair[1].enumerable);
+ }
+
+ function notIndex(p) {
+ var u = p >>> 0;
+ return !("" + u == p && u != 0xffffffff);
+ }
+
+ function assertIsCloneOf(a, b, path) {
+ assertEq(a === b, false);
+
+ var ca = classOf(a);
+ assertEq(ca, classOf(b), path);
+
+ assertEq(Object.getPrototypeOf(a),
+ ca == "[object Object]" ? Object.prototype : Array.prototype,
+ path);
+
+ // 'b', the original object, may have non-enumerable or XMLName
+ // properties; ignore them (except .length, if it's an Array).
+ // 'a', the clone, should not have any non-enumerable properties
+ // (except .length, if it's an Array) or XMLName properties.
+ var pb = ownProperties(b).filter(function(element) {
+ return isCloneable(b, element);
+ });
+ var pa = ownProperties(a);
+ for (var i = 0; i < pa.length; i++) {
+ assertEq(typeof pa[i][0], "string", "clone should not have E4X properties " + path);
+ if (!isCloneable(a, pa[i])) {
+ throw new Error("non-cloneable clone property " + pa[i][0] + " " + path);
+ }
+ }
+
+ // Check that, apart from properties whose names are array indexes,
+ // the enumerable properties appear in the same order.
+ var aNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex);
+ var bNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex);
+ assertEq(aNames.join(","), bNames.join(","), path);
+
+ // Check that the lists are the same when including array indexes.
+ function byName(a, b) { a = a[0]; b = b[0]; return a < b ? -1 : a === b ? 0 : 1; }
+ pa.sort(byName);
+ pb.sort(byName);
+ assertEq(pa.length, pb.length, "should see the same number of properties " + path);
+ for (var i = 0; i < pa.length; i++) {
+ var aName = pa[i][0];
+ var bName = pb[i][0];
+ assertEq(aName, bName, path);
+
+ var path2 = path + "." + aName;
+ var da = pa[i][1];
+ var db = pb[i][1];
+ if (!isArrayLength(a, pa[i])) {
+ assertEq(da.configurable, true, path2);
+ }
+ assertEq(da.writable, true, path2);
+ assertEq("value" in da, true, path2);
+ var va = da.value;
+ var vb = b[pb[i][0]];
+ if (typeof va === "object" && va !== null)
+ queue.push([va, vb, path2]);
+ else
+ assertEq(va, vb, path2);
+ }
+ }
+
+ var banner = "while testing clone of " + (desc || JSON.stringify(b));
+ var a = deserialize(serialize(b));
+ var queue = [[a, b, banner]];
+ while (queue.length) {
+ var triple = queue.shift();
+ assertIsCloneOf(triple[0], triple[1], triple[2]);
+ }
+
+ return a; // for further testing
+ }
+ global.clone_object_check = clone_object_check;
+
+})(this);
diff --git a/js/src/tests/non262/extensions/sps-generators.js b/js/src/tests/non262/extensions/sps-generators.js
new file mode 100644
index 0000000000..e165649446
--- /dev/null
+++ b/js/src/tests/non262/extensions/sps-generators.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 822041;
+var summary = "Live generators should not cache Gecko Profiler state";
+
+print(BUGNUMBER + ": " + summary);
+
+function* gen() {
+ var x = yield turnoff();
+ yield x;
+ yield 'bye';
+}
+
+function turnoff() {
+ print("Turning off profiler\n");
+ disableGeckoProfiling();
+ return 'hi';
+}
+
+for (var slowAsserts of [ true, false ]) {
+ // The slowAssertions setting is not expected to matter
+ if (slowAsserts)
+ enableGeckoProfilingWithSlowAssertions();
+ else
+ enableGeckoProfiling();
+
+ g = gen();
+ assertEq(g.next().value, 'hi');
+ assertEq(g.next('gurgitating...').value, 'gurgitating...');
+ for (var x of g)
+ assertEq(x, 'bye');
+}
+
+// This is really a crashtest
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js b/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js
new file mode 100644
index 0000000000..a0a5714053
--- /dev/null
+++ b/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var f;
+try
+{
+ f = eval("(function literalInside() { return { set 'c d e'(v) { } }; })");
+}
+catch (e)
+{
+ assertEq(true, false,
+ "string-literal property name in setter in object literal in " +
+ "function statement failed to parse: " + e);
+}
+
+var fstr = "" + f;
+assertEq(fstr.indexOf("set") < fstr.indexOf("c d e"), true,
+ "should be using new-style syntax with string literal in place of " +
+ "property identifier");
+assertEq(fstr.indexOf("setter") < 0, true, "using old-style syntax?");
+
+var o = f();
+var ostr = "" + o;
+assertEq("c d e" in o, true, "missing the property?");
+assertEq("set" in Object.getOwnPropertyDescriptor(o, "c d e"), true,
+ "'c d e' property not a setter?");
+// disabled because we still generate old-style syntax here (toSource
+// decompilation is as yet unfixed)
+// assertEq(ostr.indexOf("set") < ostr.indexOf("c d e"), true,
+// "should be using new-style syntax when getting the source of a " +
+// "getter/setter while decompiling an object");
+// assertEq(ostr.indexOf("setter") < 0, true, "using old-style syntax?");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/toLength.js b/js/src/tests/non262/extensions/toLength.js
new file mode 100644
index 0000000000..f2216e7b9c
--- /dev/null
+++ b/js/src/tests/non262/extensions/toLength.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!xulRuntime.shell)
+var BUGNUMBER = 1040196;
+var summary = 'ToLength';
+
+print(BUGNUMBER + ": " + summary);
+
+var ToLength = getSelfHostedValue('ToLength');
+
+// Negative operands
+assertEq(ToLength(-0), 0);
+assertEq(ToLength(-1), 0);
+assertEq(ToLength(-2), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56)), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56) - 2), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56) - 2.4444), 0);
+assertEq(ToLength(-Infinity), 0);
+
+// Small non-negative operands
+assertEq(ToLength(0), 0);
+assertEq(ToLength(1), 1);
+assertEq(ToLength(2), 2);
+assertEq(ToLength(3.3), 3);
+assertEq(ToLength(10/3), 3);
+
+// Large non-negative operands
+var maxLength = Math.pow(2, 53) - 1;
+assertEq(ToLength(maxLength - 1), maxLength - 1);
+assertEq(ToLength(maxLength - 0.0000001), maxLength);
+assertEq(ToLength(maxLength), maxLength);
+assertEq(ToLength(maxLength + 0.00000000000001), maxLength);
+assertEq(ToLength(maxLength + 1), maxLength);
+assertEq(ToLength(maxLength + 2), maxLength);
+assertEq(ToLength(Math.pow(2,54)), maxLength);
+assertEq(ToLength(Math.pow(2,64)), maxLength);
+assertEq(ToLength(Infinity), maxLength);
+
+// NaN operand
+assertEq(ToLength(NaN), 0);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js b/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js
new file mode 100644
index 0000000000..a11433ce46
--- /dev/null
+++ b/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 653789;
+var summary = 'Check for too-deep stack when calling toLocaleString';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ "" + { toString: Object.prototype.toLocaleString };
+ throw new Error("should have thrown on over-recursion");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/toSource-infinite-recursion.js b/js/src/tests/non262/extensions/toSource-infinite-recursion.js
new file mode 100644
index 0000000000..7c5600fc82
--- /dev/null
+++ b/js/src/tests/non262/extensions/toSource-infinite-recursion.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!Error.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 650574;
+var summary = 'Check for too-deep stack when converting a value to source';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var e = Error('');
+ e.fileName = e;
+ e.toSource();
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js b/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js
new file mode 100644
index 0000000000..e108e4c0b2
--- /dev/null
+++ b/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js
@@ -0,0 +1,54 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = "too-many-arguments-constructing-bound-function.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1303678;
+var summary =
+ "Don't assert trying to construct a bound function whose bound-target " +
+ "construct operation passes more than ARGS_LENGTH_MAX arguments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+const ARGS_LENGTH_MAX = typeof getMaxArgs === "function"
+ ? getMaxArgs()
+ : 500000;
+
+const halfRoundedDown = Math.floor(ARGS_LENGTH_MAX / 2);
+const halfRoundedUp = Math.ceil(ARGS_LENGTH_MAX / 2);
+
+function boundTarget()
+{
+ return new Number(arguments.length);
+}
+
+var boundArgs = Array(halfRoundedDown).fill(0);
+var boundFunction = boundTarget.bind(null, ...boundArgs);
+
+var additionalArgs = Array(halfRoundedUp + 1).fill(0);
+
+try
+{
+ assertEq(new (boundFunction)(...additionalArgs).valueOf(),
+ ARGS_LENGTH_MAX + 1);
+ // If we reach here, that's fine -- it's okay if ARGS_LENGTH_MAX isn't
+ // precisely respected, because there's no specified exact limit.
+}
+catch (e)
+{
+ assertEq(e instanceof RangeError, true,
+ "SpiderMonkey throws RangeError for too many args");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js b/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js
new file mode 100644
index 0000000000..34b0ab5558
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js
@@ -0,0 +1,111 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "typedarray-copyWithin-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "%TypedArray.prototype.copyWithin shouldn't misbehave horribly if " +
+ "index-argument conversion detaches the underlying ArrayBuffer";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testBegin()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var begin =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(0, begin, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBegin();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x1000;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(0, 0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testEnd();
+
+function testDest()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var dest =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(dest, 0x800, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testDest();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-set-neutering.js b/js/src/tests/non262/extensions/typedarray-set-neutering.js
new file mode 100644
index 0000000000..23df8158c5
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-set-neutering.js
@@ -0,0 +1,45 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 983344;
+var summary =
+ "Uint8Array.prototype.set issues when this array changes during setting";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var ab = new ArrayBuffer(200);
+var a = new Uint8Array(ab);
+var a_2 = new Uint8Array(10);
+
+var src = [ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ ];
+Object.defineProperty(src, 4, {
+ get: function () {
+ detachArrayBuffer(ab);
+ gc();
+ return 200;
+ }
+});
+
+a.set(src);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js b/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js
new file mode 100644
index 0000000000..fcfb031cb5
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 637643;
+var summary =
+ "new Int8Array([1, 2, 3]).subarray(1).subarray(1)[0] === 3";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var ta = new Int8Array([1, 2, 3]);
+assertEq(ta.length, 3);
+assertEq(ta[0], 1);
+assertEq(ta[1], 2);
+assertEq(ta[2], 3);
+
+var sa1 = ta.subarray(1);
+assertEq(sa1.length, 2);
+assertEq(sa1[0], 2);
+assertEq(sa1[1], 3);
+
+var sa2 = sa1.subarray(1);
+assertEq(sa2.length, 1);
+assertEq(sa2[0], 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/typedarray.js b/js/src/tests/non262/extensions/typedarray.js
new file mode 100644
index 0000000000..02aaf7956e
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray.js
@@ -0,0 +1,657 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Vladimir Vukicevic <vladimir@pobox.com>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 532774;
+var summary = 'js typed arrays (webgl arrays)';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+if (typeof gczeal !== 'undefined')
+ gczeal(0)
+
+if (typeof numberToDouble !== 'function') {
+ var numberToDouble = SpecialPowers.Cu.getJSTestingFunctions().numberToDouble;
+}
+
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ var TestPassCount = 0;
+ var TestFailCount = 0;
+ var TestTodoCount = 0;
+
+ var TODO = 1;
+
+ function check(fun, msg, todo) {
+ var thrown = null;
+ var success = false;
+ try {
+ success = fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (thrown)
+ success = false;
+
+ if (todo) {
+ TestTodoCount++;
+
+ if (success) {
+ var ex = new Error;
+ print ("=== TODO but PASSED? ===");
+ print (ex.stack);
+ print ("========================");
+ }
+
+ return;
+ }
+
+ if (success) {
+ TestPassCount++;
+ } else {
+ TestFailCount++;
+
+ var ex = new Error;
+ print ("=== FAILED ===");
+ if (msg)
+ print (msg);
+ print (ex.stack);
+ if (thrown) {
+ print (" threw exception:");
+ print (thrown);
+ }
+ print ("==============");
+ }
+ }
+
+ function checkThrows(fun, type, todo) {
+ var thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (typeof(type) !== 'undefined')
+ if (thrown) {
+ check(() => thrown instanceof type,
+ "expected " + type.name + " but saw " + thrown,
+ todo);
+ } else {
+ check(() => thrown, "expected " + type.name + " but no exception thrown", todo);
+ }
+ else
+ check(() => thrown, undefined, todo);
+ }
+
+ function checkThrowsTODO(fun, type) {
+ checkThrows(fun, type, true);
+ }
+
+ function testBufferManagement() {
+ // Single buffer
+ var buffer = new ArrayBuffer(128);
+ buffer = null;
+ gc();
+
+ // Buffer with single view, kill the view first
+ buffer = new ArrayBuffer(128);
+ var v1 = new Uint8Array(buffer);
+ gc();
+ v1 = null;
+ gc();
+ buffer = null;
+ gc();
+
+ // Buffer with single view, kill the buffer first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ gc();
+ buffer = null;
+ gc();
+ v1 = null;
+ gc();
+
+ // Buffer with multiple views, kill first view first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ v2 = new Uint8Array(buffer);
+ gc();
+ v1 = null;
+ gc();
+ v2 = null;
+ gc();
+
+ // Buffer with multiple views, kill second view first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ v2 = new Uint8Array(buffer);
+ gc();
+ v2 = null;
+ gc();
+ v1 = null;
+ gc();
+
+ // Buffer with multiple views, kill all possible subsets of views
+ buffer = new ArrayBuffer(128);
+ for (let order = 0; order < 16; order++) {
+ var views = [ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer) ];
+ gc();
+
+ // Kill views according to the bits set in 'order'
+ for (let i = 0; i < 4; i++) {
+ if (order & (1 << i))
+ views[i] = null;
+ }
+
+ gc();
+
+ views = null;
+ gc();
+ }
+
+ // Similar: multiple views, kill them one at a time in every possible order
+ buffer = new ArrayBuffer(128);
+ for (let order = 0; order < 4*3*2*1; order++) {
+ var views = [ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer) ];
+ gc();
+
+ var sequence = [ 0, 1, 2, 3 ];
+ let groupsize = 4*3*2*1;
+ let o = order;
+ for (let i = 4; i > 0; i--) {
+ groupsize = groupsize / i;
+ let which = Math.floor(o/groupsize);
+ [ sequence[i-1], sequence[which] ] = [ sequence[which], sequence[i-1] ];
+ o = o % groupsize;
+ }
+
+ for (let i = 0; i < 4; i++) {
+ views[i] = null;
+ gc();
+ }
+ }
+
+ // Multiple buffers with multiple views
+ var views = [];
+ for (let numViews of [ 1, 2, 0, 3, 2, 1 ]) {
+ buffer = new ArrayBuffer(128);
+ for (let viewNum = 0; viewNum < numViews; viewNum++) {
+ views.push(new Int8Array(buffer));
+ }
+ }
+
+ if (typeof setMarkStackLimit === 'function') {
+ setMarkStackLimit(200);
+ }
+ var forceOverflow = [ buffer ];
+ for (let i = 0; i < 1000; i++) {
+ forceOverflow = [ forceOverflow ];
+ }
+ gc();
+ buffer = null;
+ views = null;
+ gcslice(3); gcslice(3); gcslice(3); gcslice(3); gcslice(3); gcslice(3); gc();
+ }
+
+ var buf, buf2;
+
+ buf = new ArrayBuffer(100);
+ check(() => buf);
+ check(() => buf.byteLength == 100);
+
+ buf.byteLength = 50;
+ check(() => buf.byteLength == 100);
+
+ var zerobuf = new ArrayBuffer(0);
+ check(() => zerobuf);
+ check(() => zerobuf.byteLength == 0);
+
+ check(() => (new Int32Array(zerobuf)).length == 0);
+ checkThrows(() => new Int32Array(zerobuf, 1));
+
+ var zerobuf2 = new ArrayBuffer();
+ check(() => zerobuf2.byteLength == 0);
+
+ checkThrows(() => new ArrayBuffer(-100), RangeError);
+ // this is using js_ValueToECMAUInt32, which is giving 0 for "abc"
+ checkThrowsTODO(() => new ArrayBuffer("abc"), TypeError);
+
+ var zeroarray = new Int32Array(0);
+ check(() => zeroarray.length == 0);
+ check(() => zeroarray.byteLength == 0);
+ check(() => zeroarray.buffer);
+ check(() => zeroarray.buffer.byteLength == 0);
+
+ var zeroarray2 = new Int32Array();
+ check(() => zeroarray2.length == 0);
+ check(() => zeroarray2.byteLength == 0);
+ check(() => zeroarray2.buffer);
+ check(() => zeroarray2.buffer.byteLength == 0);
+
+ var a = new Int32Array(20);
+ check(() => a);
+ check(() => a.length == 20);
+ check(() => a.byteLength == 80);
+ check(() => a.byteOffset == 0);
+ check(() => a.buffer);
+ check(() => a.buffer.byteLength == 80);
+
+ var b = new Uint8Array(a.buffer, 4, 4);
+ check(() => b);
+ check(() => b.length == 4);
+ check(() => b.byteLength == 4);
+ check(() => a.buffer == b.buffer);
+
+ b[0] = 0xaa;
+ b[1] = 0xbb;
+ b[2] = 0xcc;
+ b[3] = 0xdd;
+
+ check(() => a[0] == 0);
+ check(() => a[1] != 0);
+ check(() => a[2] == 0);
+
+ buf = new ArrayBuffer(4);
+ check(() => (new Int8Array(buf)).length == 4);
+ check(() => (new Uint8Array(buf)).length == 4);
+ check(() => (new Int16Array(buf)).length == 2);
+ check(() => (new Uint16Array(buf)).length == 2);
+ check(() => (new Int32Array(buf)).length == 1);
+ check(() => (new Uint32Array(buf)).length == 1);
+ check(() => (new Float32Array(buf)).length == 1);
+ checkThrows(() => (new Float64Array(buf)));
+ buf2 = new ArrayBuffer(8);
+ check(() => (new Float64Array(buf2)).length == 1);
+
+ buf = new ArrayBuffer(5);
+ check(() => buf);
+ check(() => buf.byteLength == 5);
+
+ check(() => new Int32Array(buf, 0, 1));
+ checkThrows(() => new Int32Array(buf, 0));
+ check(() => new Int8Array(buf, 0));
+
+ check(() => (new Int8Array(buf, 3)).byteLength == 2);
+ checkThrows(() => new Int8Array(buf, 500));
+ checkThrows(() => new Int8Array(buf, 0, 50));
+ checkThrows(() => new Float32Array(buf, 500));
+ checkThrows(() => new Float32Array(buf, 0, 50));
+
+ var sl = a.subarray(5,10);
+ check(() => sl.length == 5);
+ check(() => sl.buffer == a.buffer);
+ check(() => sl.byteLength == 20);
+ check(() => sl.byteOffset == 20);
+
+ check(() => a.subarray(5,5).length == 0);
+ check(() => a.subarray(-5).length == 5);
+ check(() => a.subarray(-100).length == 20);
+ check(() => a.subarray(0, 2).length == 2);
+ check(() => a.subarray().length == a.length);
+ check(() => a.subarray(-7,-5).length == 2);
+ check(() => a.subarray(-5,-7).length == 0);
+ check(() => a.subarray(15).length == 5);
+
+ a = new Uint8Array([0xaa, 0xbb, 0xcc]);
+ check(() => a.length == 3);
+ check(() => a.byteLength == 3);
+ check(() => a[1] == 0xbb);
+
+ // not sure if this is supposed to throw or to treat "foo"" as 0.
+ checkThrowsTODO(() => new Int32Array([0xaa, "foo", 0xbb]), Error);
+
+ checkThrows(() => new Int32Array(-100));
+
+ a = new Uint8Array(3);
+ // XXX these are ignored now and return undefined
+ //checkThrows(() => a[5000] = 0, RangeError);
+ //checkThrows(() => a["hello"] = 0, TypeError);
+ //checkThrows(() => a[-10] = 0, RangeError);
+ check(() => (a[0] = "10") && (a[0] == 10));
+
+ // check Uint8ClampedArray, which is an extension to this extension
+ a = new Uint8ClampedArray(4);
+ a[0] = 128;
+ a[1] = 512;
+ a[2] = -123.723;
+ a[3] = "foopy";
+
+ check(() => a[0] == 128);
+ check(() => a[1] == 255);
+ check(() => a[2] == 0);
+ check(() => a[3] == 0);
+
+ // check handling of holes and non-numeric values
+ var x = Array(5);
+ x[0] = "hello";
+ x[1] = { };
+ //x[2] is a hole
+ x[3] = undefined;
+ x[4] = true;
+
+ a = new Uint8Array(x);
+ check(() => a[0] == 0);
+ check(() => a[1] == 0);
+ check(() => a[2] == 0);
+ check(() => a[3] == 0);
+ check(() => a[4] == 1);
+
+ a = new Float32Array(x);
+ check(() => !(a[0] == a[0]));
+ check(() => !(a[1] == a[1]));
+ check(() => !(a[2] == a[2]));
+ check(() => !(a[3] == a[3]));
+ check(() => a[4] == 1);
+
+ // test set()
+ var empty = new Int32Array(0);
+ a = new Int32Array(9);
+
+ empty.set([]);
+ empty.set([], 0);
+ empty.set(empty);
+
+ checkThrows(() => empty.set([1]));
+ checkThrows(() => empty.set([1], 0));
+ checkThrows(() => empty.set([1], 1));
+
+ a.set([]);
+ a.set([], 3);
+ a.set([], 9);
+ a.set(a);
+
+ a.set(empty);
+ a.set(empty, 3);
+ a.set(empty, 9);
+ a.set(Array.prototype);
+ checkThrows(() => a.set(empty, 100));
+
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10]));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0x7fffffff));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0xffffffff));
+ checkThrows(() => a.set([1,2,3,4,5,6], 6));
+
+ checkThrows(() => a.set(new Array(0x7fffffff)));
+ checkThrows(() => a.set([1,2,3], 2147483647));
+
+ a.set(ArrayBuffer.prototype);
+ checkThrows(() => a.set(Int16Array.prototype), TypeError);
+ checkThrows(() => a.set(Int32Array.prototype), TypeError);
+
+ a.set([1,2,3]);
+ a.set([4,5,6], 3);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 0 && a[7] == 0 && a[8] == 0);
+
+ b = new Float32Array([7,8,9]);
+ a.set(b, 0);
+ a.set(b, 3);
+ check(() =>
+ a[0] == 7 && a[1] == 8 && a[2] == 9 &&
+ a[3] == 7 && a[4] == 8 && a[5] == 9 &&
+ a[6] == 0 && a[7] == 0 && a[8] == 0);
+ a.set(a.subarray(0,3), 6);
+ check(() =>
+ a[0] == 7 && a[1] == 8 && a[2] == 9 &&
+ a[3] == 7 && a[4] == 8 && a[5] == 9 &&
+ a[6] == 7 && a[7] == 8 && a[8] == 9);
+
+ a.set([1,2,3,4,5,6,7,8,9]);
+ a.set(a.subarray(0,6), 3);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 1 && a[4] == 2 && a[5] == 3 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ a.set(a.subarray(3,9), 0);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ // verify that subarray() returns a new view that
+ // references the same buffer
+ a.subarray(0,3).set(a.subarray(3,6), 0);
+ check(() =>
+ a[0] == 4 && a[1] == 5 && a[2] == 6 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ a = new ArrayBuffer(0x10);
+ checkThrows(() => new Uint32Array(buffer, 4, 0x3FFFFFFF));
+
+ check(() => new Float32Array(null).length === 0);
+
+ a = new Uint8Array(0x100);
+ b = Uint32Array.prototype.subarray.apply(a, [0, 0x100]);
+ check(() => Object.prototype.toString.call(b) === "[object Uint8Array]");
+ check(() => b.buffer === a.buffer);
+ check(() => b.length === a.length);
+ check(() => b.byteLength === a.byteLength);
+ check(() => b.byteOffset === a.byteOffset);
+ check(() => b.BYTES_PER_ELEMENT === a.BYTES_PER_ELEMENT);
+
+ // webidl section 4.4.6, getter bullet point 2.2: prototypes are not
+ // platform objects, and calling the getter of any attribute defined on the
+ // interface should throw a TypeError according to
+ checkThrows(() => ArrayBuffer.prototype.byteLength, TypeError);
+ checkThrows(() => Int32Array.prototype.length, TypeError);
+ checkThrows(() => Int32Array.prototype.byteLength, TypeError);
+ checkThrows(() => Int32Array.prototype.byteOffset, TypeError);
+ checkThrows(() => Float64Array.prototype.length, TypeError);
+ checkThrows(() => Float64Array.prototype.byteLength, TypeError);
+ checkThrows(() => Float64Array.prototype.byteOffset, TypeError);
+
+ // webidl 4.4.6: a readonly attribute's setter is undefined. From
+ // observation, that seems to mean it silently does nothing, and returns
+ // the value that you tried to set it to.
+ check(() => Int32Array.prototype.length = true);
+ check(() => Float64Array.prototype.length = true);
+ check(() => Int32Array.prototype.byteLength = true);
+ check(() => Float64Array.prototype.byteLength = true);
+ check(() => Int32Array.prototype.byteOffset = true);
+ check(() => Float64Array.prototype.byteOffset = true);
+
+ // ArrayBuffer, Int32Array and Float64Array are native functions and have a
+ // .length, so none of these should throw:
+ check(() => (new Int32Array(ArrayBuffer)).length >= 0);
+ check(() => (new Int32Array(Int32Array)).length >= 0);
+ check(() => (new Int32Array(Float64Array)).length >= 0);
+
+ // webidl 4.4.6, under getters: "The value of the Function object’s
+ // 'length' property is the Number value 0"
+ //
+ // Except this fails in getOwnPropertyDescriptor, I think because
+ // Int32Array.prototype does not provide a lookup hook, and the fallback
+ // case ends up calling the getter. Which seems odd to me, but much of this
+ // stuff baffles me. It does seem strange that there's no way to do
+ // getOwnPropertyDescriptor on any of these attributes.
+ //
+ //check(Object.getOwnPropertyDescriptor(Int32Array.prototype, 'byteOffset')['get'].length == 0);
+
+ check(() => Int32Array.BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array(4)).BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array()).BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array(0)).BYTES_PER_ELEMENT == 4);
+ check(() => Int16Array.BYTES_PER_ELEMENT == Uint16Array.BYTES_PER_ELEMENT);
+
+ // test various types of args; numberToDouble(2) is used to ensure that the
+ // function gets a double, and not a demoted int
+ check(() => (new Float32Array(numberToDouble(2))).length == 2);
+ check(() => (new Float32Array({ length: 10 })).length == 10);
+ check(() => (new Float32Array({})).length == 0);
+ check(() => new Float32Array("3").length === 3);
+ check(() => new Float32Array(null).length === 0);
+ check(() => new Float32Array(undefined).length === 0);
+
+ // check that NaN conversions happen correctly with array conversions
+ check(() => (new Int32Array([NaN])[0]) == 0);
+ check(() => { var q = new Float32Array([NaN])[0]; return q != q; });
+
+ // check that setting and reading arbitrary properties works
+ // this is not something that will be done in real world
+ // situations, but it should work when done just like in
+ // regular objects
+ buf = new ArrayBuffer(128);
+ a = new Uint32Array(buf, 0, 4);
+ check(() => a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0);
+ buf.a = 42;
+ buf.b = "abcdefgh";
+ buf.c = {a:'literal'};
+ check(() => a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0);
+
+ check(() => buf.a == 42);
+ delete buf.a;
+ check(() => !buf.a);
+
+ // check edge cases for small arrays
+ // 16 reserved slots
+ a = new Uint8Array(120);
+ check(() => a.byteLength == 120);
+ check(() => a.length == 120);
+ for (var i = 0; i < a.length; i++)
+ check(() => a[i] == 0)
+
+ a = new Uint8Array(121);
+ check(() => a.byteLength == 121);
+ check(() => a.length == 121);
+ for (var i = 0; i < a.length; i++)
+ check(() => a[i] == 0)
+
+ // check that TM generated byte offset is right (requires run with -j)
+ a = new Uint8Array(100);
+ a[99] = 5;
+ b = new Uint8Array(a.buffer, 9); // force a offset
+ // use a loop to invoke the TM
+ for (var i = 0; i < b.length; i++)
+ check(() => b[90] == 5)
+
+ // Protos and proxies, oh my!
+ var alien = newGlobal({newCompartment: true});
+
+ var alien_view = alien.eval('view = new Uint8Array(7)');
+ var alien_buffer = alien.eval('buffer = view.buffer');
+
+ // when creating a view of a buffer in a different compartment, the view
+ // itself should be created in the other compartment and wrapped for use in
+ // this compartment. (There should never be a compartment boundary between
+ // an ArrayBufferView and its ArrayBuffer.)
+ var view = new Int8Array(alien_buffer);
+
+ // First make sure they're looking at the same data
+ alien_view[3] = 77;
+ check(() => view[3] == 77);
+
+ // Now check that the proxy setup is as expected in the cross-compartment
+ // case.
+ if (isProxy(alien)) {
+ check(() => isProxy(alien_view));
+ check(() => isProxy(alien_buffer));
+ check(() => isProxy(view)); // the real test
+ }
+
+ // cross-realm property access
+ check(() => alien_buffer.byteLength == 7);
+ check(() => alien_view.byteLength == 7);
+ check(() => view.byteLength == 7);
+
+ // typed array protos should be equal
+ simple = new Int8Array(12);
+ check(() => Object.getPrototypeOf(view) == Object.getPrototypeOf(simple));
+ check(() => Object.getPrototypeOf(view) == Int8Array.prototype);
+
+ // Most named properties are defined on %TypedArray%.prototype.
+ check(() => !simple.hasOwnProperty('byteLength'));
+ check(() => !Int8Array.prototype.hasOwnProperty('byteLength'));
+ check(() => Object.getPrototypeOf(Int8Array.prototype).hasOwnProperty('byteLength'));
+
+ check(() => !simple.hasOwnProperty("BYTES_PER_ELEMENT"));
+ check(() => Int8Array.prototype.hasOwnProperty("BYTES_PER_ELEMENT"));
+ check(() => !Object.getPrototypeOf(Int8Array.prototype).hasOwnProperty("BYTES_PER_ELEMENT"));
+
+ // crazy as it sounds, the named properties are configurable per WebIDL.
+ // But we are currently discussing the situation, and typed arrays may be
+ // pulled into the ES spec, so for now this is disallowed.
+ if (false) {
+ check(() => simple.byteLength == 12);
+ getter = Object.getOwnPropertyDescriptor(Int8Array.prototype, 'byteLength').get;
+ Object.defineProperty(Int8Array.prototype, 'byteLength', { get: function () { return 1 + getter.apply(this) } });
+ check(() => simple.byteLength == 13);
+ }
+
+ // test copyWithin()
+ var numbers = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ];
+
+ function tastring(tarray) {
+ return [...tarray].toString();
+ }
+
+ function checkCopyWithin(offset, start, end, dest, want) {
+ var numbers_buffer = new Uint8Array(numbers).buffer;
+ var view = new Int8Array(numbers_buffer, offset);
+ view.copyWithin(dest, start, end);
+ check(() => tastring(view) == want.toString());
+ if (tastring(view) != want.toString()) {
+ print("Wanted: " + want.toString());
+ print("Got : " + tastring(view));
+ }
+ }
+
+ // basic copyWithin [2,5) -> 4
+ checkCopyWithin(0, 2, 5, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+
+ // negative values should count from end
+ checkCopyWithin(0, -7, 5, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, 2, -4, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, 2, 5, -5, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, -7, -4, -5, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+
+ // offset
+ checkCopyWithin(2, 0, 3, 4, [ 2, 3, 4, 5, 2, 3, 4 ]);
+
+ // clipping
+ checkCopyWithin(0, 5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, -6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, 5000, 6000, 1, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, -6000, 1, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, 5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, -6000, 0, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, 6000, 0, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, 5000, 6000, 1, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, -6000, 1, [ 2, 3, 4, 5, 6, 7, 8 ]);
+
+ checkCopyWithin(2, -5000, 3, 1, [ 2, 2, 3, 4, 6, 7, 8 ]);
+ checkCopyWithin(2, 1, 6000, 0, [ 3, 4, 5, 6, 7, 8, 8 ]);
+ checkCopyWithin(2, 1, 6000, -4000, [ 3, 4, 5, 6, 7, 8, 8 ]);
+
+ testBufferManagement();
+
+ print ("done");
+
+ reportCompare(0, TestFailCount, "typed array tests");
+}
diff --git a/js/src/tests/non262/extensions/uneval/bug496985.js b/js/src/tests/non262/extensions/uneval/bug496985.js
new file mode 100644
index 0000000000..0f68288cc5
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/bug496985.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.uneval)
+
+var a = function() {
+ return function ({x: arguments}) {
+ return arguments;
+ }
+}
+var b = eval(uneval(a));
+
+assertEq(a()({x: 1}), 1);
+assertEq(b()({x: 1}), 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/bug566661.js b/js/src/tests/non262/extensions/uneval/bug566661.js
new file mode 100644
index 0000000000..51e142351e
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/bug566661.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!this.uneval)
+
+var f = function (q) { return q['\xC7']; }
+var d = eval(uneval(f));
+assertEq(d({'\xC7': 'good'}), 'good');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/function-bind.js b/js/src/tests/non262/extensions/uneval/function-bind.js
new file mode 100644
index 0000000000..263099cf07
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/function-bind.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'function-bind.js';
+var BUGNUMBER = 429507;
+var summary = "ES5: Function.prototype.bind";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq((function unbound(){"body"}).bind().toSource(), `function bound() {
+ [native code]
+}`);
+
+assertEq(uneval((function unbound(){"body"}).bind()), `function bound() {
+ [native code]
+}`);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/uneval/regress-231518.js b/js/src/tests/non262/extensions/uneval/regress-231518.js
new file mode 100644
index 0000000000..fc360f0870
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-231518.js
@@ -0,0 +1,99 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 231518;
+var summary = 'decompiler must quote keywords and non-identifier property names';
+var actual = '';
+var expect = 'no error';
+var status;
+var object;
+var result;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+ status = inSection(1) + ' eval(uneval({"if": false}))';
+
+ try
+ {
+ object = {'if': false };
+ result = uneval(object);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(2) + ' eval(uneval({"if": "then"}))';
+
+ try
+ {
+ object = {'if': "then" };
+ result = uneval(object);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(3) + ' eval(uneval(f))';
+
+ try
+ {
+ result = uneval(f);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(2) + ' eval(uneval(g))';
+
+ try
+ {
+ result = uneval(g);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+function f()
+{
+ var obj = new Object();
+
+ obj['name'] = 'Just a name';
+ obj['if'] = false;
+ obj['some text'] = 'correct';
+}
+
+function g()
+{
+ return {'if': "then"};
+}
+
diff --git a/js/src/tests/non262/extensions/uneval/regress-245795.js b/js/src/tests/non262/extensions/uneval/regress-245795.js
new file mode 100644
index 0000000000..bb5a736039
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-245795.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245795;
+var summary = 'eval(uneval(function)) should be round-trippable';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function a()
+{
+ b = function() {};
+}
+
+var r = "function a() { b = function() {}; }";
+eval(uneval(a));
+
+var v = a.toString().replace(/[ \n]+/g, ' ');
+print(v)
+
+printStatus("[" + v + "]");
+
+expect = r;
+actual = v;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-254375.js b/js/src/tests/non262/extensions/uneval/regress-254375.js
new file mode 100644
index 0000000000..4640d3e1c8
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-254375.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 254375;
+var summary = 'Object.toSource for negative number property names';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+ try
+ {
+ expect = 'no error';
+ eval(uneval({'-1':true}));
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-304897.js b/js/src/tests/non262/extensions/uneval/regress-304897.js
new file mode 100644
index 0000000000..f88bff8445
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-304897.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 304897;
+var summary = 'uneval("\\t"), uneval("\\x09")';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = '"\\t"';
+actual = uneval('\t');
+reportCompare(expect, actual, summary);
+
+actual = uneval('\x09');
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-306738.js b/js/src/tests/non262/extensions/uneval/regress-306738.js
new file mode 100644
index 0000000000..71f8b5d014
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-306738.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 306738;
+var summary = 'uneval() on objects with getter or setter';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+actual = uneval(
+ {
+ get foo()
+ {
+ return "foo";
+ }
+ });
+
+expect = '({get foo()\n\
+ {\n\
+ return "foo";\n\
+ }})';
+
+compareSource(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-311583.js b/js/src/tests/non262/extensions/uneval/regress-311583.js
new file mode 100644
index 0000000000..9121b9f4e9
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-311583.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311583;
+var summary = 'uneval(array) should use elision for holes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = new Array(3);
+a[0] = a[2] = 0;
+
+actual = uneval(a);
+expect = '[0, , 0]';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-313803.js b/js/src/tests/non262/extensions/uneval/regress-313803.js
new file mode 100644
index 0000000000..3f5c18456a
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-313803.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313803;
+var summary = 'uneval() on func with embedded objects with getter or setter';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var func = function ff() {
+ obj = { get foo() { return "foo"; }};
+ return 1;
+};
+
+actual = uneval(func);
+
+expect = '(function ff() {\n\
+ obj = { get foo() { return "foo"; }};\n\
+ return 1;\n\
+})';
+
+compareSource(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-322957.js b/js/src/tests/non262/extensions/uneval/regress-322957.js
new file mode 100644
index 0000000000..e3b8157b52
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-322957.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322957;
+var summary = 'TryMethod should not eat getter exceptions';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = { get toSource() { throw "EXCEPTION"; } };
+
+var got_proper_exception = -1;
+
+try {
+ uneval(obj);
+} catch (e) {
+ got_proper_exception = (e === "EXCEPTION");
+}
+
+expect = true;
+actual = got_proper_exception;
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-328556.js b/js/src/tests/non262/extensions/uneval/regress-328556.js
new file mode 100644
index 0000000000..c757fad02d
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-328556.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328556;
+var summary = 'Do not Assert: growth == (size_t)-1 || (nchars + 1) * sizeof(char16_t) == growth, in jsarray.c';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var D = [];
+D.foo = D;
+uneval(D);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-01.js b/js/src/tests/non262/extensions/uneval/regress-358594-01.js
new file mode 100644
index 0000000000..e5b22a575c
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-01.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ function f() { }
+ f.__proto__ = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-02.js b/js/src/tests/non262/extensions/uneval/regress-358594-02.js
new file mode 100644
index 0000000000..897d739579
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-02.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+function f() { }
+f.__proto__ = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-03.js b/js/src/tests/non262/extensions/uneval/regress-358594-03.js
new file mode 100644
index 0000000000..55f4fb250d
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-03.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ f = function () { };
+ f.__proto__ = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-04.js b/js/src/tests/non262/extensions/uneval/regress-358594-04.js
new file mode 100644
index 0000000000..01d1fe3e03
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-04.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+f = function () { };
+f.__proto__ = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-05.js b/js/src/tests/non262/extensions/uneval/regress-358594-05.js
new file mode 100644
index 0000000000..aa2ae6e925
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-05.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ f = function () { };
+ f.hhhhhhhhh = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-06.js b/js/src/tests/non262/extensions/uneval/regress-358594-06.js
new file mode 100644
index 0000000000..2a83057eda
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-06.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+f = function () { };
+f.hhhhhhhhh = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-367629.js b/js/src/tests/non262/extensions/uneval/regress-367629.js
new file mode 100644
index 0000000000..9d7a999a22
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-367629.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367629;
+var summary = 'Decompilation of result with native function as getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a =
+ Object.defineProperty({}, "h",
+ {
+ get: encodeURI,
+ enumerable: true,
+ configurable: true
+ });
+
+ expect = '({get h() {[native code]}})';
+ actual = uneval(a);
+
+ // Native function syntax:
+ // `function IdentifierName_opt ( FormalParameters ) { [ native code ] }`
+
+ // The placement of whitespace characters in the native function's body is
+ // implementation-dependent, so we need to replace those for this test.
+ var re = new RegExp(["\\{", "\\[", "native", "code", "\\]", "\\}"].join("\\s*"));
+ actual = actual.replace(re, "{[native code]}");
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-375801.js b/js/src/tests/non262/extensions/uneval/regress-375801.js
new file mode 100644
index 0000000000..6f345bf8fa
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-375801.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375801;
+var summary = 'uneval should use "(void 0)" instead of "undefined"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({a:(void 0)})'
+ actual = uneval({a: undefined})
+ compareSource(expect, actual, summary + ': uneval');
+
+ expect = 'function() {({a: undefined});}';
+ actual = (function() {({a: undefined});}).toString();
+ compareSource(expect, actual, summary + ': toString');
+
+ expect = '(function () {({a: undefined});})';
+ actual = (function () {({a: undefined});}).toSource();
+ compareSource(expect, actual, summary + ': toSource');
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-380581.js b/js/src/tests/non262/extensions/uneval/regress-380581.js
new file mode 100644
index 0000000000..5420b3fe17
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-380581.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 380581;
+var summary = 'Incorrect uneval with setter in object literal';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '(function() { })';
+ actual = uneval(eval("(function() { })"));
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-380933.js b/js/src/tests/non262/extensions/uneval/regress-380933.js
new file mode 100644
index 0000000000..8033f886e7
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-380933.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 380933;
+var summary = 'Do not assert with uneval object with setter with modified proto';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var f = (function(){});
+var y =
+ Object.defineProperty({}, "p",
+ {
+ get: f,
+ enumerable: true,
+ configurable: true
+ });
+f.__proto__ = [];
+uneval(y);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
+
diff --git a/js/src/tests/non262/extensions/uneval/regress-381211.js b/js/src/tests/non262/extensions/uneval/regress-381211.js
new file mode 100644
index 0000000000..3ac4282e1c
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-381211.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381211;
+var summary = 'uneval with getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({get x(){}})';
+ actual = uneval({get x(){}});
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-381301.js b/js/src/tests/non262/extensions/uneval/regress-381301.js
new file mode 100644
index 0000000000..be8495e662
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-381301.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381301;
+var summary = 'uneval of object with native-function getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var o =
+ Object.defineProperty({}, "x", { get: decodeURI, enumerable: true, configurable: true });
+ expect = '({get x() {[native code]}})';
+ actual = uneval(o);
+
+ // Native function syntax:
+ // `function IdentifierName_opt ( FormalParameters ) { [ native code ] }`
+
+ // The placement of whitespace characters in the native function's body is
+ // implementation-dependent, so we need to replace those for this test.
+ var re = new RegExp(["\\{", "\\[", "native", "code", "\\]", "\\}"].join("\\s*"));
+ actual = actual.replace(re, "{[native code]}");
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-385393-03.js b/js/src/tests/non262/extensions/uneval/regress-385393-03.js
new file mode 100644
index 0000000000..2f11b25ecf
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-385393-03.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ f = (function() { new (delete y) });
+ eval(uneval(f))
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-385729.js b/js/src/tests/non262/extensions/uneval/regress-385729.js
new file mode 100644
index 0000000000..5f650e6082
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-385729.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385729;
+var summary = 'uneval(eval(expression closure))';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+function normalizeSource(source) {
+ source = String(source);
+ source = source.replace(/([(){},.:\[\]])/mg, ' $1 ');
+ source = source.replace(/\s+/mg, ' ');
+
+ return source;
+}
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '(function f () /x/g)';
+ try
+ {
+ // mozilla 1.9
+ actual = uneval(eval(expect));
+ }
+ catch(ex)
+ {
+ // mozilla 1.8
+ expect = 'SyntaxError: missing { before function body';
+ actual = ex + '';
+ }
+ compareSource(normalizeSource(expect), normalizeSource(actual), summary);
+
+ expect = '({get f () /x/g})';
+ try
+ {
+ // mozilla 1.9
+ actual = uneval(eval("({get f () /x/g})"));
+ }
+ catch(ex)
+ {
+ // mozilla 1.8
+ expect = 'SyntaxError: missing { before function body';
+ actual = ex + '';
+ }
+ compareSource(normalizeSource(expect), normalizeSource(actual), summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-082.js b/js/src/tests/non262/extensions/uneval/regress-452498-082.js
new file mode 100644
index 0000000000..8fee44d2a1
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-082.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #82 From Gary Kwong [:nth10sd]
+
+// =====
+
+ uneval(function(){[y] = [x];});
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-101.js b/js/src/tests/non262/extensions/uneval/regress-452498-101.js
new file mode 100644
index 0000000000..c660ab9b80
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-101.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #101 From Gary Kwong [:nth10sd]
+
+ uneval(function(){with({functional: []}){x5, y = this;const y = undefined }});
+// Assertion failure: strcmp(rval, with_cookie) == 0, at ../jsopcode.cpp:2567
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-117.js b/js/src/tests/non262/extensions/uneval/regress-452498-117.js
new file mode 100644
index 0000000000..c2b5135790
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-117.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #117 From Gary Kwong [:nth10sd]
+
+// The following all do not require -j.
+
+// Assertion failure: pnu->pn_lexdef == dn, at ../jsemit.cpp:1817
+// =====
+ uneval(function(){arguments = ({ get y(){} }); for(var [arguments] in y ) (x);});
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-621814.js b/js/src/tests/non262/extensions/uneval/regress-621814.js
new file mode 100644
index 0000000000..7e661d97a8
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-621814.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = 'pass';
+var actual = expect;
+function f({"\xF51F": x}) {}
+try {
+ eval(uneval(f));
+} catch (e) {
+ actual = '' + e;
+}
+reportCompare(expect, actual, "");
diff --git a/js/src/tests/non262/extensions/uneval/regress-624199.js b/js/src/tests/non262/extensions/uneval/regress-624199.js
new file mode 100644
index 0000000000..2634600f12
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-624199.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+function roundTrip(f) {
+ try {
+ eval(uneval(f));
+ return true;
+ } catch (e) {
+ return '' + e;
+ }
+}
+
+function f() { if (true) { 'use strict'; } var eval; }
+assertEq(roundTrip(f), true);
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/uneval/regress-90596-002.js b/js/src/tests/non262/extensions/uneval/regress-90596-002.js
new file mode 100644
index 0000000000..ae66ea7142
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-90596-002.js
@@ -0,0 +1,264 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 28 August 2001
+ *
+ * SUMMARY: A [DontEnum] prop, if overridden, should appear in uneval().
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
+ *
+ * NOTE: some inefficiencies in the test are made for the sake of readability.
+ * Sorting properties alphabetically is done for definiteness in comparisons.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90596;
+var summary = 'A [DontEnum] prop, if overridden, should appear in uneval()';
+var cnCOMMA = ',';
+var cnLBRACE = '{';
+var cnRBRACE = '}';
+var cnLPAREN = '(';
+var cnRPAREN = ')';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj = {};
+
+
+status = inSection(1);
+obj = {toString:9};
+actual = uneval(obj);
+expect = '({toString:9})';
+addThis();
+
+status = inSection(2);
+obj = {hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(3);
+obj = {toString:9, hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(4);
+obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN EVAL CODE
+var s = '';
+
+status = inSection(5);
+s = 'obj = {toString:9}';
+eval(s);
+actual = uneval(obj);
+expect = '({toString:9})';
+addThis();
+
+status = inSection(6);
+s = 'obj = {hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(7);
+s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(8);
+s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN FUNCTION CODE
+function A()
+{
+ status = inSection(9);
+ var s = 'obj = {toString:9}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({toString:9})';
+ addThis();
+}
+A();
+
+function B()
+{
+ status = inSection(10);
+ var s = 'obj = {hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({hasOwnProperty:"Hi"})';
+ addThis();
+}
+B();
+
+function C()
+{
+ status = inSection(11);
+ var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+C();
+
+function D()
+{
+ status = inSection(12);
+ var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+D();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Sort properties alphabetically -
+ */
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = sortThis(actual);
+ expectedvalues[UBound] = sortThis(expect);
+ UBound++;
+}
+
+
+/*
+ * Takes string of form '({"c", "b", "a", 2})' and returns '({"a","b","c",2})'
+ */
+function sortThis(sList)
+{
+ sList = compactThis(sList);
+ sList = stripParens(sList);
+ sList = stripBraces(sList);
+ var arr = sList.split(cnCOMMA);
+ arr = arr.sort();
+ var ret = String(arr);
+ ret = addBraces(ret);
+ ret = addParens(ret);
+ return ret;
+}
+
+
+/*
+ * Strips out any whitespace from the text -
+ */
+function compactThis(text)
+{
+ var charCode = 0;
+ var ret = '';
+
+ for (var i=0; i<text.length; i++)
+ {
+ charCode = text.charCodeAt(i);
+
+ if (!isWhiteSpace(charCode))
+ ret += text.charAt(i);
+ }
+
+ return ret;
+}
+
+
+function isWhiteSpace(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0009):
+ case (0x000B):
+ case (0x000C):
+ case (0x0020):
+ case (0x000A): // '\n'
+ case (0x000D): // '\r'
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+/*
+ * strips off parens at beginning and end of text -
+ */
+function stripParens(text)
+{
+ // remember to escape the parens...
+ var arr = text.match(/^\((.*)\)$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+/*
+ * strips off braces at beginning and end of text -
+ */
+function stripBraces(text)
+{
+ // remember to escape the braces...
+ var arr = text.match(/^\{(.*)\}$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+function addBraces(text)
+{
+ return cnLBRACE + text + cnRBRACE;
+}
+
+
+function addParens(text)
+{
+ return cnLPAREN + text + cnRPAREN;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-96284-002.js b/js/src/tests/non262/extensions/uneval/regress-96284-002.js
new file mode 100644
index 0000000000..f49b670aff
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-96284-002.js
@@ -0,0 +1,147 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 03 September 2001
+ *
+ * SUMMARY: Double quotes should be escaped in uneval(new Error('""'))
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96284
+ *
+ * The real point here is this: we should be able to reconstruct an object
+ * obj from uneval(obj). We'll test this on various types of objects.
+ *
+ * Method: define obj2 = eval(uneval(obj1)) and verify that
+ * obj2.toSource() == obj1.toSource().
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96284;
+var summary = 'Double quotes should be escaped in Error.prototype.toSource()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj1 = {};
+var obj2 = {};
+var cnTestString = '"This is a \" STUPID \" test string!!!"\\';
+
+
+// various NativeError objects -
+status = inSection(1);
+obj1 = Error(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(2);
+obj1 = EvalError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(3);
+obj1 = RangeError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(4);
+obj1 = ReferenceError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(5);
+obj1 = SyntaxError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(6);
+obj1 = TypeError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(7);
+obj1 = URIError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+// other types of objects -
+status = inSection(8);
+obj1 = new String(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(9);
+obj1 = {color:'red', texture:cnTestString, hasOwnProperty:42};
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(10);
+obj1 = function(x) {function g(y){return y+1;} return g(x);};
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(11);
+obj1 = new Number(eval('6'));
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(12);
+obj1 = /ad;(lf)kj(2309\/\/)\/\//;
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-bug567606.js b/js/src/tests/non262/extensions/uneval/regress-bug567606.js
new file mode 100644
index 0000000000..7123f8e36b
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-bug567606.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.uneval)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var global = this;
+
+(function() {
+ function f() {
+ this.b = function() {};
+ Object.defineProperty(this, "b", ({
+ configurable: global.__defineSetter__("", function() {})
+ }));
+ }
+ for (y of [0]) {
+ _ = new f();
+ }
+})();
+uneval(this);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/strict-function-toSource.js b/js/src/tests/non262/extensions/uneval/strict-function-toSource.js
new file mode 100644
index 0000000000..383da34df6
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/strict-function-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Bug 800407 - Functions defined with Function construcor
+ * do have strict mode when JSOPTION_STRICT_MODE is on.
+ */
+
+options("strict_mode");
+function testRunOptionStrictMode(str, arg, result) {
+ var strict_inner = new Function('return typeof this == "undefined";');
+ return strict_inner;
+}
+let inner = testRunOptionStrictMode();
+assertEq(inner(), true);
+assertEq(eval(uneval(inner))(), true);
+
+assertEq((new Function('x', 'return x*2;')).toSource().includes('"use strict"'), false);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/symbol-uneval.js b/js/src/tests/non262/extensions/uneval/symbol-uneval.js
new file mode 100644
index 0000000000..1454bc0c3a
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/symbol-uneval.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.uneval)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertEq(uneval(Symbol.iterator), "Symbol.iterator");
+assertEq(uneval(Symbol()), "Symbol()");
+assertEq(uneval(Symbol("")), 'Symbol("")');
+assertEq(uneval(Symbol("ponies")), 'Symbol("ponies")');
+assertEq(uneval(Symbol.for("ponies")), 'Symbol.for("ponies")');
+
+assertEq({glyph: Symbol(undefined)}.toSource(), "({glyph:Symbol()})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/uneval/toSource-0.js b/js/src/tests/non262/extensions/uneval/toSource-0.js
new file mode 100644
index 0000000000..60906463c7
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/toSource-0.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(eval(uneval('\x001')), '\x001');
+
+f = eval('(' + (function () { return '\x001'; }).toString() + ')');
+assertEq(f(), '\x001');
+
+assertEq(eval('\x001'.toSource()) == '\x001', true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/unterminated-literal-error-location.js b/js/src/tests/non262/extensions/unterminated-literal-error-location.js
new file mode 100644
index 0000000000..de9767a1c2
--- /dev/null
+++ b/js/src/tests/non262/extensions/unterminated-literal-error-location.js
@@ -0,0 +1,119 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1434429;
+var summary =
+ "Report unterminated string/template literal errors with the line/column " +
+ "number of the point of non-termination";
+
+function test(f, quotes, [line, col])
+{
+ var caught = false;
+ try
+ {
+ f();
+ }
+ catch (e)
+ {
+ caught = true;
+ assertEq(e.lineNumber, line, "line number");
+ assertEq(e.columnNumber, col, "column number");
+ assertEq(e.message.includes(quotes), true,
+ "message must contain delimiter");
+ }
+
+ assertEq(caught, true);
+}
+
+test(function() {
+ //0123
+ eval("'hi");
+}, "''", [1, 3]);
+
+test(function() {
+ //0123 4
+ eval("'hi\\");
+}, "''", [1, 4]);
+
+test(function() {
+ //0123456
+ eval(" 'hi");
+}, "''", [1, 6]);
+
+test(function() {
+ //0123456 7
+ eval(" 'hi\\");
+}, "''", [1, 7]);
+
+test(function() {
+ //01234567 01234567
+ eval('var x =\n "hi');
+}, '""', [2, 7]);
+
+test(function() {
+ //0123456 01234567 8
+ eval('var x =\n "hi\\');
+}, '""', [2, 8]);
+
+test(function() {
+ // 1
+ //0123456 01234567 012345678 01234567890123
+ eval('var x =\n "hi\\\n bye\\\n no really');
+}, '""', [4, 13]);
+
+test(function() {
+ // 1
+ //0123456 01234567 012345678 01234567890123 4
+ eval('var x =\n "hi\\\n bye\\\n no really\\');
+}, '""', [4, 14]);
+
+test(function() {
+ //0123456 01234567 012345678
+ eval('var x =\n "hi\\\n bye\n');
+}, '""', [3, 8]);
+
+test(function() {
+ //0123456 01234567 012345678 9
+ eval('var x =\n "hi\\\n bye\\');
+}, '""', [3, 9]);
+
+test(function() {
+ //0123456 01234567
+ eval('var x =\n `');
+}, '``', [2, 7]);
+
+test(function() {
+ //0123456 01234567 8
+ eval('var x =\n `\\');
+}, '``', [2, 8]);
+
+test(function() {
+ // 1
+ //0123456 0123456789012345
+ eval('var x =\n htmlEscape`');
+}, '``', [2, 15]);
+
+test(function() {
+ // 1
+ //0123456 0123456789012345 6
+ eval('var x =\n htmlEscape`\\');
+}, '``', [2, 16]);
+
+test(function() {
+ // 1
+ //0123456 01234567890123 01234
+ eval('var x =\n htmlEscape\n `');
+}, '``', [3, 4]);
+
+test(function() {
+ // 1
+ //0123456 01234567890123 01234 5
+ eval('var x =\n htmlEscape\n `\\');
+}, '``', [3, 5]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/weakmap.js b/js/src/tests/non262/extensions/weakmap.js
new file mode 100644
index 0000000000..927a4dc36b
--- /dev/null
+++ b/js/src/tests/non262/extensions/weakmap.js
@@ -0,0 +1,121 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Andreas Gal <gal@mozilla.com>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 547941;
+var summary = 'js weak maps';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ var TestPassCount = 0;
+ var TestFailCount = 0;
+ var TestTodoCount = 0;
+
+ var TODO = 1;
+
+ function check(fun, todo) {
+ var thrown = null;
+ var success = false;
+ try {
+ success = fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (thrown)
+ success = false;
+
+ if (todo) {
+ TestTodoCount++;
+
+ if (success) {
+ var ex = new Error;
+ print ("=== TODO but PASSED? ===");
+ print (ex.stack);
+ print ("========================");
+ }
+
+ return;
+ }
+
+ if (success) {
+ TestPassCount++;
+ } else {
+ TestFailCount++;
+
+ var ex = new Error;
+ print ("=== FAILED ===");
+ print (ex.stack);
+ if (thrown) {
+ print (" threw exception:");
+ print (thrown);
+ }
+ print ("==============");
+ }
+ }
+
+ function checkThrows(fun, todo) {
+ let thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = true;
+ }
+
+ check(() => thrown, todo);
+ }
+
+ var key = {};
+ var map = new WeakMap();
+
+ check(() => !map.has(key));
+ check(() => map.delete(key) == false);
+ check(() => map.set(key, 42) === map);
+ check(() => map.get(key) == 42);
+ check(() => typeof map.get({}) == "undefined");
+ check(() => map.get({}, "foo") == undefined);
+
+ gc(); gc(); gc();
+
+ check(() => map.get(key) == 42);
+ check(() => map.delete(key) == true);
+ check(() => map.delete(key) == false);
+ check(() => map.delete({}) == false);
+
+ check(() => typeof map.get(key) == "undefined");
+ check(() => !map.has(key));
+ check(() => map.delete(key) == false);
+
+ var value = { };
+ check(() => map.set(new Object(), value) === map);
+ gc(); gc(); gc();
+
+ check(() => map.has("non-object key") == false);
+ check(() => map.has() == false);
+ check(() => map.get("non-object key") == undefined);
+ check(() => map.get() == undefined);
+ check(() => map.delete("non-object key") == false);
+ check(() => map.delete() == false);
+
+ check(() => map.set(key) === map);
+ check(() => map.get(key) == undefined);
+
+ checkThrows(() => map.set("non-object key", value));
+
+ print ("done");
+
+ reportCompare(0, TestFailCount, "weak map tests");
+}