From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- js/src/tests/non262/extensions/15.9.4.2.js | 56 + js/src/tests/non262/extensions/8.12.5-01.js | 70 + .../ArrayBuffer-slice-arguments-detaching.js | 80 + js/src/tests/non262/extensions/Boolean-toSource.js | 19 + .../DataView-construct-arguments-detaching.js | 80 + .../extensions/DataView-set-arguments-detaching.js | 84 + js/src/tests/non262/extensions/Number-toSource.js | 19 + .../RegExp-error-message-skip-selfhosted-frames.js | 11 + .../tests/non262/extensions/String-match-flags.js | 27 + .../String-methods-infinite-recursion.js | 36 + js/src/tests/non262/extensions/String-toSource.js | 16 + .../TypedArray-set-object-funky-length-detaches.js | 55 + .../TypedArray-subarray-arguments-detaching.js | 111 ++ js/src/tests/non262/extensions/__proto__.js | 53 + .../arguments-property-access-in-function.js | 58 + .../non262/extensions/array-inherited-__proto__.js | 32 + .../extensions/array-isArray-proxy-recursion.js | 41 + .../non262/extensions/array-length-protochange.js | 35 + js/src/tests/non262/extensions/array-pop-proxy.js | 24 + .../non262/extensions/array-toString-recursion.js | 46 + .../non262/extensions/arraybuffer-prototype.js | 28 + .../non262/extensions/bad-regexp-data-clone.js | 20 + js/src/tests/non262/extensions/basic-for-each.js | 58 + js/src/tests/non262/extensions/basic-for-in.js | 46 + js/src/tests/non262/extensions/browser.js | 6 + js/src/tests/non262/extensions/bug472534.js | 30 + .../builtin-function-arguments-caller.js | 60 + .../non262/extensions/censor-strict-caller.js | 15 + js/src/tests/non262/extensions/clone-bigint.js | 20 + .../non262/extensions/clone-complex-object.js | 313 ++++ js/src/tests/non262/extensions/clone-errors.js | 110 ++ js/src/tests/non262/extensions/clone-forge.js | 39 + .../extensions/clone-invalid-property-key.js | 22 + .../tests/non262/extensions/clone-leaf-object.js | 68 + .../non262/extensions/clone-many-transferables.js | 25 + .../tests/non262/extensions/clone-object-deep.js | 25 + js/src/tests/non262/extensions/clone-object.js | 143 ++ js/src/tests/non262/extensions/clone-regexp.js | 36 + .../tests/non262/extensions/clone-sab-failure.js | 39 + js/src/tests/non262/extensions/clone-sab.js | 31 + js/src/tests/non262/extensions/clone-simple.js | 33 + .../tests/non262/extensions/clone-transferables.js | 129 ++ .../tests/non262/extensions/clone-typed-array.js | 104 ++ .../extensions/clone-v1-typed-array-data.dat | 32 + .../non262/extensions/clone-v1-typed-array.js | 130 ++ js/src/tests/non262/extensions/collect-gray.js | 153 ++ js/src/tests/non262/extensions/column-numbers.js | 10 + .../extensions/cross-global-eval-is-indirect.js | 60 + .../extensions/cross-global-getPrototypeOf.js | 55 + js/src/tests/non262/extensions/dataview.js | 1647 ++++++++++++++++++++ js/src/tests/non262/extensions/decompile-for-of.js | 27 + .../non262/extensions/destructure-accessor.js | 75 + ...ng-__proto__-shorthand-assignment-before-var.js | 49 + ...destructuring-__proto__-shorthand-assignment.js | 49 + .../destructuring-__proto__-target-assignment.js | 50 + .../extensions/destructuring-for-inof-__proto__.js | 85 + .../tests/non262/extensions/destructuring-order.js | 150 ++ .../element-setting-ToNumber-detaches.js | 35 + js/src/tests/non262/extensions/empty.txt | 0 .../non262/extensions/error-tostring-function.js | 45 + js/src/tests/non262/extensions/errorcolumnblame.js | 79 + .../extensions/es5ish-defineGetter-defineSetter.js | 281 ++++ .../extensions/eval-native-callback-is-indirect.js | 33 + .../non262/extensions/expression-closure-syntax.js | 62 + ...extension-methods-reject-null-undefined-this.js | 105 ++ .../non262/extensions/file-mapped-arraybuffers.js | 48 + .../non262/extensions/file-mapped-arraybuffers.txt | 1 + ...al-declaration-and-nested-function-statement.js | 130 ++ .../function-caller-skips-eval-frames.js | 34 + .../function-caller-strict-cross-global.js | 16 + .../non262/extensions/function-definition-with.js | 56 + .../tests/non262/extensions/function-properties.js | 21 + .../extensions/getOwnPropertyNames-__proto__.js | 26 + js/src/tests/non262/extensions/getset-001.js | 49 + js/src/tests/non262/extensions/getset-003.js | 186 +++ js/src/tests/non262/extensions/getset-004.js | 174 +++ js/src/tests/non262/extensions/getset-005.js | 183 +++ js/src/tests/non262/extensions/getset-006.js | 157 ++ .../non262/extensions/inc-dec-functioncall.js | 90 ++ .../keyword-unescaped-requirement-modules.js | 99 ++ .../extensions/keyword-unescaped-requirement.js | 43 + .../extensions/mutable-proto-special-form.js | 91 ++ .../extensions/nested-delete-name-in-evalcode.js | 85 + .../non262/extensions/new-cross-compartment.js | 39 + .../non262/extensions/new-parenthesization.js | 21 + .../newer-type-functions-caller-arguments.js | 94 ++ js/src/tests/non262/extensions/non_syntactic.js | 39 + .../object-toSource-override-on-getter.js | 14 + .../extensions/object-toSource-undefined-getter.js | 11 + .../extensions/object-toSource-with-symbol-keys.js | 16 + .../parse-rest-destructuring-parameter.js | 27 + .../extensions/preventExtensions-cross-global.js | 49 + .../proxy-array-target-length-definition.js | 55 + .../tests/non262/extensions/proxy-enumeration.js | 4 + .../tests/non262/extensions/proxy-proto-setter.js | 50 + js/src/tests/non262/extensions/proxy-strict.js | 12 + .../extensions/quote-string-for-nul-character.js | 94 ++ js/src/tests/non262/extensions/recursion.js | 60 + .../extensions/redeclaration-of-catch-warning.js | 37 + ...on-and-gc-during-new-RegExp-pattern-ToString.js | 41 + js/src/tests/non262/extensions/regress-103087.js | 141 ++ js/src/tests/non262/extensions/regress-104077.js | 195 +++ js/src/tests/non262/extensions/regress-178722.js | 90 ++ .../tests/non262/extensions/regress-188206-01.js | 71 + .../tests/non262/extensions/regress-188206-02.js | 121 ++ js/src/tests/non262/extensions/regress-192465.js | 122 ++ .../tests/non262/extensions/regress-220367-002.js | 75 + js/src/tests/non262/extensions/regress-226078.js | 33 + js/src/tests/non262/extensions/regress-228087.js | 316 ++++ js/src/tests/non262/extensions/regress-245148.js | 20 + js/src/tests/non262/extensions/regress-255245.js | 29 + js/src/tests/non262/extensions/regress-274152.js | 48 + js/src/tests/non262/extensions/regress-300079.js | 42 + js/src/tests/non262/extensions/regress-311161.js | 1440 +++++++++++++++++ .../tests/non262/extensions/regress-311792-01.js | 26 + .../tests/non262/extensions/regress-311792-02.js | 40 + js/src/tests/non262/extensions/regress-313763.js | 46 + js/src/tests/non262/extensions/regress-314874.js | 35 + .../tests/non262/extensions/regress-315509-02.js | 42 + js/src/tests/non262/extensions/regress-319683.js | 31 + js/src/tests/non262/extensions/regress-320854.js | 20 + js/src/tests/non262/extensions/regress-327170.js | 25 + js/src/tests/non262/extensions/regress-327608.js | 42 + js/src/tests/non262/extensions/regress-328443.js | 32 + js/src/tests/non262/extensions/regress-330569.js | 91 ++ js/src/tests/non262/extensions/regress-333541.js | 59 + js/src/tests/non262/extensions/regress-336409-1.js | 50 + js/src/tests/non262/extensions/regress-336409-2.js | 49 + js/src/tests/non262/extensions/regress-336410-1.js | 50 + js/src/tests/non262/extensions/regress-336410-2.js | 49 + js/src/tests/non262/extensions/regress-339685.js | 27 + .../tests/non262/extensions/regress-341956-01.js | 65 + .../tests/non262/extensions/regress-341956-02.js | 52 + .../tests/non262/extensions/regress-341956-03.js | 69 + js/src/tests/non262/extensions/regress-342960.js | 43 + js/src/tests/non262/extensions/regress-345967.js | 65 + .../tests/non262/extensions/regress-346642-06.js | 59 + js/src/tests/non262/extensions/regress-346773.js | 49 + .../tests/non262/extensions/regress-350312-01.js | 43 + js/src/tests/non262/extensions/regress-350312.js | 66 + .../tests/non262/extensions/regress-351070-02.js | 65 + js/src/tests/non262/extensions/regress-351448.js | 59 + .../tests/non262/extensions/regress-351463-01.js | 250 +++ js/src/tests/non262/extensions/regress-351973.js | 50 + js/src/tests/non262/extensions/regress-352291.js | 38 + js/src/tests/non262/extensions/regress-352372.js | 62 + js/src/tests/non262/extensions/regress-352604.js | 30 + js/src/tests/non262/extensions/regress-353116.js | 75 + .../tests/non262/extensions/regress-353214-02.js | 27 + js/src/tests/non262/extensions/regress-354297.js | 27 + .../tests/non262/extensions/regress-355052-01.js | 34 + .../tests/non262/extensions/regress-355052-02.js | 34 + .../tests/non262/extensions/regress-355052-03.js | 40 + js/src/tests/non262/extensions/regress-355410.js | 37 + js/src/tests/non262/extensions/regress-355497.js | 58 + .../tests/non262/extensions/regress-363040-01.js | 62 + .../tests/non262/extensions/regress-363040-02.js | 61 + js/src/tests/non262/extensions/regress-363258.js | 45 + js/src/tests/non262/extensions/regress-363988.js | 44 + js/src/tests/non262/extensions/regress-365527.js | 63 + js/src/tests/non262/extensions/regress-365692.js | 40 + js/src/tests/non262/extensions/regress-365869.js | 35 + js/src/tests/non262/extensions/regress-366288.js | 18 + js/src/tests/non262/extensions/regress-366292.js | 19 + js/src/tests/non262/extensions/regress-366396.js | 17 + .../tests/non262/extensions/regress-366668-01.js | 28 + .../tests/non262/extensions/regress-367501-01.js | 32 + .../tests/non262/extensions/regress-367501-02.js | 34 + .../tests/non262/extensions/regress-367501-03.js | 35 + .../tests/non262/extensions/regress-367501-04.js | 35 + js/src/tests/non262/extensions/regress-367589.js | 39 + js/src/tests/non262/extensions/regress-368213.js | 17 + js/src/tests/non262/extensions/regress-368224.js | 25 + js/src/tests/non262/extensions/regress-368516.js | 41 + js/src/tests/non262/extensions/regress-369404.js | 39 + .../tests/non262/extensions/regress-369696-01.js | 30 + .../tests/non262/extensions/regress-369696-02.js | 57 + .../tests/non262/extensions/regress-369696-03.js | 46 + js/src/tests/non262/extensions/regress-372309.js | 37 + js/src/tests/non262/extensions/regress-375183.js | 59 + js/src/tests/non262/extensions/regress-375344.js | 34 + js/src/tests/non262/extensions/regress-379566.js | 44 + js/src/tests/non262/extensions/regress-380889.js | 37 + js/src/tests/non262/extensions/regress-381303.js | 34 + js/src/tests/non262/extensions/regress-381304.js | 69 + .../tests/non262/extensions/regress-385393-02.js | 31 + .../tests/non262/extensions/regress-385393-08.js | 25 + js/src/tests/non262/extensions/regress-390598.js | 31 + js/src/tests/non262/extensions/regress-394967.js | 39 + .../tests/non262/extensions/regress-396326-01.js | 34 + js/src/tests/non262/extensions/regress-396326.js | 45 + js/src/tests/non262/extensions/regress-406572.js | 47 + js/src/tests/non262/extensions/regress-407501.js | 39 + js/src/tests/non262/extensions/regress-407720.js | 44 + js/src/tests/non262/extensions/regress-412926.js | 54 + js/src/tests/non262/extensions/regress-414098.js | 34 + js/src/tests/non262/extensions/regress-414755.js | 51 + js/src/tests/non262/extensions/regress-416354.js | 45 + js/src/tests/non262/extensions/regress-416460.js | 27 + js/src/tests/non262/extensions/regress-416834.js | 20 + .../tests/non262/extensions/regress-420869-01.js | 37 + js/src/tests/non262/extensions/regress-422592.js | 65 + .../tests/non262/extensions/regress-424683-01.js | 33 + js/src/tests/non262/extensions/regress-426711.js | 31 + .../tests/non262/extensions/regress-427196-01.js | 37 + .../tests/non262/extensions/regress-427196-02.js | 34 + .../tests/non262/extensions/regress-427196-03.js | 28 + js/src/tests/non262/extensions/regress-429739.js | 33 + js/src/tests/non262/extensions/regress-430740.js | 36 + .../tests/non262/extensions/regress-434837-01.js | 87 ++ .../tests/non262/extensions/regress-435497-01.js | 31 + .../tests/non262/extensions/regress-435497-02.js | 31 + .../tests/non262/extensions/regress-435497-03.js | 31 + js/src/tests/non262/extensions/regress-436741.js | 32 + .../tests/non262/extensions/regress-437288-01.js | 32 + js/src/tests/non262/extensions/regress-44009.js | 51 + js/src/tests/non262/extensions/regress-443569.js | 35 + js/src/tests/non262/extensions/regress-446386.js | 44 + js/src/tests/non262/extensions/regress-452168.js | 39 + js/src/tests/non262/extensions/regress-452178.js | 27 + js/src/tests/non262/extensions/regress-452329.js | 24 + js/src/tests/non262/extensions/regress-452338.js | 26 + .../tests/non262/extensions/regress-452498-162.js | 24 + .../tests/non262/extensions/regress-452498-196.js | 32 + js/src/tests/non262/extensions/regress-452565.js | 19 + js/src/tests/non262/extensions/regress-452913.js | 18 + js/src/tests/non262/extensions/regress-453249.js | 21 + js/src/tests/non262/extensions/regress-454744.js | 32 + js/src/tests/non262/extensions/regress-455380.js | 60 + js/src/tests/non262/extensions/regress-455408.js | 26 + js/src/tests/non262/extensions/regress-456826.js | 126 ++ js/src/tests/non262/extensions/regress-459606.js | 26 + .../tests/non262/extensions/regress-462734-02.js | 26 + .../tests/non262/extensions/regress-462734-03.js | 25 + .../tests/non262/extensions/regress-462734-04.js | 29 + js/src/tests/non262/extensions/regress-465276.js | 29 + js/src/tests/non262/extensions/regress-465337.js | 28 + js/src/tests/non262/extensions/regress-465443.js | 36 + js/src/tests/non262/extensions/regress-465453.js | 38 + .../tests/non262/extensions/regress-466905-04.js | 46 + js/src/tests/non262/extensions/regress-469234.js | 27 + .../tests/non262/extensions/regress-469405-01.js | 27 + .../tests/non262/extensions/regress-469405-02.js | 25 + .../tests/non262/extensions/regress-469625-01.js | 39 + js/src/tests/non262/extensions/regress-469625.js | 28 + js/src/tests/non262/extensions/regress-469761.js | 28 + .../tests/non262/extensions/regress-470300-01.js | 27 + .../tests/non262/extensions/regress-470300-02.js | 27 + js/src/tests/non262/extensions/regress-470310.js | 30 + .../tests/non262/extensions/regress-472450-03.js | 31 + .../tests/non262/extensions/regress-472450-04.js | 33 + js/src/tests/non262/extensions/regress-472599.js | 29 + js/src/tests/non262/extensions/regress-473040.js | 25 + .../tests/non262/extensions/regress-474771-01.js | 29 + .../tests/non262/extensions/regress-474771-02.js | 20 + .../tests/non262/extensions/regress-476414-01.js | 61 + .../tests/non262/extensions/regress-476414-02.js | 61 + js/src/tests/non262/extensions/regress-476447.js | 30 + js/src/tests/non262/extensions/regress-476653.js | 33 + js/src/tests/non262/extensions/regress-476869.js | 42 + js/src/tests/non262/extensions/regress-477158.js | 28 + js/src/tests/non262/extensions/regress-477187.js | 38 + js/src/tests/non262/extensions/regress-479487.js | 41 + js/src/tests/non262/extensions/regress-479551.js | 39 + js/src/tests/non262/extensions/regress-480579.js | 35 + js/src/tests/non262/extensions/regress-481516.js | 38 + js/src/tests/non262/extensions/regress-482263.js | 26 + js/src/tests/non262/extensions/regress-50447-1.js | 179 +++ js/src/tests/non262/extensions/regress-543839.js | 36 + js/src/tests/non262/extensions/regress-591450.js | 12 + js/src/tests/non262/extensions/regress-636818.js | 9 + js/src/tests/non262/extensions/regress-645160.js | 8 + js/src/tests/non262/extensions/regress-650753.js | 8 + js/src/tests/non262/extensions/regress-696109.js | 13 + .../tests/non262/extensions/regress-90596-001.js | 264 ++++ .../tests/non262/extensions/regress-96284-001.js | 147 ++ .../tests/non262/extensions/regress-bug607284.js | 16 + .../tests/non262/extensions/regress-bug629723.js | 16 + .../extensions/reviver-mutates-holder-array-ccw.js | 39 + .../reviver-mutates-holder-array-nonnative.js | 46 + .../extensions/reviver-mutates-holder-array.js | 39 + .../reviver-mutates-holder-object-ccw.js | 56 + .../reviver-mutates-holder-object-nonnative.js | 60 + .../extensions/reviver-mutates-holder-object.js | 56 + js/src/tests/non262/extensions/scope-001.js | 84 + .../extensions/set-property-non-extensible.js | 30 + .../non262/extensions/setImmutablePrototype.js | 196 +++ js/src/tests/non262/extensions/shareddataview.js | 43 + js/src/tests/non262/extensions/sharedtypedarray.js | 273 ++++ js/src/tests/non262/extensions/shell.js | 345 ++++ js/src/tests/non262/extensions/sps-generators.js | 39 + .../string-literal-getter-setter-decompilation.js | 34 + js/src/tests/non262/extensions/toLength.js | 41 + .../toLocaleString-infinite-recursion.js | 31 + .../extensions/toSource-infinite-recursion.js | 36 + ...o-many-arguments-constructing-bound-function.js | 54 + .../typedarray-copyWithin-arguments-detaching.js | 111 ++ .../non262/extensions/typedarray-set-neutering.js | 45 + .../extensions/typedarray-subarray-of-subarray.js | 33 + js/src/tests/non262/extensions/typedarray.js | 657 ++++++++ js/src/tests/non262/extensions/uneval/bug496985.js | 14 + js/src/tests/non262/extensions/uneval/bug566661.js | 8 + .../non262/extensions/uneval/function-bind.js | 32 + .../non262/extensions/uneval/regress-231518.js | 99 ++ .../non262/extensions/uneval/regress-245795.js | 33 + .../non262/extensions/uneval/regress-254375.js | 28 + .../non262/extensions/uneval/regress-304897.js | 22 + .../non262/extensions/uneval/regress-306738.js | 30 + .../non262/extensions/uneval/regress-311583.js | 23 + .../non262/extensions/uneval/regress-313803.js | 29 + .../non262/extensions/uneval/regress-322957.js | 29 + .../non262/extensions/uneval/regress-328556.js | 21 + .../non262/extensions/uneval/regress-358594-01.js | 31 + .../non262/extensions/uneval/regress-358594-02.js | 23 + .../non262/extensions/uneval/regress-358594-03.js | 30 + .../non262/extensions/uneval/regress-358594-04.js | 23 + .../non262/extensions/uneval/regress-358594-05.js | 31 + .../non262/extensions/uneval/regress-358594-06.js | 23 + .../non262/extensions/uneval/regress-367629.js | 45 + .../non262/extensions/uneval/regress-375801.js | 35 + .../non262/extensions/uneval/regress-380581.js | 28 + .../non262/extensions/uneval/regress-380933.js | 29 + .../non262/extensions/uneval/regress-381211.js | 28 + .../non262/extensions/uneval/regress-381301.js | 39 + .../non262/extensions/uneval/regress-385393-03.js | 29 + .../non262/extensions/uneval/regress-385729.js | 58 + .../non262/extensions/uneval/regress-452498-082.js | 33 + .../non262/extensions/uneval/regress-452498-101.js | 30 + .../non262/extensions/uneval/regress-452498-117.js | 35 + .../non262/extensions/uneval/regress-621814.js | 15 + .../non262/extensions/uneval/regress-624199.js | 19 + .../non262/extensions/uneval/regress-90596-002.js | 264 ++++ .../non262/extensions/uneval/regress-96284-002.js | 147 ++ .../non262/extensions/uneval/regress-bug567606.js | 21 + .../extensions/uneval/strict-function-toSource.js | 19 + .../non262/extensions/uneval/symbol-uneval.js | 15 + .../tests/non262/extensions/uneval/toSource-0.js | 16 + .../unterminated-literal-error-location.js | 119 ++ js/src/tests/non262/extensions/weakmap.js | 121 ++ 339 files changed, 21405 insertions(+) create mode 100644 js/src/tests/non262/extensions/15.9.4.2.js create mode 100644 js/src/tests/non262/extensions/8.12.5-01.js create mode 100644 js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js create mode 100644 js/src/tests/non262/extensions/Boolean-toSource.js create mode 100644 js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js create mode 100644 js/src/tests/non262/extensions/DataView-set-arguments-detaching.js create mode 100644 js/src/tests/non262/extensions/Number-toSource.js create mode 100644 js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js create mode 100644 js/src/tests/non262/extensions/String-match-flags.js create mode 100644 js/src/tests/non262/extensions/String-methods-infinite-recursion.js create mode 100644 js/src/tests/non262/extensions/String-toSource.js create mode 100644 js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js create mode 100644 js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js create mode 100644 js/src/tests/non262/extensions/__proto__.js create mode 100644 js/src/tests/non262/extensions/arguments-property-access-in-function.js create mode 100644 js/src/tests/non262/extensions/array-inherited-__proto__.js create mode 100644 js/src/tests/non262/extensions/array-isArray-proxy-recursion.js create mode 100644 js/src/tests/non262/extensions/array-length-protochange.js create mode 100644 js/src/tests/non262/extensions/array-pop-proxy.js create mode 100644 js/src/tests/non262/extensions/array-toString-recursion.js create mode 100644 js/src/tests/non262/extensions/arraybuffer-prototype.js create mode 100644 js/src/tests/non262/extensions/bad-regexp-data-clone.js create mode 100644 js/src/tests/non262/extensions/basic-for-each.js create mode 100644 js/src/tests/non262/extensions/basic-for-in.js create mode 100644 js/src/tests/non262/extensions/browser.js create mode 100644 js/src/tests/non262/extensions/bug472534.js create mode 100644 js/src/tests/non262/extensions/builtin-function-arguments-caller.js create mode 100644 js/src/tests/non262/extensions/censor-strict-caller.js create mode 100644 js/src/tests/non262/extensions/clone-bigint.js create mode 100644 js/src/tests/non262/extensions/clone-complex-object.js create mode 100644 js/src/tests/non262/extensions/clone-errors.js create mode 100644 js/src/tests/non262/extensions/clone-forge.js create mode 100644 js/src/tests/non262/extensions/clone-invalid-property-key.js create mode 100644 js/src/tests/non262/extensions/clone-leaf-object.js create mode 100644 js/src/tests/non262/extensions/clone-many-transferables.js create mode 100644 js/src/tests/non262/extensions/clone-object-deep.js create mode 100644 js/src/tests/non262/extensions/clone-object.js create mode 100644 js/src/tests/non262/extensions/clone-regexp.js create mode 100644 js/src/tests/non262/extensions/clone-sab-failure.js create mode 100644 js/src/tests/non262/extensions/clone-sab.js create mode 100644 js/src/tests/non262/extensions/clone-simple.js create mode 100644 js/src/tests/non262/extensions/clone-transferables.js create mode 100644 js/src/tests/non262/extensions/clone-typed-array.js create mode 100644 js/src/tests/non262/extensions/clone-v1-typed-array-data.dat create mode 100644 js/src/tests/non262/extensions/clone-v1-typed-array.js create mode 100644 js/src/tests/non262/extensions/collect-gray.js create mode 100644 js/src/tests/non262/extensions/column-numbers.js create mode 100644 js/src/tests/non262/extensions/cross-global-eval-is-indirect.js create mode 100644 js/src/tests/non262/extensions/cross-global-getPrototypeOf.js create mode 100644 js/src/tests/non262/extensions/dataview.js create mode 100644 js/src/tests/non262/extensions/decompile-for-of.js create mode 100644 js/src/tests/non262/extensions/destructure-accessor.js create mode 100644 js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js create mode 100644 js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js create mode 100644 js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js create mode 100644 js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js create mode 100644 js/src/tests/non262/extensions/destructuring-order.js create mode 100644 js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js create mode 100644 js/src/tests/non262/extensions/empty.txt create mode 100644 js/src/tests/non262/extensions/error-tostring-function.js create mode 100644 js/src/tests/non262/extensions/errorcolumnblame.js create mode 100644 js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js create mode 100644 js/src/tests/non262/extensions/eval-native-callback-is-indirect.js create mode 100644 js/src/tests/non262/extensions/expression-closure-syntax.js create mode 100644 js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js create mode 100644 js/src/tests/non262/extensions/file-mapped-arraybuffers.js create mode 100644 js/src/tests/non262/extensions/file-mapped-arraybuffers.txt create mode 100644 js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js create mode 100644 js/src/tests/non262/extensions/function-caller-skips-eval-frames.js create mode 100644 js/src/tests/non262/extensions/function-caller-strict-cross-global.js create mode 100644 js/src/tests/non262/extensions/function-definition-with.js create mode 100644 js/src/tests/non262/extensions/function-properties.js create mode 100644 js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js create mode 100644 js/src/tests/non262/extensions/getset-001.js create mode 100644 js/src/tests/non262/extensions/getset-003.js create mode 100644 js/src/tests/non262/extensions/getset-004.js create mode 100644 js/src/tests/non262/extensions/getset-005.js create mode 100644 js/src/tests/non262/extensions/getset-006.js create mode 100644 js/src/tests/non262/extensions/inc-dec-functioncall.js create mode 100644 js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js create mode 100644 js/src/tests/non262/extensions/keyword-unescaped-requirement.js create mode 100644 js/src/tests/non262/extensions/mutable-proto-special-form.js create mode 100644 js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js create mode 100644 js/src/tests/non262/extensions/new-cross-compartment.js create mode 100644 js/src/tests/non262/extensions/new-parenthesization.js create mode 100644 js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js create mode 100644 js/src/tests/non262/extensions/non_syntactic.js create mode 100644 js/src/tests/non262/extensions/object-toSource-override-on-getter.js create mode 100644 js/src/tests/non262/extensions/object-toSource-undefined-getter.js create mode 100644 js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js create mode 100644 js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js create mode 100644 js/src/tests/non262/extensions/preventExtensions-cross-global.js create mode 100644 js/src/tests/non262/extensions/proxy-array-target-length-definition.js create mode 100644 js/src/tests/non262/extensions/proxy-enumeration.js create mode 100644 js/src/tests/non262/extensions/proxy-proto-setter.js create mode 100644 js/src/tests/non262/extensions/proxy-strict.js create mode 100644 js/src/tests/non262/extensions/quote-string-for-nul-character.js create mode 100644 js/src/tests/non262/extensions/recursion.js create mode 100644 js/src/tests/non262/extensions/redeclaration-of-catch-warning.js create mode 100644 js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js create mode 100644 js/src/tests/non262/extensions/regress-103087.js create mode 100644 js/src/tests/non262/extensions/regress-104077.js create mode 100644 js/src/tests/non262/extensions/regress-178722.js create mode 100644 js/src/tests/non262/extensions/regress-188206-01.js create mode 100644 js/src/tests/non262/extensions/regress-188206-02.js create mode 100644 js/src/tests/non262/extensions/regress-192465.js create mode 100644 js/src/tests/non262/extensions/regress-220367-002.js create mode 100644 js/src/tests/non262/extensions/regress-226078.js create mode 100644 js/src/tests/non262/extensions/regress-228087.js create mode 100644 js/src/tests/non262/extensions/regress-245148.js create mode 100644 js/src/tests/non262/extensions/regress-255245.js create mode 100644 js/src/tests/non262/extensions/regress-274152.js create mode 100644 js/src/tests/non262/extensions/regress-300079.js create mode 100644 js/src/tests/non262/extensions/regress-311161.js create mode 100644 js/src/tests/non262/extensions/regress-311792-01.js create mode 100644 js/src/tests/non262/extensions/regress-311792-02.js create mode 100644 js/src/tests/non262/extensions/regress-313763.js create mode 100644 js/src/tests/non262/extensions/regress-314874.js create mode 100644 js/src/tests/non262/extensions/regress-315509-02.js create mode 100644 js/src/tests/non262/extensions/regress-319683.js create mode 100644 js/src/tests/non262/extensions/regress-320854.js create mode 100644 js/src/tests/non262/extensions/regress-327170.js create mode 100644 js/src/tests/non262/extensions/regress-327608.js create mode 100644 js/src/tests/non262/extensions/regress-328443.js create mode 100644 js/src/tests/non262/extensions/regress-330569.js create mode 100644 js/src/tests/non262/extensions/regress-333541.js create mode 100644 js/src/tests/non262/extensions/regress-336409-1.js create mode 100644 js/src/tests/non262/extensions/regress-336409-2.js create mode 100644 js/src/tests/non262/extensions/regress-336410-1.js create mode 100644 js/src/tests/non262/extensions/regress-336410-2.js create mode 100644 js/src/tests/non262/extensions/regress-339685.js create mode 100644 js/src/tests/non262/extensions/regress-341956-01.js create mode 100644 js/src/tests/non262/extensions/regress-341956-02.js create mode 100644 js/src/tests/non262/extensions/regress-341956-03.js create mode 100644 js/src/tests/non262/extensions/regress-342960.js create mode 100644 js/src/tests/non262/extensions/regress-345967.js create mode 100644 js/src/tests/non262/extensions/regress-346642-06.js create mode 100644 js/src/tests/non262/extensions/regress-346773.js create mode 100644 js/src/tests/non262/extensions/regress-350312-01.js create mode 100644 js/src/tests/non262/extensions/regress-350312.js create mode 100644 js/src/tests/non262/extensions/regress-351070-02.js create mode 100644 js/src/tests/non262/extensions/regress-351448.js create mode 100644 js/src/tests/non262/extensions/regress-351463-01.js create mode 100644 js/src/tests/non262/extensions/regress-351973.js create mode 100644 js/src/tests/non262/extensions/regress-352291.js create mode 100644 js/src/tests/non262/extensions/regress-352372.js create mode 100644 js/src/tests/non262/extensions/regress-352604.js create mode 100644 js/src/tests/non262/extensions/regress-353116.js create mode 100644 js/src/tests/non262/extensions/regress-353214-02.js create mode 100644 js/src/tests/non262/extensions/regress-354297.js create mode 100644 js/src/tests/non262/extensions/regress-355052-01.js create mode 100644 js/src/tests/non262/extensions/regress-355052-02.js create mode 100644 js/src/tests/non262/extensions/regress-355052-03.js create mode 100644 js/src/tests/non262/extensions/regress-355410.js create mode 100644 js/src/tests/non262/extensions/regress-355497.js create mode 100644 js/src/tests/non262/extensions/regress-363040-01.js create mode 100644 js/src/tests/non262/extensions/regress-363040-02.js create mode 100644 js/src/tests/non262/extensions/regress-363258.js create mode 100644 js/src/tests/non262/extensions/regress-363988.js create mode 100644 js/src/tests/non262/extensions/regress-365527.js create mode 100644 js/src/tests/non262/extensions/regress-365692.js create mode 100644 js/src/tests/non262/extensions/regress-365869.js create mode 100644 js/src/tests/non262/extensions/regress-366288.js create mode 100644 js/src/tests/non262/extensions/regress-366292.js create mode 100644 js/src/tests/non262/extensions/regress-366396.js create mode 100644 js/src/tests/non262/extensions/regress-366668-01.js create mode 100644 js/src/tests/non262/extensions/regress-367501-01.js create mode 100644 js/src/tests/non262/extensions/regress-367501-02.js create mode 100644 js/src/tests/non262/extensions/regress-367501-03.js create mode 100644 js/src/tests/non262/extensions/regress-367501-04.js create mode 100644 js/src/tests/non262/extensions/regress-367589.js create mode 100644 js/src/tests/non262/extensions/regress-368213.js create mode 100644 js/src/tests/non262/extensions/regress-368224.js create mode 100644 js/src/tests/non262/extensions/regress-368516.js create mode 100644 js/src/tests/non262/extensions/regress-369404.js create mode 100644 js/src/tests/non262/extensions/regress-369696-01.js create mode 100644 js/src/tests/non262/extensions/regress-369696-02.js create mode 100644 js/src/tests/non262/extensions/regress-369696-03.js create mode 100644 js/src/tests/non262/extensions/regress-372309.js create mode 100644 js/src/tests/non262/extensions/regress-375183.js create mode 100644 js/src/tests/non262/extensions/regress-375344.js create mode 100644 js/src/tests/non262/extensions/regress-379566.js create mode 100644 js/src/tests/non262/extensions/regress-380889.js create mode 100644 js/src/tests/non262/extensions/regress-381303.js create mode 100644 js/src/tests/non262/extensions/regress-381304.js create mode 100644 js/src/tests/non262/extensions/regress-385393-02.js create mode 100644 js/src/tests/non262/extensions/regress-385393-08.js create mode 100644 js/src/tests/non262/extensions/regress-390598.js create mode 100644 js/src/tests/non262/extensions/regress-394967.js create mode 100644 js/src/tests/non262/extensions/regress-396326-01.js create mode 100644 js/src/tests/non262/extensions/regress-396326.js create mode 100644 js/src/tests/non262/extensions/regress-406572.js create mode 100644 js/src/tests/non262/extensions/regress-407501.js create mode 100644 js/src/tests/non262/extensions/regress-407720.js create mode 100644 js/src/tests/non262/extensions/regress-412926.js create mode 100644 js/src/tests/non262/extensions/regress-414098.js create mode 100644 js/src/tests/non262/extensions/regress-414755.js create mode 100644 js/src/tests/non262/extensions/regress-416354.js create mode 100644 js/src/tests/non262/extensions/regress-416460.js create mode 100644 js/src/tests/non262/extensions/regress-416834.js create mode 100644 js/src/tests/non262/extensions/regress-420869-01.js create mode 100644 js/src/tests/non262/extensions/regress-422592.js create mode 100644 js/src/tests/non262/extensions/regress-424683-01.js create mode 100644 js/src/tests/non262/extensions/regress-426711.js create mode 100644 js/src/tests/non262/extensions/regress-427196-01.js create mode 100644 js/src/tests/non262/extensions/regress-427196-02.js create mode 100644 js/src/tests/non262/extensions/regress-427196-03.js create mode 100644 js/src/tests/non262/extensions/regress-429739.js create mode 100644 js/src/tests/non262/extensions/regress-430740.js create mode 100644 js/src/tests/non262/extensions/regress-434837-01.js create mode 100644 js/src/tests/non262/extensions/regress-435497-01.js create mode 100644 js/src/tests/non262/extensions/regress-435497-02.js create mode 100644 js/src/tests/non262/extensions/regress-435497-03.js create mode 100644 js/src/tests/non262/extensions/regress-436741.js create mode 100644 js/src/tests/non262/extensions/regress-437288-01.js create mode 100644 js/src/tests/non262/extensions/regress-44009.js create mode 100644 js/src/tests/non262/extensions/regress-443569.js create mode 100644 js/src/tests/non262/extensions/regress-446386.js create mode 100644 js/src/tests/non262/extensions/regress-452168.js create mode 100644 js/src/tests/non262/extensions/regress-452178.js create mode 100644 js/src/tests/non262/extensions/regress-452329.js create mode 100644 js/src/tests/non262/extensions/regress-452338.js create mode 100644 js/src/tests/non262/extensions/regress-452498-162.js create mode 100644 js/src/tests/non262/extensions/regress-452498-196.js create mode 100644 js/src/tests/non262/extensions/regress-452565.js create mode 100644 js/src/tests/non262/extensions/regress-452913.js create mode 100644 js/src/tests/non262/extensions/regress-453249.js create mode 100644 js/src/tests/non262/extensions/regress-454744.js create mode 100644 js/src/tests/non262/extensions/regress-455380.js create mode 100644 js/src/tests/non262/extensions/regress-455408.js create mode 100644 js/src/tests/non262/extensions/regress-456826.js create mode 100644 js/src/tests/non262/extensions/regress-459606.js create mode 100644 js/src/tests/non262/extensions/regress-462734-02.js create mode 100644 js/src/tests/non262/extensions/regress-462734-03.js create mode 100644 js/src/tests/non262/extensions/regress-462734-04.js create mode 100644 js/src/tests/non262/extensions/regress-465276.js create mode 100644 js/src/tests/non262/extensions/regress-465337.js create mode 100644 js/src/tests/non262/extensions/regress-465443.js create mode 100644 js/src/tests/non262/extensions/regress-465453.js create mode 100644 js/src/tests/non262/extensions/regress-466905-04.js create mode 100644 js/src/tests/non262/extensions/regress-469234.js create mode 100644 js/src/tests/non262/extensions/regress-469405-01.js create mode 100644 js/src/tests/non262/extensions/regress-469405-02.js create mode 100644 js/src/tests/non262/extensions/regress-469625-01.js create mode 100644 js/src/tests/non262/extensions/regress-469625.js create mode 100644 js/src/tests/non262/extensions/regress-469761.js create mode 100644 js/src/tests/non262/extensions/regress-470300-01.js create mode 100644 js/src/tests/non262/extensions/regress-470300-02.js create mode 100644 js/src/tests/non262/extensions/regress-470310.js create mode 100644 js/src/tests/non262/extensions/regress-472450-03.js create mode 100644 js/src/tests/non262/extensions/regress-472450-04.js create mode 100644 js/src/tests/non262/extensions/regress-472599.js create mode 100644 js/src/tests/non262/extensions/regress-473040.js create mode 100644 js/src/tests/non262/extensions/regress-474771-01.js create mode 100644 js/src/tests/non262/extensions/regress-474771-02.js create mode 100644 js/src/tests/non262/extensions/regress-476414-01.js create mode 100644 js/src/tests/non262/extensions/regress-476414-02.js create mode 100644 js/src/tests/non262/extensions/regress-476447.js create mode 100644 js/src/tests/non262/extensions/regress-476653.js create mode 100644 js/src/tests/non262/extensions/regress-476869.js create mode 100644 js/src/tests/non262/extensions/regress-477158.js create mode 100644 js/src/tests/non262/extensions/regress-477187.js create mode 100644 js/src/tests/non262/extensions/regress-479487.js create mode 100644 js/src/tests/non262/extensions/regress-479551.js create mode 100644 js/src/tests/non262/extensions/regress-480579.js create mode 100644 js/src/tests/non262/extensions/regress-481516.js create mode 100644 js/src/tests/non262/extensions/regress-482263.js create mode 100644 js/src/tests/non262/extensions/regress-50447-1.js create mode 100644 js/src/tests/non262/extensions/regress-543839.js create mode 100644 js/src/tests/non262/extensions/regress-591450.js create mode 100644 js/src/tests/non262/extensions/regress-636818.js create mode 100644 js/src/tests/non262/extensions/regress-645160.js create mode 100644 js/src/tests/non262/extensions/regress-650753.js create mode 100644 js/src/tests/non262/extensions/regress-696109.js create mode 100644 js/src/tests/non262/extensions/regress-90596-001.js create mode 100644 js/src/tests/non262/extensions/regress-96284-001.js create mode 100644 js/src/tests/non262/extensions/regress-bug607284.js create mode 100644 js/src/tests/non262/extensions/regress-bug629723.js create mode 100644 js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js create mode 100644 js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js create mode 100644 js/src/tests/non262/extensions/reviver-mutates-holder-array.js create mode 100644 js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js create mode 100644 js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js create mode 100644 js/src/tests/non262/extensions/reviver-mutates-holder-object.js create mode 100644 js/src/tests/non262/extensions/scope-001.js create mode 100644 js/src/tests/non262/extensions/set-property-non-extensible.js create mode 100644 js/src/tests/non262/extensions/setImmutablePrototype.js create mode 100644 js/src/tests/non262/extensions/shareddataview.js create mode 100644 js/src/tests/non262/extensions/sharedtypedarray.js create mode 100644 js/src/tests/non262/extensions/shell.js create mode 100644 js/src/tests/non262/extensions/sps-generators.js create mode 100644 js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js create mode 100644 js/src/tests/non262/extensions/toLength.js create mode 100644 js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js create mode 100644 js/src/tests/non262/extensions/toSource-infinite-recursion.js create mode 100644 js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js create mode 100644 js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js create mode 100644 js/src/tests/non262/extensions/typedarray-set-neutering.js create mode 100644 js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js create mode 100644 js/src/tests/non262/extensions/typedarray.js create mode 100644 js/src/tests/non262/extensions/uneval/bug496985.js create mode 100644 js/src/tests/non262/extensions/uneval/bug566661.js create mode 100644 js/src/tests/non262/extensions/uneval/function-bind.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-231518.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-245795.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-254375.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-304897.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-306738.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-311583.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-313803.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-322957.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-328556.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-358594-01.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-358594-02.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-358594-03.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-358594-04.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-358594-05.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-358594-06.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-367629.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-375801.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-380581.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-380933.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-381211.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-381301.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-385393-03.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-385729.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-452498-082.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-452498-101.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-452498-117.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-621814.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-624199.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-90596-002.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-96284-002.js create mode 100644 js/src/tests/non262/extensions/uneval/regress-bug567606.js create mode 100644 js/src/tests/non262/extensions/uneval/strict-function-toSource.js create mode 100644 js/src/tests/non262/extensions/uneval/symbol-uneval.js create mode 100644 js/src/tests/non262/extensions/uneval/toSource-0.js create mode 100644 js/src/tests/non262/extensions/unterminated-literal-error-location.js create mode 100644 js/src/tests/non262/extensions/weakmap.js (limited to 'js/src/tests/non262/extensions') 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 + */ + +//----------------------------------------------------------------------------- +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 + */ + +//----------------------------------------------------------------------------- +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 + */ + +//------------------------------------------------------------------------------ +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 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 ""; + assertEq(typeof desc, "object"); + assertEq(desc !== null, true); + + var str = ", " + + " 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 = ""; + +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 ("", t._y, "y prototype check"); + + reportCompare ("got ", 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 + */ + +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 + */ + +//----------------------------------------------------------------------------- +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 = "\n' + + '\n' + + '\n' + + '\n'; + + try + { + //.exec(s); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary + ': //.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("'); + 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('