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