| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 (function(global) { | 5 (function(global) { |
| 6 | 6 |
| 7 var GetProperties = function(this_name, object) { | 7 var GetProperties = function(this_name, object) { |
| 8 var result = {}; | 8 var result = {}; |
| 9 try { | 9 try { |
| 10 var names = Object.getOwnPropertyNames(object); | 10 var names = Object.getOwnPropertyNames(object); |
| 11 } catch(e) { | 11 } catch(e) { |
| 12 return; | 12 return; |
| 13 } | 13 } |
| 14 for (var i = 0; i < names.length; ++i) { | 14 for (var i = 0; i < names.length; ++i) { |
| 15 var name = names[i]; | 15 var name = names[i]; |
| 16 if (typeof object === "function") { | 16 if (typeof object === "function") { |
| 17 if (name === "length" || | 17 if (name === "length" || |
| 18 name === "name" || | 18 name === "name" || |
| 19 name === "arguments" || | 19 name === "arguments" || |
| 20 name === "caller" || | 20 name === "caller" || |
| 21 name === "prototype") { | 21 name === "prototype") { |
| 22 continue; | 22 continue; |
| 23 } | 23 } |
| 24 } | 24 } |
| 25 // Avoid endless recursion. | 25 // Avoid endless recursion. |
| 26 if (this_name === "prototype" && name === "constructor") continue; | 26 if (this_name === "prototype" && name === "constructor") continue; |
| 27 // Avoid needless duplication. |
| 28 if (this_name === "__PROTO__" && name === "constructor") continue; |
| 27 // Could get this from the parent, but having it locally is easier. | 29 // Could get this from the parent, but having it locally is easier. |
| 28 var property = { "name": name }; | 30 var property = { "name": name }; |
| 29 try { | 31 try { |
| 30 var value = object[name]; | 32 var value = object[name]; |
| 31 } catch(e) { | 33 } catch(e) { |
| 32 property.type = "getter"; | 34 property.type = "getter"; |
| 33 result[name] = property; | 35 result[name] = property; |
| 34 continue; | 36 continue; |
| 35 } | 37 } |
| 36 var type = typeof value; | 38 var type = typeof value; |
| 37 property.type = type; | 39 property.type = type; |
| 38 if (type === "function") { | 40 if (type === "function") { |
| 39 property.length = value.length; | 41 property.length = value.length; |
| 40 property.prototype = GetProperties("prototype", value.prototype); | 42 property.prototype = GetProperties("prototype", value.prototype); |
| 41 } | 43 } |
| 42 property.properties = GetProperties(name, value); | 44 if (type === "string" || type === "number") { |
| 45 property.value = value; |
| 46 } else { |
| 47 property.properties = GetProperties(name, value); |
| 48 } |
| 43 result[name] = property; | 49 result[name] = property; |
| 44 } | 50 } |
| 51 // Print the __proto__ if it's not the default Object prototype. |
| 52 if (typeof object === "object" && object.__proto__ !== null && |
| 53 !object.__proto__.hasOwnProperty("__proto__")) { |
| 54 result.__PROTO__ = GetProperties("__PROTO__", object.__proto__); |
| 55 } |
| 45 return result; | 56 return result; |
| 46 }; | 57 }; |
| 47 | 58 |
| 48 var g = GetProperties("", global, ""); | 59 var g = GetProperties("", global, ""); |
| 49 print(JSON.stringify(g, undefined, 2)); | 60 print(JSON.stringify(g, undefined, 2)); |
| 50 | 61 |
| 51 })(this); // Must wrap in anonymous closure or it'll detect itself as builtin. | 62 })(this); // Must wrap in anonymous closure or it'll detect itself as builtin. |
| OLD | NEW |