Try proxying all function arguments
[WebKit-https.git] / JSTests / stress / proxy-all-the-parameters.js
1 const verbose = false;
2
3 const ignore = ['quit', 'readline', 'waitForReport', 'flashHeapAccess', 'leaving', 'getReport'];
4
5 function isPropertyOfType(obj, name, type) {
6     let desc;
7     desc = Object.getOwnPropertyDescriptor(obj, name)
8     return typeof type === 'undefined' || typeof desc.value === type;
9 }
10
11 function getProperties(obj, type) {
12     let properties = [];
13     for (let name of Object.getOwnPropertyNames(obj)) {
14         if (isPropertyOfType(obj, name, type))
15             properties.push(name);
16     }
17     return properties;
18 }
19
20 function* generateObjects(root = this, level = 0) {
21     if (level > 4)
22         return;
23     let obj_names = getProperties(root, 'object');
24     for (let obj_name of obj_names) {
25         let obj = root[obj_name];
26         yield obj;
27         yield* generateObjects(obj, level + 1);
28     }
29 }
30
31 function getObjects() {
32     let objects = [];
33     for (let obj of generateObjects())
34         if (!objects.includes(obj))
35             objects.push(obj);
36     return objects;
37 }
38
39 function getFunctions(obj) {
40     return getProperties(obj, 'function');
41 }
42
43 const thrower = new Proxy({}, { get() { throw 0xc0defefe; } });
44
45 for (let o of getObjects()) {
46     for (let f of getFunctions(o)) {
47         if (ignore.includes(f))
48             continue;
49         const arityPlusOne = o[f].length + 1;
50         if (verbose)
51             print(`Calling ${o}['${f}'](${Array(arityPlusOne).fill("thrower")})`);
52         try {
53             o[f](Array(arityPlusOne).fill(thrower));
54         } catch (e) {
55             if (`${e}`.includes('constructor without new is invalid')) {
56                 try {
57                     if (verbose)
58                         print(`    Constructing instead`);
59                     new o[f](Array(arityPlusOne).fill(thrower));
60                 } catch (e) {
61                     if (verbose)
62                         print(`    threw ${e}`);
63                 }
64             } else {
65                 if (verbose)
66                     print(`    threw ${e}`);
67             }
68         }
69     }
70 }