| // 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. |