summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/onExceptionUnwind-resumption-async.js
blob: d4e7e857666c9f468af2cf7c53c0d420b6b68722 (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
load(libdir + "asserts.js");

var g = newGlobal();
var dbg = Debugger(g);

g.eval(`
async function f() {
    return e;
}
`);

// To continue testing after uncaught exception, remember the exception and
// return normal completeion.
var currentFrame;
var uncaughtException;
dbg.uncaughtExceptionHook = function(e) {
    uncaughtException = e;
    return {
        return: currentFrame.eval("({ done: true, value: 'uncaught' })").return
    };
};
function testUncaughtException() {
    uncaughtException = undefined;
    var val = g.eval(`
var val;
f().then(v => { val = v });
drainJobQueue();
val;
`);
    assertEq(val, "uncaught");
    assertEq(uncaughtException instanceof TypeError, true);
}

// Just continue
dbg.onExceptionUnwind = function(frame) {
    return undefined;
};
g.eval(`
var E;
f().catch(e => { exc = e });
drainJobQueue();
assertEq(exc instanceof ReferenceError, true);
`);

// Should return object.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: "foo"
    };
};
testUncaughtException();

// The object should have `done` property and `value` property.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: frame.eval("({})").return
    };
};
testUncaughtException();

// The object should have `done` property.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: frame.eval("({ value: 10 })").return
    };
};
testUncaughtException();

// The object should have `value` property.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: frame.eval("({ done: true })").return
    };
};
testUncaughtException();

// `done` property should be a boolean value.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: frame.eval("({ done: 10, value: 10 })").return
    };
};
testUncaughtException();

// `done` property shouldn't be an accessor.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: frame.eval("({ get done() { return true; }, value: 10 })").return
    };
};
testUncaughtException();

// `value` property shouldn't be an accessor.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: frame.eval("({ done: true, get value() { return 10; } })").return
    };
};
testUncaughtException();

// The object shouldn't be a Proxy.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: frame.eval("new Proxy({ done: true, value: 10 }, {})").return
    };
};
testUncaughtException();

// Correct resumption value.
dbg.onExceptionUnwind = function(frame) {
    currentFrame = frame;
    return {
        return: frame.eval("({ done: true, value: 10 })").return
    };
};
var val = g.eval(`
var val;
f().then(v => { val = v });
drainJobQueue();
val;
`);
assertEq(val, 10);