| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Slightly modified variants from http://code.fitness/post/2016/01/javascript-enumerate-methods.html. |
| function __isPropertyOfType(obj, name, type) { |
| let desc; |
| try { |
| desc = Object.getOwnPropertyDescriptor(obj, name); |
| } catch(e) { |
| return false; |
| } |
| |
| if (!desc) |
| return false; |
| |
| return typeof type === 'undefined' || typeof desc.value === type; |
| } |
| |
| function __getProperties(obj, type) { |
| if (typeof obj === "undefined" || obj === null) |
| return []; |
| |
| let properties = []; |
| for (let name of Object.getOwnPropertyNames(obj)) { |
| if (__isPropertyOfType(obj, name, type)) |
| properties.push(name); |
| } |
| |
| let proto = Object.getPrototypeOf(obj); |
| while (proto && proto != Object.prototype) { |
| Object.getOwnPropertyNames(proto) |
| .forEach (name => { |
| if (name !== 'constructor') { |
| if (__isPropertyOfType(proto, name, type)) |
| properties.push(name); |
| } |
| }); |
| proto = Object.getPrototypeOf(proto); |
| } |
| return properties; |
| } |
| |
| function* __getObjects(root = this, level = 0) { |
| if (level > 4) |
| return; |
| |
| let obj_names = __getProperties(root, 'object'); |
| for (let obj_name of obj_names) { |
| let obj = root[obj_name]; |
| if (obj === root) |
| continue; |
| |
| yield obj; |
| yield* __getObjects(obj, level + 1); |
| } |
| } |
| |
| function __getRandomObject(seed) { |
| let objects = []; |
| for (let obj of __getObjects()) { |
| objects.push(obj); |
| } |
| |
| return objects[seed % objects.length]; |
| } |
| |
| function __getRandomProperty(obj, seed) { |
| let properties = __getProperties(obj); |
| if (!properties.length) |
| return undefined; |
| |
| return properties[seed % properties.length]; |
| } |
| |
| function __callRandomFunction(obj, seed, ...args) |
| { |
| let functions = __getProperties(obj, 'function'); |
| if (!functions.length) |
| return; |
| |
| let random_function = functions[seed % functions.length]; |
| try { |
| obj[random_function](...args); |
| } catch(e) { } |
| } |
| |
| function runNearStackLimit(f) { |
| function t() { |
| try { |
| return t(); |
| } catch (e) { |
| return f(); |
| } |
| }; |
| try { |
| return t(); |
| } catch (e) {} |
| } |
| |
| // Limit number of times we cause major GCs in tests to reduce hangs |
| // when called within larger loops. |
| let __callGC; |
| (function() { |
| let countGC = 0; |
| __callGC = function() { |
| if (countGC++ < 50) { |
| gc(); |
| } |
| }; |
| })(); |
| |
| // Neuter common test functions. |
| try { this.failWithMessage = nop; } catch(e) { } |
| try { this.triggerAssertFalse = nop; } catch(e) { } |
| try { this.quit = nop; } catch(e) { } |