Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(643)

Side by Side Diff: src/mirror-debugger.js

Issue 10834428: Revert r12346 (Introduce InternalProperty type and expose internal properties for bound functions) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/mirror-object.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2012 the V8 project authors. All rights reserved. 1 // Copyright 2006-2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 var UNDEFINED_TYPE = 'undefined'; 147 var UNDEFINED_TYPE = 'undefined';
148 var NULL_TYPE = 'null'; 148 var NULL_TYPE = 'null';
149 var BOOLEAN_TYPE = 'boolean'; 149 var BOOLEAN_TYPE = 'boolean';
150 var NUMBER_TYPE = 'number'; 150 var NUMBER_TYPE = 'number';
151 var STRING_TYPE = 'string'; 151 var STRING_TYPE = 'string';
152 var OBJECT_TYPE = 'object'; 152 var OBJECT_TYPE = 'object';
153 var FUNCTION_TYPE = 'function'; 153 var FUNCTION_TYPE = 'function';
154 var REGEXP_TYPE = 'regexp'; 154 var REGEXP_TYPE = 'regexp';
155 var ERROR_TYPE = 'error'; 155 var ERROR_TYPE = 'error';
156 var PROPERTY_TYPE = 'property'; 156 var PROPERTY_TYPE = 'property';
157 var INTERNAL_PROPERTY_TYPE = 'internalProperty';
158 var FRAME_TYPE = 'frame'; 157 var FRAME_TYPE = 'frame';
159 var SCRIPT_TYPE = 'script'; 158 var SCRIPT_TYPE = 'script';
160 var CONTEXT_TYPE = 'context'; 159 var CONTEXT_TYPE = 'context';
161 var SCOPE_TYPE = 'scope'; 160 var SCOPE_TYPE = 'scope';
162 161
163 // Maximum length when sending strings through the JSON protocol. 162 // Maximum length when sending strings through the JSON protocol.
164 var kMaxProtocolStringLength = 80; 163 var kMaxProtocolStringLength = 80;
165 164
166 // Different kind of properties. 165 // Different kind of properties.
167 var PropertyKind = {}; 166 var PropertyKind = {};
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 // - NumberMirror 205 // - NumberMirror
207 // - StringMirror 206 // - StringMirror
208 // - ObjectMirror 207 // - ObjectMirror
209 // - FunctionMirror 208 // - FunctionMirror
210 // - UnresolvedFunctionMirror 209 // - UnresolvedFunctionMirror
211 // - ArrayMirror 210 // - ArrayMirror
212 // - DateMirror 211 // - DateMirror
213 // - RegExpMirror 212 // - RegExpMirror
214 // - ErrorMirror 213 // - ErrorMirror
215 // - PropertyMirror 214 // - PropertyMirror
216 // - InternalPropertyMirror
217 // - FrameMirror 215 // - FrameMirror
218 // - ScriptMirror 216 // - ScriptMirror
219 217
220 218
221 /** 219 /**
222 * Base class for all mirror objects. 220 * Base class for all mirror objects.
223 * @param {string} type The type of the mirror 221 * @param {string} type The type of the mirror
224 * @constructor 222 * @constructor
225 */ 223 */
226 function Mirror(type) { 224 function Mirror(type) {
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 /** 351 /**
354 * Check whether the mirror reflects a property. 352 * Check whether the mirror reflects a property.
355 * @returns {boolean} True if the mirror reflects a property 353 * @returns {boolean} True if the mirror reflects a property
356 */ 354 */
357 Mirror.prototype.isProperty = function() { 355 Mirror.prototype.isProperty = function() {
358 return this instanceof PropertyMirror; 356 return this instanceof PropertyMirror;
359 }; 357 };
360 358
361 359
362 /** 360 /**
363 * Check whether the mirror reflects an internal property.
364 * @returns {boolean} True if the mirror reflects an internal property
365 */
366 Mirror.prototype.isInternalProperty = function() {
367 return this instanceof InternalPropertyMirror;
368 };
369
370
371 /**
372 * Check whether the mirror reflects a stack frame. 361 * Check whether the mirror reflects a stack frame.
373 * @returns {boolean} True if the mirror reflects a stack frame 362 * @returns {boolean} True if the mirror reflects a stack frame
374 */ 363 */
375 Mirror.prototype.isFrame = function() { 364 Mirror.prototype.isFrame = function() {
376 return this instanceof FrameMirror; 365 return this instanceof FrameMirror;
377 }; 366 };
378 367
379 368
380 /** 369 /**
381 * Check whether the mirror reflects a script. 370 * Check whether the mirror reflects a script.
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 ObjectMirror.prototype.prototypeObject = function() { 587 ObjectMirror.prototype.prototypeObject = function() {
599 return MakeMirror(%DebugGetProperty(this.value_, 'prototype')); 588 return MakeMirror(%DebugGetProperty(this.value_, 'prototype'));
600 }; 589 };
601 590
602 591
603 ObjectMirror.prototype.protoObject = function() { 592 ObjectMirror.prototype.protoObject = function() {
604 return MakeMirror(%DebugGetPrototype(this.value_)); 593 return MakeMirror(%DebugGetPrototype(this.value_));
605 }; 594 };
606 595
607 596
597 /**
598 * Return the primitive value if this is object of Boolean, Number or String
599 * type (but not Date). Otherwise return undefined.
600 */
601 ObjectMirror.prototype.primitiveValue = function() {
602 if (!IS_STRING_WRAPPER(this.value_) && !IS_NUMBER_WRAPPER(this.value_) &&
603 !IS_BOOLEAN_WRAPPER(this.value_)) {
604 return void 0;
605 }
606 var primitiveValue = %_ValueOf(this.value_);
607 if (IS_UNDEFINED(primitiveValue)) {
608 return void 0;
609 }
610 return MakeMirror(primitiveValue);
611 };
612
613
608 ObjectMirror.prototype.hasNamedInterceptor = function() { 614 ObjectMirror.prototype.hasNamedInterceptor = function() {
609 // Get information on interceptors for this object. 615 // Get information on interceptors for this object.
610 var x = %GetInterceptorInfo(this.value_); 616 var x = %GetInterceptorInfo(this.value_);
611 return (x & 2) != 0; 617 return (x & 2) != 0;
612 }; 618 };
613 619
614 620
615 ObjectMirror.prototype.hasIndexedInterceptor = function() { 621 ObjectMirror.prototype.hasIndexedInterceptor = function() {
616 // Get information on interceptors for this object. 622 // Get information on interceptors for this object.
617 var x = %GetInterceptorInfo(this.value_); 623 var x = %GetInterceptorInfo(this.value_);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 } 694 }
689 695
690 return names; 696 return names;
691 }; 697 };
692 698
693 699
694 /** 700 /**
695 * Return the properties for this object as an array of PropertyMirror objects. 701 * Return the properties for this object as an array of PropertyMirror objects.
696 * @param {number} kind Indicate whether named, indexed or both kinds of 702 * @param {number} kind Indicate whether named, indexed or both kinds of
697 * properties are requested 703 * properties are requested
698 * @param {number} limit Limit the number of properties returned to the 704 * @param {number} limit Limit the number of properties returend to the
699 specified value 705 specified value
700 * @return {Array} Property mirrors for this object 706 * @return {Array} Property mirrors for this object
701 */ 707 */
702 ObjectMirror.prototype.properties = function(kind, limit) { 708 ObjectMirror.prototype.properties = function(kind, limit) {
703 var names = this.propertyNames(kind, limit); 709 var names = this.propertyNames(kind, limit);
704 var properties = new Array(names.length); 710 var properties = new Array(names.length);
705 for (var i = 0; i < names.length; i++) { 711 for (var i = 0; i < names.length; i++) {
706 properties[i] = this.property(names[i]); 712 properties[i] = this.property(names[i]);
707 } 713 }
708 714
709 return properties; 715 return properties;
710 }; 716 };
711 717
712 718
713 /**
714 * Return the internal properties for this object as an array of
715 * InternalPropertyMirror objects.
716 * @return {Array} Property mirrors for this object
717 */
718 ObjectMirror.prototype.internalProperties = function() {
719 return ObjectMirror.GetInternalProperties(this.value_);
720 }
721
722
723 ObjectMirror.prototype.property = function(name) { 719 ObjectMirror.prototype.property = function(name) {
724 var details = %DebugGetPropertyDetails(this.value_, %ToString(name)); 720 var details = %DebugGetPropertyDetails(this.value_, %ToString(name));
725 if (details) { 721 if (details) {
726 return new PropertyMirror(this, name, details); 722 return new PropertyMirror(this, name, details);
727 } 723 }
728 724
729 // Nothing found. 725 // Nothing found.
730 return GetUndefinedMirror(); 726 return GetUndefinedMirror();
731 }; 727 };
732 728
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 name = ctor.name(); 783 name = ctor.name();
788 if (!name) { 784 if (!name) {
789 name = this.className(); 785 name = this.className();
790 } 786 }
791 } 787 }
792 return '#<' + name + '>'; 788 return '#<' + name + '>';
793 }; 789 };
794 790
795 791
796 /** 792 /**
797 * Return the internal properties of the value, such as [[PrimitiveValue]] of
798 * scalar wrapper objects and properties of the bound function.
799 * This method is done static to be accessible from Debug API with the bare
800 * values without mirrors.
801 * @return {Array} array (possibly empty) of InternalProperty instances
802 */
803 ObjectMirror.GetInternalProperties = function(value) {
804 if (IS_STRING_WRAPPER(value) || IS_NUMBER_WRAPPER(value) ||
805 IS_BOOLEAN_WRAPPER(value)) {
806 var primitiveValue = %_ValueOf(value);
807 return [new InternalPropertyMirror("[[PrimitiveValue]]", primitiveValue)];
808 } else if (IS_FUNCTION(value)) {
809 var bindings = %BoundFunctionGetBindings(value);
810 var result = [];
811 if (bindings && IS_ARRAY(bindings)) {
812 result.push(new InternalPropertyMirror("[[TargetFunction]]",
813 bindings[0]));
814 result.push(new InternalPropertyMirror("[[BoundThis]]", bindings[1]));
815 var boundArgs = [];
816 for (var i = 2; i < bindings.length; i++) {
817 boundArgs.push(bindings[i]);
818 }
819 result.push(new InternalPropertyMirror("[[BoundArgs]]", boundArgs));
820 }
821 return result;
822 }
823 return [];
824 }
825
826
827 /**
828 * Mirror object for functions. 793 * Mirror object for functions.
829 * @param {function} value The function object reflected by this mirror. 794 * @param {function} value The function object reflected by this mirror.
830 * @constructor 795 * @constructor
831 * @extends ObjectMirror 796 * @extends ObjectMirror
832 */ 797 */
833 function FunctionMirror(value) { 798 function FunctionMirror(value) {
834 %_CallFunction(this, value, FUNCTION_TYPE, ObjectMirror); 799 %_CallFunction(this, value, FUNCTION_TYPE, ObjectMirror);
835 this.resolved_ = true; 800 this.resolved_ = true;
836 } 801 }
837 inherits(FunctionMirror, ObjectMirror); 802 inherits(FunctionMirror, ObjectMirror);
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 * @return {boolean} True if the property is 1261 * @return {boolean} True if the property is
1297 * UndefinedMirror if there is no setter for this property 1262 * UndefinedMirror if there is no setter for this property
1298 */ 1263 */
1299 PropertyMirror.prototype.isNative = function() { 1264 PropertyMirror.prototype.isNative = function() {
1300 return (this.propertyType() == PropertyType.Interceptor) || 1265 return (this.propertyType() == PropertyType.Interceptor) ||
1301 ((this.propertyType() == PropertyType.Callbacks) && 1266 ((this.propertyType() == PropertyType.Callbacks) &&
1302 !this.hasGetter() && !this.hasSetter()); 1267 !this.hasGetter() && !this.hasSetter());
1303 }; 1268 };
1304 1269
1305 1270
1306 /**
1307 * Mirror object for internal properties. Internal property reflects properties
1308 * not accessible from user code such as [[BoundThis]] in bound function.
1309 * Their names are merely symbolic.
1310 * @param {string} name The name of the property
1311 * @param {value} property value
1312 * @constructor
1313 * @extends Mirror
1314 */
1315 function InternalPropertyMirror(name, value) {
1316 %_CallFunction(this, INTERNAL_PROPERTY_TYPE, Mirror);
1317 this.name_ = name;
1318 this.value_ = value;
1319 }
1320 inherits(InternalPropertyMirror, Mirror);
1321
1322
1323 InternalPropertyMirror.prototype.name = function() {
1324 return this.name_;
1325 };
1326
1327
1328 InternalPropertyMirror.prototype.value = function() {
1329 return MakeMirror(this.value_, false);
1330 };
1331
1332
1333 var kFrameDetailsFrameIdIndex = 0; 1271 var kFrameDetailsFrameIdIndex = 0;
1334 var kFrameDetailsReceiverIndex = 1; 1272 var kFrameDetailsReceiverIndex = 1;
1335 var kFrameDetailsFunctionIndex = 2; 1273 var kFrameDetailsFunctionIndex = 2;
1336 var kFrameDetailsArgumentCountIndex = 3; 1274 var kFrameDetailsArgumentCountIndex = 3;
1337 var kFrameDetailsLocalCountIndex = 4; 1275 var kFrameDetailsLocalCountIndex = 4;
1338 var kFrameDetailsSourcePositionIndex = 5; 1276 var kFrameDetailsSourcePositionIndex = 5;
1339 var kFrameDetailsConstructCallIndex = 6; 1277 var kFrameDetailsConstructCallIndex = 6;
1340 var kFrameDetailsAtReturnIndex = 7; 1278 var kFrameDetailsAtReturnIndex = 7;
1341 var kFrameDetailsFlagsIndex = 8; 1279 var kFrameDetailsFlagsIndex = 8;
1342 var kFrameDetailsFirstDynamicIndex = 9; 1280 var kFrameDetailsFirstDynamicIndex = 9;
(...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after
2257 2195
2258 case OBJECT_TYPE: 2196 case OBJECT_TYPE:
2259 case FUNCTION_TYPE: 2197 case FUNCTION_TYPE:
2260 case ERROR_TYPE: 2198 case ERROR_TYPE:
2261 case REGEXP_TYPE: 2199 case REGEXP_TYPE:
2262 // Add object representation. 2200 // Add object representation.
2263 this.serializeObject_(mirror, content, details); 2201 this.serializeObject_(mirror, content, details);
2264 break; 2202 break;
2265 2203
2266 case PROPERTY_TYPE: 2204 case PROPERTY_TYPE:
2267 case INTERNAL_PROPERTY_TYPE: 2205 throw new Error('PropertyMirror cannot be serialized independeltly');
2268 throw new Error('PropertyMirror cannot be serialized independently');
2269 break; 2206 break;
2270 2207
2271 case FRAME_TYPE: 2208 case FRAME_TYPE:
2272 // Add object representation. 2209 // Add object representation.
2273 this.serializeFrame_(mirror, content); 2210 this.serializeFrame_(mirror, content);
2274 break; 2211 break;
2275 2212
2276 case SCOPE_TYPE: 2213 case SCOPE_TYPE:
2277 // Add object representation. 2214 // Add object representation.
2278 this.serializeScope_(mirror, content); 2215 this.serializeScope_(mirror, content);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2334 2271
2335 /** 2272 /**
2336 * Serialize object information to the following JSON format. 2273 * Serialize object information to the following JSON format.
2337 * 2274 *
2338 * {"className":"<class name>", 2275 * {"className":"<class name>",
2339 * "constructorFunction":{"ref":<number>}, 2276 * "constructorFunction":{"ref":<number>},
2340 * "protoObject":{"ref":<number>}, 2277 * "protoObject":{"ref":<number>},
2341 * "prototypeObject":{"ref":<number>}, 2278 * "prototypeObject":{"ref":<number>},
2342 * "namedInterceptor":<boolean>, 2279 * "namedInterceptor":<boolean>,
2343 * "indexedInterceptor":<boolean>, 2280 * "indexedInterceptor":<boolean>,
2344 * "properties":[<properties>], 2281 * "properties":[<properties>]}
2345 * "internalProperties":[<internal properties>]}
2346 */ 2282 */
2347 JSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content, 2283 JSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content,
2348 details) { 2284 details) {
2349 // Add general object properties. 2285 // Add general object properties.
2350 content.className = mirror.className(); 2286 content.className = mirror.className();
2351 content.constructorFunction = 2287 content.constructorFunction =
2352 this.serializeReference(mirror.constructorFunction()); 2288 this.serializeReference(mirror.constructorFunction());
2353 content.protoObject = this.serializeReference(mirror.protoObject()); 2289 content.protoObject = this.serializeReference(mirror.protoObject());
2354 content.prototypeObject = this.serializeReference(mirror.prototypeObject()); 2290 content.prototypeObject = this.serializeReference(mirror.prototypeObject());
2355 2291
2292 var primitiveValue = mirror.primitiveValue();
2293 if (!IS_UNDEFINED(primitiveValue)) {
2294 content.primitiveValue = this.serializeReference(primitiveValue);
2295 }
2296
2356 // Add flags to indicate whether there are interceptors. 2297 // Add flags to indicate whether there are interceptors.
2357 if (mirror.hasNamedInterceptor()) { 2298 if (mirror.hasNamedInterceptor()) {
2358 content.namedInterceptor = true; 2299 content.namedInterceptor = true;
2359 } 2300 }
2360 if (mirror.hasIndexedInterceptor()) { 2301 if (mirror.hasIndexedInterceptor()) {
2361 content.indexedInterceptor = true; 2302 content.indexedInterceptor = true;
2362 } 2303 }
2363 2304
2364 // Add function specific properties. 2305 // Add function specific properties.
2365 if (mirror.isFunction()) { 2306 if (mirror.isFunction()) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2407 } 2348 }
2408 } 2349 }
2409 for (var i = 0; i < propertyIndexes.length; i++) { 2350 for (var i = 0; i < propertyIndexes.length; i++) {
2410 var propertyMirror = mirror.property(propertyIndexes[i]); 2351 var propertyMirror = mirror.property(propertyIndexes[i]);
2411 p[propertyNames.length + i] = this.serializeProperty_(propertyMirror); 2352 p[propertyNames.length + i] = this.serializeProperty_(propertyMirror);
2412 if (details) { 2353 if (details) {
2413 this.add_(propertyMirror.value()); 2354 this.add_(propertyMirror.value());
2414 } 2355 }
2415 } 2356 }
2416 content.properties = p; 2357 content.properties = p;
2417
2418 var internalProperties = mirror.internalProperties();
2419 if (internalProperties.length > 0) {
2420 var ip = [];
2421 for (var i = 0; i < internalProperties.length; i++) {
2422 ip.push(this.serializeInternalProperty_(internalProperties[i]));
2423 }
2424 content.internalProperties = ip;
2425 }
2426 }; 2358 };
2427 2359
2428 2360
2429 /** 2361 /**
2430 * Serialize location information to the following JSON format: 2362 * Serialize location information to the following JSON format:
2431 * 2363 *
2432 * "position":"<position>", 2364 * "position":"<position>",
2433 * "line":"<line>", 2365 * "line":"<line>",
2434 * "column":"<column>", 2366 * "column":"<column>",
2435 * 2367 *
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2483 } 2415 }
2484 if (propertyMirror.propertyType() != PropertyType.Normal) { 2416 if (propertyMirror.propertyType() != PropertyType.Normal) {
2485 result.propertyType = propertyMirror.propertyType(); 2417 result.propertyType = propertyMirror.propertyType();
2486 } 2418 }
2487 result.ref = propertyValue.handle(); 2419 result.ref = propertyValue.handle();
2488 } 2420 }
2489 return result; 2421 return result;
2490 }; 2422 };
2491 2423
2492 2424
2493 /**
2494 * Serialize internal property information to the following JSON format for
2495 * building the array of properties.
2496 *
2497 * {"name":"<property name>",
2498 * "ref":<number>}
2499 *
2500 * {"name":"[[BoundThis]]","ref":117}
2501 *
2502 * @param {InternalPropertyMirror} propertyMirror The property to serialize.
2503 * @returns {Object} Protocol object representing the property.
2504 */
2505 JSONProtocolSerializer.prototype.serializeInternalProperty_ =
2506 function(propertyMirror) {
2507 var result = {};
2508
2509 result.name = propertyMirror.name();
2510 var propertyValue = propertyMirror.value();
2511 if (this.inlineRefs_() && propertyValue.isValue()) {
2512 result.value = this.serializeReferenceWithDisplayData_(propertyValue);
2513 } else {
2514 result.ref = propertyValue.handle();
2515 }
2516 return result;
2517 };
2518
2519
2520 JSONProtocolSerializer.prototype.serializeFrame_ = function(mirror, content) { 2425 JSONProtocolSerializer.prototype.serializeFrame_ = function(mirror, content) {
2521 content.index = mirror.index(); 2426 content.index = mirror.index();
2522 content.receiver = this.serializeReference(mirror.receiver()); 2427 content.receiver = this.serializeReference(mirror.receiver());
2523 var func = mirror.func(); 2428 var func = mirror.func();
2524 content.func = this.serializeReference(func); 2429 content.func = this.serializeReference(func);
2525 if (func.script()) { 2430 if (func.script()) {
2526 content.script = this.serializeReference(func.script()); 2431 content.script = this.serializeReference(func.script());
2527 } 2432 }
2528 content.constructCall = mirror.isConstructCall(); 2433 content.constructCall = mirror.isConstructCall();
2529 content.atReturn = mirror.isAtReturn(); 2434 content.atReturn = mirror.isAtReturn();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2592 } 2497 }
2593 if (!NUMBER_IS_FINITE(value)) { 2498 if (!NUMBER_IS_FINITE(value)) {
2594 if (value > 0) { 2499 if (value > 0) {
2595 return 'Infinity'; 2500 return 'Infinity';
2596 } else { 2501 } else {
2597 return '-Infinity'; 2502 return '-Infinity';
2598 } 2503 }
2599 } 2504 }
2600 return value; 2505 return value;
2601 } 2506 }
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/mirror-object.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698