summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Object-forceLexicalInitializationByName.js
blob: 7550d15ef0b6c23681cd05ff4e45c3f219569bb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
load(libdir + "asserts.js");

var g = newGlobal({newCompartment: true});
var dbg = new Debugger;
var gw = dbg.addDebuggee(g);

let errorOne, errorTwo;

function evalErrorStr(global, evalString) {
    try {
        global.evaluate(evalString);
        return undefined;
    } catch (e) {
        return e.toString();
    }
}


assertEq(evalErrorStr(g, "let y = IDONTEXIST;"), "ReferenceError: IDONTEXIST is not defined");
assertEq(evalErrorStr(g, "y = 1;"),
         "ReferenceError: can't access lexical declaration 'y' before initialization");

// Here we flip the uninitialized binding to undfined.
assertEq(gw.forceLexicalInitializationByName("y"), true);
assertEq(g.evaluate("y"), undefined);
g.evaluate("y = 1;");
assertEq(g.evaluate("y"), 1);

// Ensure that bogus bindings return false, but otherwise trigger no error or
// side effect.
assertEq(gw.forceLexicalInitializationByName("idontexist"), false);
assertEq(evalErrorStr(g, "idontexist"), "ReferenceError: idontexist is not defined");

// Ensure that ropes (non-atoms) behave properly
assertEq(gw.forceLexicalInitializationByName(("foo" + "bar" + "bop" + "zopple" + 2 + 3).slice(1)),
                                             false);
assertEq(evalErrorStr(g, "let oobarbopzopple23 = IDONTEXIST;"), "ReferenceError: IDONTEXIST is not defined");
assertEq(gw.forceLexicalInitializationByName(("foo" + "bar" + "bop" + "zopple" + 2 + 3).slice(1)),
                                             true);
assertEq(g.evaluate("oobarbopzopple23"), undefined);

// Ensure that only strings are accepted by forceLexicalInitializationByName
const bad_types = [
    2112,
    {geddy: "lee"},
    () => 1,
    [],
    Array,
    "'1'", // non-identifier
]

for (var badType of bad_types) {
    assertThrowsInstanceOf(() => {
        gw.forceLexicalInitializationByName(badType);
    }, TypeError);
}

// Finally, supplying no arguments should throw a type error
assertThrowsInstanceOf(() => {
    Debugger.isCompilableUnit();
}, TypeError);