// Copyright 2014 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. (function(global) { var GetProperties = function(this_name, object) { var result = {}; try { var names = Object.getOwnPropertyNames(object); } catch(e) { return; } for (var i = 0; i < names.length; ++i) { var name = names[i]; if (typeof object === "function") { if (name === "length" || name === "name" || name === "arguments" || name === "caller" || name === "prototype") { continue; } } // Avoid endless recursion. if (this_name === "prototype" && name === "constructor") continue; // Avoid needless duplication. if (this_name === "__PROTO__" && name === "constructor") continue; // Could get this from the parent, but having it locally is easier. var property = { "name": name }; try { var value = object[name]; } catch(e) { property.type = "getter"; result[name] = property; continue; } var type = typeof value; property.type = type; if (type === "function") { property.length = value.length; property.prototype = GetProperties("prototype", value.prototype); } if (type === "string" || type === "number") { property.value = value; } else { property.properties = GetProperties(name, value); } result[name] = property; } // Print the __proto__ if it's not the default Object prototype. if (typeof object === "object" && object.__proto__ !== null && !object.__proto__.hasOwnProperty("__proto__")) { result.__PROTO__ = GetProperties("__PROTO__", object.__proto__); } return result; }; var g = GetProperties("", global, ""); print(JSON.stringify(g, undefined, 2)); })(this); // Must wrap in anonymous closure or it'll detect itself as builtin.