tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

regress-609617.js (2292B)


      1 /* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
      2 /*
      3 * Any copyright is dedicated to the Public Domain.
      4 * http://creativecommons.org/licenses/publicdomain/
      5 */
      6 
      7 // SKIP test262 export
      8 // https://github.com/tc39/ecma262/pull/2193
      9 
     10 var actual;
     11 var expect = "pass";
     12 
     13 var x = "fail";
     14 function f() {
     15    var x = "pass";
     16    delete(eval("actual = x"));
     17 }
     18 f();
     19 assertEq(actual, expect);
     20 
     21 function g() { return 1 }
     22 function h() { function g() { throw 2; } eval('g()')++; }
     23 
     24 assertThrowsValue(h, 2);
     25 
     26 var lhs_prefix = ["",        "++", "--", "",   "",   "[",             "[y, "      ];
     27 var lhs_suffix = [" = 'no'", "",   "",   "++", "--", ", y] = [3, 4]", "] = [5, 6]"];
     28 
     29 for (var i = 0; i < lhs_prefix.length; i++) {
     30    var expected;
     31    if (/\[/.test(lhs_prefix[i])) {
     32        expected = "invalid destructuring target";
     33    } else {
     34        /*
     35         * NB: JSOP_SETCALL throws only JSMSG_ASSIGN_TO_CALL, it does not
     36         * specialize for ++ and -- as the compiler's error reporting does. See
     37         * the next section's forked assertEq code.
     38         */
     39        expected = "cannot assign to function call";
     40    }
     41    assertThrownErrorContains(
     42        () => eval(lhs_prefix[i] + "eval('x')" + lhs_suffix[i]),
     43        expected);
     44 }
     45 
     46 /* Now test for strict mode rejecting any SETCALL variant at compile time. */
     47 for (var i = 0; i < lhs_prefix.length; i++) {
     48    var expected;
     49    if (/\+\+|\-\-/.test(lhs_prefix[i] || lhs_suffix[i]))
     50        expected = "invalid increment/decrement operand";
     51    else if (/\[/.test(lhs_prefix[i]))
     52        expected = "invalid destructuring target";
     53    else
     54        expected = "invalid assignment left-hand side";
     55    assertThrownErrorContains(
     56        () => eval("(function () { 'use strict'; " + lhs_prefix[i] + "foo('x')" + lhs_suffix[i] + "; })"),
     57        expected);
     58 }
     59 
     60 /*
     61 * The useless delete is optimized away, but the SETCALL must not be. It's not
     62 * an early error, though.
     63 */
     64 var fooArg;
     65 function foo(arg) { fooArg = arg; }
     66 assertThrownErrorContains(
     67    () => eval("delete (foo('x') = 42);"),
     68    "cannot assign to function call");
     69 assertEq(fooArg, 'x');
     70 
     71 /* Delete of a call expression is not an error at all, even in strict mode. */
     72 function g() {
     73    "use strict";
     74    assertEq(delete Object(), true);
     75 }
     76 g();
     77 
     78 reportCompare(0, 0, "ok");