| OLD | NEW |
| 1 // Copyright 2006-2012 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2012 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, utils) { | 5 (function(global, utils) { |
| 6 "use strict"; | 6 "use strict"; |
| 7 | 7 |
| 8 // ---------------------------------------------------------------------------- | 8 // ---------------------------------------------------------------------------- |
| 9 // Imports | 9 // Imports |
| 10 | 10 |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 var tempCtor = function(){}; | 232 var tempCtor = function(){}; |
| 233 tempCtor.prototype = superCtor.prototype; | 233 tempCtor.prototype = superCtor.prototype; |
| 234 ctor.super_ = superCtor.prototype; | 234 ctor.super_ = superCtor.prototype; |
| 235 ctor.prototype = new tempCtor(); | 235 ctor.prototype = new tempCtor(); |
| 236 ctor.prototype.constructor = ctor; | 236 ctor.prototype.constructor = ctor; |
| 237 } | 237 } |
| 238 | 238 |
| 239 // Maximum length when sending strings through the JSON protocol. | 239 // Maximum length when sending strings through the JSON protocol. |
| 240 var kMaxProtocolStringLength = 80; | 240 var kMaxProtocolStringLength = 80; |
| 241 | 241 |
| 242 // Different kind of properties. | |
| 243 var PropertyKind = {}; | |
| 244 PropertyKind.Named = 1; | |
| 245 PropertyKind.Indexed = 2; | |
| 246 | |
| 247 | 242 |
| 248 // A copy of the PropertyType enum from property-details.h | 243 // A copy of the PropertyType enum from property-details.h |
| 249 var PropertyType = {}; | 244 var PropertyType = {}; |
| 250 PropertyType.Data = 0; | 245 PropertyType.Data = 0; |
| 251 PropertyType.DataConstant = 2; | 246 PropertyType.DataConstant = 2; |
| 252 PropertyType.AccessorConstant = 3; | 247 PropertyType.AccessorConstant = 3; |
| 253 | 248 |
| 254 | 249 |
| 255 // Different attributes for a property. | 250 // Different attributes for a property. |
| 256 var PropertyAttribute = {}; | 251 var PropertyAttribute = {}; |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 743 }; | 738 }; |
| 744 | 739 |
| 745 | 740 |
| 746 ObjectMirror.prototype.hasIndexedInterceptor = function() { | 741 ObjectMirror.prototype.hasIndexedInterceptor = function() { |
| 747 // Get information on interceptors for this object. | 742 // Get information on interceptors for this object. |
| 748 var x = %GetInterceptorInfo(this.value_); | 743 var x = %GetInterceptorInfo(this.value_); |
| 749 return (x & 1) != 0; | 744 return (x & 1) != 0; |
| 750 }; | 745 }; |
| 751 | 746 |
| 752 | 747 |
| 753 // Get all own property names except for private symbols. | |
| 754 function TryGetPropertyNames(object) { | |
| 755 try { | |
| 756 // TODO(yangguo): Should there be a special debugger implementation of | |
| 757 // %GetOwnPropertyNames that doesn't perform access checks? | |
| 758 return %GetOwnPropertyNames(object, PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL); | |
| 759 } catch (e) { | |
| 760 // Might have hit a failed access check. | |
| 761 return []; | |
| 762 } | |
| 763 } | |
| 764 | |
| 765 | |
| 766 /** | 748 /** |
| 767 * Return the property names for this object. | 749 * Return the property names for this object. |
| 768 * @param {number} kind Indicate whether named, indexed or both kinds of | 750 * @param {number} kind Indicate whether named, indexed or both kinds of |
| 769 * properties are requested | 751 * properties are requested |
| 770 * @param {number} limit Limit the number of names returend to the specified | 752 * @param {number} limit Limit the number of names returend to the specified |
| 771 value | 753 value |
| 772 * @return {Array} Property names for this object | 754 * @return {Array} Property names for this object |
| 773 */ | 755 */ |
| 774 ObjectMirror.prototype.propertyNames = function(kind, limit) { | 756 ObjectMirror.prototype.propertyNames = function() { |
| 775 // Find kind and limit and allocate array for the result | 757 return %GetOwnPropertyKeys(this.value_, PROPERTY_FILTER_NONE); |
| 776 kind = kind || PropertyKind.Named | PropertyKind.Indexed; | |
| 777 | |
| 778 var propertyNames; | |
| 779 var elementNames; | |
| 780 var total = 0; | |
| 781 | |
| 782 // Find all the named properties. | |
| 783 if (kind & PropertyKind.Named) { | |
| 784 propertyNames = TryGetPropertyNames(this.value_); | |
| 785 total += propertyNames.length; | |
| 786 | |
| 787 // Get names for named interceptor properties if any. | |
| 788 if (this.hasNamedInterceptor() && (kind & PropertyKind.Named)) { | |
| 789 var namedInterceptorNames = | |
| 790 %GetNamedInterceptorPropertyNames(this.value_); | |
| 791 if (namedInterceptorNames) { | |
| 792 propertyNames = propertyNames.concat(namedInterceptorNames); | |
| 793 total += namedInterceptorNames.length; | |
| 794 } | |
| 795 } | |
| 796 } | |
| 797 | |
| 798 // Find all the indexed properties. | |
| 799 if (kind & PropertyKind.Indexed) { | |
| 800 // Get own element names. | |
| 801 elementNames = %GetOwnElementNames(this.value_); | |
| 802 total += elementNames.length; | |
| 803 | |
| 804 // Get names for indexed interceptor properties. | |
| 805 if (this.hasIndexedInterceptor() && (kind & PropertyKind.Indexed)) { | |
| 806 var indexedInterceptorNames = | |
| 807 %GetIndexedInterceptorElementNames(this.value_); | |
| 808 if (indexedInterceptorNames) { | |
| 809 elementNames = elementNames.concat(indexedInterceptorNames); | |
| 810 total += indexedInterceptorNames.length; | |
| 811 } | |
| 812 } | |
| 813 } | |
| 814 limit = MathMin(limit || total, total); | |
| 815 | |
| 816 var names = new GlobalArray(limit); | |
| 817 var index = 0; | |
| 818 | |
| 819 // Copy names for named properties. | |
| 820 if (kind & PropertyKind.Named) { | |
| 821 for (var i = 0; index < limit && i < propertyNames.length; i++) { | |
| 822 names[index++] = propertyNames[i]; | |
| 823 } | |
| 824 } | |
| 825 | |
| 826 // Copy names for indexed properties. | |
| 827 if (kind & PropertyKind.Indexed) { | |
| 828 for (var i = 0; index < limit && i < elementNames.length; i++) { | |
| 829 names[index++] = elementNames[i]; | |
| 830 } | |
| 831 } | |
| 832 | |
| 833 return names; | |
| 834 }; | 758 }; |
| 835 | 759 |
| 836 | 760 |
| 837 /** | 761 /** |
| 838 * Return the properties for this object as an array of PropertyMirror objects. | 762 * Return the properties for this object as an array of PropertyMirror objects. |
| 839 * @param {number} kind Indicate whether named, indexed or both kinds of | 763 * @param {number} kind Indicate whether named, indexed or both kinds of |
| 840 * properties are requested | 764 * properties are requested |
| 841 * @param {number} limit Limit the number of properties returned to the | 765 * @param {number} limit Limit the number of properties returned to the |
| 842 specified value | 766 specified value |
| 843 * @return {Array} Property mirrors for this object | 767 * @return {Array} Property mirrors for this object |
| 844 */ | 768 */ |
| 845 ObjectMirror.prototype.properties = function(kind, limit) { | 769 ObjectMirror.prototype.properties = function() { |
| 846 var names = this.propertyNames(kind, limit); | 770 var names = this.propertyNames(); |
| 847 var properties = new GlobalArray(names.length); | 771 var properties = new GlobalArray(names.length); |
| 848 for (var i = 0; i < names.length; i++) { | 772 for (var i = 0; i < names.length; i++) { |
| 849 properties[i] = this.property(names[i]); | 773 properties[i] = this.property(names[i]); |
| 850 } | 774 } |
| 851 | 775 |
| 852 return properties; | 776 return properties; |
| 853 }; | 777 }; |
| 854 | 778 |
| 855 | 779 |
| 856 /** | 780 /** |
| (...skipping 23 matching lines...) Expand all Loading... |
| 880 * @param {Mirror} value The property value to look for | 804 * @param {Mirror} value The property value to look for |
| 881 * @return {PropertyMirror} The property with the specified value. If no | 805 * @return {PropertyMirror} The property with the specified value. If no |
| 882 * property was found with the specified value UndefinedMirror is returned | 806 * property was found with the specified value UndefinedMirror is returned |
| 883 */ | 807 */ |
| 884 ObjectMirror.prototype.lookupProperty = function(value) { | 808 ObjectMirror.prototype.lookupProperty = function(value) { |
| 885 var properties = this.properties(); | 809 var properties = this.properties(); |
| 886 | 810 |
| 887 // Look for property value in properties. | 811 // Look for property value in properties. |
| 888 for (var i = 0; i < properties.length; i++) { | 812 for (var i = 0; i < properties.length; i++) { |
| 889 | 813 |
| 890 // Skip properties which are defined through assessors. | 814 // Skip properties which are defined through accessors. |
| 891 var property = properties[i]; | 815 var property = properties[i]; |
| 892 if (property.propertyType() != PropertyType.AccessorConstant) { | 816 if (property.propertyType() != PropertyType.AccessorConstant) { |
| 893 if (%_ObjectEquals(property.value_, value.value_)) { | 817 if (%_ObjectEquals(property.value_, value.value_)) { |
| 894 return property; | 818 return property; |
| 895 } | 819 } |
| 896 } | 820 } |
| 897 } | 821 } |
| 898 | 822 |
| 899 // Nothing found. | 823 // Nothing found. |
| 900 return GetUndefinedMirror(); | 824 return GetUndefinedMirror(); |
| (...skipping 1975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2876 content.value = mirror.value(); | 2800 content.value = mirror.value(); |
| 2877 } | 2801 } |
| 2878 | 2802 |
| 2879 if (mirror.isPromise()) { | 2803 if (mirror.isPromise()) { |
| 2880 // Add promise specific properties. | 2804 // Add promise specific properties. |
| 2881 content.status = mirror.status(); | 2805 content.status = mirror.status(); |
| 2882 content.promiseValue = this.serializeReference(mirror.promiseValue()); | 2806 content.promiseValue = this.serializeReference(mirror.promiseValue()); |
| 2883 } | 2807 } |
| 2884 | 2808 |
| 2885 // Add actual properties - named properties followed by indexed properties. | 2809 // Add actual properties - named properties followed by indexed properties. |
| 2886 var propertyNames = mirror.propertyNames(PropertyKind.Named); | 2810 var properties = mirror.propertyNames(); |
| 2887 var propertyIndexes = mirror.propertyNames(PropertyKind.Indexed); | 2811 for (var i = 0; i < properties.length; i++) { |
| 2888 var p = new GlobalArray(propertyNames.length + propertyIndexes.length); | 2812 var propertyMirror = mirror.property(properties[i]); |
| 2889 for (var i = 0; i < propertyNames.length; i++) { | 2813 properties[i] = this.serializeProperty_(propertyMirror); |
| 2890 var propertyMirror = mirror.property(propertyNames[i]); | |
| 2891 p[i] = this.serializeProperty_(propertyMirror); | |
| 2892 if (details) { | 2814 if (details) { |
| 2893 this.add_(propertyMirror.value()); | 2815 this.add_(propertyMirror.value()); |
| 2894 } | 2816 } |
| 2895 } | 2817 } |
| 2896 for (var i = 0; i < propertyIndexes.length; i++) { | 2818 content.properties = properties; |
| 2897 var propertyMirror = mirror.property(propertyIndexes[i]); | |
| 2898 p[propertyNames.length + i] = this.serializeProperty_(propertyMirror); | |
| 2899 if (details) { | |
| 2900 this.add_(propertyMirror.value()); | |
| 2901 } | |
| 2902 } | |
| 2903 content.properties = p; | |
| 2904 | 2819 |
| 2905 var internalProperties = mirror.internalProperties(); | 2820 var internalProperties = mirror.internalProperties(); |
| 2906 if (internalProperties.length > 0) { | 2821 if (internalProperties.length > 0) { |
| 2907 var ip = []; | 2822 var ip = []; |
| 2908 for (var i = 0; i < internalProperties.length; i++) { | 2823 for (var i = 0; i < internalProperties.length; i++) { |
| 2909 ip.push(this.serializeInternalProperty_(internalProperties[i])); | 2824 ip.push(this.serializeInternalProperty_(internalProperties[i])); |
| 2910 } | 2825 } |
| 2911 content.internalProperties = ip; | 2826 content.internalProperties = ip; |
| 2912 } | 2827 } |
| 2913 }; | 2828 }; |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3091 utils.InstallFunctions(global, DONT_ENUM, [ | 3006 utils.InstallFunctions(global, DONT_ENUM, [ |
| 3092 "MakeMirror", MakeMirror, | 3007 "MakeMirror", MakeMirror, |
| 3093 "MakeMirrorSerializer", MakeMirrorSerializer, | 3008 "MakeMirrorSerializer", MakeMirrorSerializer, |
| 3094 "LookupMirror", LookupMirror, | 3009 "LookupMirror", LookupMirror, |
| 3095 "ToggleMirrorCache", ToggleMirrorCache, | 3010 "ToggleMirrorCache", ToggleMirrorCache, |
| 3096 "MirrorCacheIsEmpty", MirrorCacheIsEmpty, | 3011 "MirrorCacheIsEmpty", MirrorCacheIsEmpty, |
| 3097 ]); | 3012 ]); |
| 3098 | 3013 |
| 3099 utils.InstallConstants(global, [ | 3014 utils.InstallConstants(global, [ |
| 3100 "ScopeType", ScopeType, | 3015 "ScopeType", ScopeType, |
| 3101 "PropertyKind", PropertyKind, | |
| 3102 "PropertyType", PropertyType, | 3016 "PropertyType", PropertyType, |
| 3103 "PropertyAttribute", PropertyAttribute, | 3017 "PropertyAttribute", PropertyAttribute, |
| 3104 "Mirror", Mirror, | 3018 "Mirror", Mirror, |
| 3105 "ValueMirror", ValueMirror, | 3019 "ValueMirror", ValueMirror, |
| 3106 "UndefinedMirror", UndefinedMirror, | 3020 "UndefinedMirror", UndefinedMirror, |
| 3107 "NullMirror", NullMirror, | 3021 "NullMirror", NullMirror, |
| 3108 "BooleanMirror", BooleanMirror, | 3022 "BooleanMirror", BooleanMirror, |
| 3109 "NumberMirror", NumberMirror, | 3023 "NumberMirror", NumberMirror, |
| 3110 "StringMirror", StringMirror, | 3024 "StringMirror", StringMirror, |
| 3111 "SymbolMirror", SymbolMirror, | 3025 "SymbolMirror", SymbolMirror, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3132 // Functions needed by the debugger runtime. | 3046 // Functions needed by the debugger runtime. |
| 3133 utils.InstallFunctions(utils, DONT_ENUM, [ | 3047 utils.InstallFunctions(utils, DONT_ENUM, [ |
| 3134 "ClearMirrorCache", ClearMirrorCache | 3048 "ClearMirrorCache", ClearMirrorCache |
| 3135 ]); | 3049 ]); |
| 3136 | 3050 |
| 3137 // Export to debug.js | 3051 // Export to debug.js |
| 3138 utils.Export(function(to) { | 3052 utils.Export(function(to) { |
| 3139 to.MirrorType = MirrorType; | 3053 to.MirrorType = MirrorType; |
| 3140 }); | 3054 }); |
| 3141 }) | 3055 }) |
| OLD | NEW |