tor-browser

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

expression.js (11911B)


      1 // |reftest| skip-if(!xulRuntime.shell)
      2 function test() {
      3 
      4 // primary expressions
      5 assertExpr("true", lit(true));
      6 assertExpr("false", lit(false));
      7 assertExpr("42", lit(42));
      8 assertExpr("(/asdf/)", lit(/asdf/));
      9 assertExpr("this", thisExpr);
     10 assertExpr("foo", ident("foo"));
     11 if ("BigInt" in this) {
     12    assertExpr("1234n", lit(BigInt(1234)));
     13 }
     14 
     15 // member expressions
     16 assertExpr("foo.bar", dotExpr(ident("foo"), ident("bar")));
     17 assertExpr("foo[bar]", memExpr(ident("foo"), ident("bar")));
     18 assertExpr("foo['bar']", memExpr(ident("foo"), lit("bar")));
     19 assertExpr("foo[42]", memExpr(ident("foo"), lit(42)));
     20 
     21 // optional member expressions
     22 assertExpr("foo?.bar", optExpr(optDotExpr(ident("foo"), ident("bar"))));
     23 assertExpr("foo?.bar.baz", optExpr(dotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
     24 assertExpr("foo.bar?.baz", optExpr(optDotExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
     25 assertExpr("foo?.bar?.baz", optExpr(optDotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
     26 assertExpr("foo?.[bar].baz", optExpr(dotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
     27 assertExpr("foo.bar?.[baz]", optExpr(optMemExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
     28 assertExpr("foo[bar]?.[baz]", optExpr(optMemExpr(memExpr(ident("foo"), ident("bar")), ident("baz"))));
     29 assertExpr("foo?.[bar][baz]", optExpr(memExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
     30 assertExpr("foo?.['bar']?.['baz']", optExpr(optMemExpr(optMemExpr(ident("foo"), lit("bar")), lit("baz"))));
     31 assertExpr("foo?.[bar]?.baz", optExpr(optDotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
     32 
     33 // delete optional expressions
     34 assertExpr("\ndelete [] ?. [1]", delOptExpr(optMemExpr(arrExpr([]), lit(1))));
     35 assertExpr("delete foo?.bar", delOptExpr(optDotExpr(ident("foo"), ident("bar"))));
     36 assertExpr("delete foo?.bar.baz", delOptExpr(dotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
     37 assertExpr("delete foo.bar?.baz", delOptExpr(optDotExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
     38 assertExpr("delete foo?.bar?.baz", delOptExpr(optDotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
     39 assertExpr("delete foo?.[bar].baz", delOptExpr(dotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
     40 assertExpr("delete foo.bar?.[baz]", delOptExpr(optMemExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
     41 assertExpr("delete foo[bar]?.[baz]", delOptExpr(optMemExpr(memExpr(ident("foo"), ident("bar")), ident("baz"))));
     42 assertExpr("delete foo?.[bar][baz]", delOptExpr(memExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
     43 assertExpr("delete foo?.['bar']?.['baz']", delOptExpr(optMemExpr(optMemExpr(ident("foo"), lit("bar")), lit("baz"))));
     44 assertExpr("delete foo?.[bar]?.baz", delOptExpr(optDotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
     45 
     46 // function expressions
     47 assertExpr("(function(){})", funExpr(null, [], blockStmt([])));
     48 assertExpr("(function f() {})", funExpr(ident("f"), [], blockStmt([])));
     49 assertExpr("(function f(x,y,z) {})", funExpr(ident("f"), [ident("x"),ident("y"),ident("z")], blockStmt([])));
     50 assertExpr("a => a", arrowExpr([ident("a")], ident("a")));
     51 assertExpr("(a) => a", arrowExpr([ident("a")], ident("a")));
     52 assertExpr("a => b => a", arrowExpr([ident("a")], arrowExpr([ident("b")], ident("a"))));
     53 assertExpr("a => {}", arrowExpr([ident("a")], blockStmt([])));
     54 assertExpr("a => ({})", arrowExpr([ident("a")], objExpr([])));
     55 assertExpr("(a, b, c) => {}", arrowExpr([ident("a"), ident("b"), ident("c")], blockStmt([])));
     56 assertExpr("([a, b]) => {}", arrowExpr([arrPatt([assignElem("a"), assignElem("b")])], blockStmt([])));
     57 
     58 // Unary expressions
     59 assertExpr("(++x)", updExpr("++", ident("x"), true));
     60 assertExpr("(x++)", updExpr("++", ident("x"), false));
     61 assertExpr("(+x)", unExpr("+", ident("x")));
     62 assertExpr("(-x)", unExpr("-", ident("x")));
     63 assertExpr("(!x)", unExpr("!", ident("x")));
     64 assertExpr("(~x)", unExpr("~", ident("x")));
     65 assertExpr("(delete x)", unExpr("delete", ident("x")));
     66 assertExpr("(typeof x)", unExpr("typeof", ident("x")));
     67 assertExpr("(void x)", unExpr("void", ident("x")));
     68 
     69 // Bug 632026: constant-folding
     70 assertExpr("typeof(0?0:a)", unExpr("typeof", condExpr(lit(0), lit(0), ident("a"))));
     71 
     72 // Binary exporessions
     73 assertExpr("(x == y)", binExpr("==", ident("x"), ident("y")));
     74 assertExpr("(x != y)", binExpr("!=", ident("x"), ident("y")));
     75 assertExpr("(x === y)", binExpr("===", ident("x"), ident("y")));
     76 assertExpr("(x !== y)", binExpr("!==", ident("x"), ident("y")));
     77 assertExpr("(x < y)", binExpr("<", ident("x"), ident("y")));
     78 assertExpr("(x <= y)", binExpr("<=", ident("x"), ident("y")));
     79 assertExpr("(x > y)", binExpr(">", ident("x"), ident("y")));
     80 assertExpr("(x >= y)", binExpr(">=", ident("x"), ident("y")));
     81 assertExpr("(x << y)", binExpr("<<", ident("x"), ident("y")));
     82 assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y")));
     83 assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y")));
     84 assertExpr("(x + y)", binExpr("+", ident("x"), ident("y")));
     85 assertExpr("(w + x + y + z)", binExpr("+", binExpr("+", binExpr("+", ident("w"), ident("x")), ident("y")), ident("z")));
     86 assertExpr("(x - y)", binExpr("-", ident("x"), ident("y")));
     87 assertExpr("(w - x - y - z)", binExpr("-", binExpr("-", binExpr("-", ident("w"), ident("x")), ident("y")), ident("z")));
     88 assertExpr("(x * y)", binExpr("*", ident("x"), ident("y")));
     89 assertExpr("(x / y)", binExpr("/", ident("x"), ident("y")));
     90 assertExpr("(x % y)", binExpr("%", ident("x"), ident("y")));
     91 assertExpr("(x | y)", binExpr("|", ident("x"), ident("y")));
     92 assertExpr("(x ^ y)", binExpr("^", ident("x"), ident("y")));
     93 assertExpr("(x & y)", binExpr("&", ident("x"), ident("y")));
     94 assertExpr("(x in y)", binExpr("in", ident("x"), ident("y")));
     95 assertExpr("(x instanceof y)", binExpr("instanceof", ident("x"), ident("y")));
     96 
     97 // Bug 571617: eliminate constant-folding
     98 assertExpr("2 + 3", binExpr("+", lit(2), lit(3)));
     99 
    100 // Assignment expressions
    101 assertExpr("(x = y)", aExpr("=", ident("x"), ident("y")));
    102 assertExpr("(x += y)", aExpr("+=", ident("x"), ident("y")));
    103 assertExpr("(x -= y)", aExpr("-=", ident("x"), ident("y")));
    104 assertExpr("(x *= y)", aExpr("*=", ident("x"), ident("y")));
    105 assertExpr("(x /= y)", aExpr("/=", ident("x"), ident("y")));
    106 assertExpr("(x %= y)", aExpr("%=", ident("x"), ident("y")));
    107 assertExpr("(x <<= y)", aExpr("<<=", ident("x"), ident("y")));
    108 assertExpr("(x >>= y)", aExpr(">>=", ident("x"), ident("y")));
    109 assertExpr("(x >>>= y)", aExpr(">>>=", ident("x"), ident("y")));
    110 assertExpr("(x |= y)", aExpr("|=", ident("x"), ident("y")));
    111 assertExpr("(x ^= y)", aExpr("^=", ident("x"), ident("y")));
    112 assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y")));
    113 
    114 // Conditional expressions
    115 assertExpr("(x || y)", logExpr("||", ident("x"), ident("y")));
    116 assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y")));
    117 assertExpr("(x ?? y)", logExpr("??", ident("x"), ident("y")));
    118 assertExpr("(w || x || y || z)", logExpr("||", logExpr("||", logExpr("||", ident("w"), ident("x")), ident("y")), ident("z")))
    119 assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z")));
    120 
    121 // Sequence expressions
    122 assertExpr("(x,y)", seqExpr([ident("x"),ident("y")]))
    123 assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")]))
    124 assertExpr("(a,b,c,d,e,f,g)", seqExpr([ident("a"),ident("b"),ident("c"),ident("d"),ident("e"),ident("f"),ident("g")]));
    125 
    126 // Call expressions
    127 assertExpr("(new Object)", newExpr(ident("Object"), []));
    128 assertExpr("(new Object())", newExpr(ident("Object"), []));
    129 assertExpr("(new Object(42))", newExpr(ident("Object"), [lit(42)]));
    130 assertExpr("(new Object(1,2,3))", newExpr(ident("Object"), [lit(1),lit(2),lit(3)]));
    131 assertExpr("(String())", callExpr(ident("String"), []));
    132 assertExpr("(String(42))", callExpr(ident("String"), [lit(42)]));
    133 assertExpr("(String(1,2,3))", callExpr(ident("String"), [lit(1),lit(2),lit(3)]));
    134 
    135 // Optional Call expressions
    136 assertExpr("(String?.())", optExpr(optCallExpr(ident("String"), [])));
    137 assertExpr("(String?.(42))", optExpr(optCallExpr(ident("String"), [lit(42)])));
    138 assertExpr("(String?.(1,2,3))", optExpr(optCallExpr(ident("String"), [lit(1),lit(2),lit(3)])));
    139 assertExpr("(String?.foo?.())", optExpr(optCallExpr(optDotExpr(ident("String"), ident("foo")), [])));
    140 assertExpr("(String.foo?.())", optExpr(optCallExpr(dotExpr(ident("String"), ident("foo")), [])));
    141 assertExpr("(String?.foo)()", callExpr(optExpr(optDotExpr(ident("String"), ident("foo"))), []));
    142 assertExpr("(String?.foo)?.()", optExpr(optCallExpr(optExpr(optDotExpr(ident("String"), ident("foo"))), [])));
    143 
    144 // Array expressions
    145 assertExpr("[]", arrExpr([]));
    146 assertExpr("[1]", arrExpr([lit(1)]));
    147 assertExpr("[1,2]", arrExpr([lit(1),lit(2)]));
    148 assertExpr("[1,2,3]", arrExpr([lit(1),lit(2),lit(3)]));
    149 assertExpr("[1,,2,3]", arrExpr([lit(1),null,lit(2),lit(3)]));
    150 assertExpr("[1,,,2,3]", arrExpr([lit(1),null,null,lit(2),lit(3)]));
    151 assertExpr("[1,,,2,,3]", arrExpr([lit(1),null,null,lit(2),null,lit(3)]));
    152 assertExpr("[1,,,2,,,3]", arrExpr([lit(1),null,null,lit(2),null,null,lit(3)]));
    153 assertExpr("[,1,2,3]", arrExpr([null,lit(1),lit(2),lit(3)]));
    154 assertExpr("[,,1,2,3]", arrExpr([null,null,lit(1),lit(2),lit(3)]));
    155 assertExpr("[,,,1,2,3]", arrExpr([null,null,null,lit(1),lit(2),lit(3)]));
    156 assertExpr("[,,,1,2,3,]", arrExpr([null,null,null,lit(1),lit(2),lit(3)]));
    157 assertExpr("[,,,1,2,3,,]", arrExpr([null,null,null,lit(1),lit(2),lit(3),null]));
    158 assertExpr("[,,,1,2,3,,,]", arrExpr([null,null,null,lit(1),lit(2),lit(3),null,null]));
    159 assertExpr("[,,,,,]", arrExpr([null,null,null,null,null]));
    160 assertExpr("[1, ...a, 2]", arrExpr([lit(1), spread(ident("a")), lit(2)]));
    161 assertExpr("[,, ...a,, ...b, 42]", arrExpr([null,null, spread(ident("a")),, spread(ident("b")), lit(42)]));
    162 assertExpr("[1,(2,3)]", arrExpr([lit(1),seqExpr([lit(2),lit(3)])]));
    163 assertExpr("[,(2,3)]", arrExpr([null,seqExpr([lit(2),lit(3)])]));
    164 
    165 // Object expressions
    166 assertExpr("({})", objExpr([]));
    167 assertExpr("({x:1})", objExpr([{ key: ident("x"), value: lit(1) }]));
    168 assertExpr("({x:x, y})", objExpr([{ key: ident("x"), value: ident("x"), shorthand: false },
    169                                  { key: ident("y"), value: ident("y"), shorthand: true }]));
    170 assertExpr("({x:1, y:2})", objExpr([{ key: ident("x"), value: lit(1) },
    171                                    { key: ident("y"), value: lit(2) } ]));
    172 assertExpr("({x:1, y:2, z:3})", objExpr([{ key: ident("x"), value: lit(1) },
    173                                         { key: ident("y"), value: lit(2) },
    174                                         { key: ident("z"), value: lit(3) } ]));
    175 assertExpr("({x:1, 'y':2, z:3})", objExpr([{ key: ident("x"), value: lit(1) },
    176                                           { key: lit("y"), value: lit(2) },
    177                                           { key: ident("z"), value: lit(3) } ]));
    178 assertExpr("({'x':1, 'y':2, z:3})", objExpr([{ key: lit("x"), value: lit(1) },
    179                                             { key: lit("y"), value: lit(2) },
    180                                             { key: ident("z"), value: lit(3) } ]));
    181 assertExpr("({'x':1, 'y':2, 3:3})", objExpr([{ key: lit("x"), value: lit(1) },
    182                                             { key: lit("y"), value: lit(2) },
    183                                             { key: lit(3), value: lit(3) } ]));
    184 assertExpr("({__proto__:x})", objExpr([{ type: "PrototypeMutation", value: ident("x") }]));
    185 assertExpr("({'__proto__':x})", objExpr([{ type: "PrototypeMutation", value: ident("x") }]));
    186 assertExpr("({['__proto__']:x})", objExpr([{ type: "Property", key: comp(lit("__proto__")), value: ident("x") }]));
    187 assertExpr("({['__proto__']:q, __proto__() {}, __proto__: null })",
    188           objExpr([{ type: "Property", key: comp(lit("__proto__")), value: ident("q") },
    189                    { type: "Property", key: ident("__proto__"), method: true },
    190                    { type: "PrototypeMutation", value: lit(null) }]));
    191 }
    192 
    193 runtest(test);