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

Side by Side Diff: src/object-observe.js

Issue 263833007: Don't leak contexts in Object.observe (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: cr comments Created 6 years, 7 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 | « src/contexts.h ('k') | src/runtime.h » ('j') | src/runtime.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 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 "use strict"; 5 "use strict";
6 6
7 // Overview: 7 // Overview:
8 // 8 //
9 // This file contains all of the routing and accounting for Object.observe. 9 // This file contains all of the routing and accounting for Object.observe.
10 // User code will interact with these mechanisms via the Object.observe APIs 10 // User code will interact with these mechanisms via the Object.observe APIs
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 49
50 return observationState; 50 return observationState;
51 } 51 }
52 52
53 function GetWeakMapWrapper() { 53 function GetWeakMapWrapper() {
54 function MapWrapper(map) { 54 function MapWrapper(map) {
55 this.map_ = map; 55 this.map_ = map;
56 }; 56 };
57 57
58 MapWrapper.prototype = { 58 MapWrapper.prototype = {
59 __proto__: null,
59 get: function(key) { 60 get: function(key) {
60 return %WeakCollectionGet(this.map_, key); 61 return %WeakCollectionGet(this.map_, key);
61 }, 62 },
62 set: function(key, value) { 63 set: function(key, value) {
63 %WeakCollectionSet(this.map_, key, value); 64 %WeakCollectionSet(this.map_, key, value);
64 }, 65 },
65 has: function(key) { 66 has: function(key) {
66 return !IS_UNDEFINED(this.get(key)); 67 return !IS_UNDEFINED(this.get(key));
67 } 68 }
68 }; 69 };
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 throw MakeTypeError("observe_non_object", ["observe"]); 358 throw MakeTypeError("observe_non_object", ["observe"]);
358 if (%IsJSGlobalProxy(object)) 359 if (%IsJSGlobalProxy(object))
359 throw MakeTypeError("observe_global_proxy", ["observe"]); 360 throw MakeTypeError("observe_global_proxy", ["observe"]);
360 if (!IS_SPEC_FUNCTION(callback)) 361 if (!IS_SPEC_FUNCTION(callback))
361 throw MakeTypeError("observe_non_function", ["observe"]); 362 throw MakeTypeError("observe_non_function", ["observe"]);
362 if (ObjectIsFrozen(callback)) 363 if (ObjectIsFrozen(callback))
363 throw MakeTypeError("observe_callback_frozen"); 364 throw MakeTypeError("observe_callback_frozen");
364 if (!AcceptArgIsValid(acceptList)) 365 if (!AcceptArgIsValid(acceptList))
365 throw MakeTypeError("observe_accept_invalid"); 366 throw MakeTypeError("observe_accept_invalid");
366 367
368 return %NativeObjectObserve(object, callback, acceptList);
369 }
370
371 function NativeObjectObserve(object, callback, acceptList) {
367 var objectInfo = ObjectInfoGetOrCreate(object); 372 var objectInfo = ObjectInfoGetOrCreate(object);
368 ObjectInfoAddObserver(objectInfo, callback, acceptList); 373 ObjectInfoAddObserver(objectInfo, callback, acceptList);
369 return object; 374 return object;
370 } 375 }
371 376
372 function ObjectUnobserve(object, callback) { 377 function ObjectUnobserve(object, callback) {
373 if (!IS_SPEC_OBJECT(object)) 378 if (!IS_SPEC_OBJECT(object))
374 throw MakeTypeError("observe_non_object", ["unobserve"]); 379 throw MakeTypeError("observe_non_object", ["unobserve"]);
375 if (%IsJSGlobalProxy(object)) 380 if (%IsJSGlobalProxy(object))
376 throw MakeTypeError("observe_global_proxy", ["unobserve"]); 381 throw MakeTypeError("observe_global_proxy", ["unobserve"]);
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 throw MakeTypeError("observe_type_non_string"); 525 throw MakeTypeError("observe_type_non_string");
521 526
522 ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord); 527 ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord);
523 } 528 }
524 529
525 function ObjectNotifierPerformChange(changeType, changeFn) { 530 function ObjectNotifierPerformChange(changeType, changeFn) {
526 if (!IS_SPEC_OBJECT(this)) 531 if (!IS_SPEC_OBJECT(this))
527 throw MakeTypeError("called_on_non_object", ["performChange"]); 532 throw MakeTypeError("called_on_non_object", ["performChange"]);
528 533
529 var objectInfo = ObjectInfoGetFromNotifier(this); 534 var objectInfo = ObjectInfoGetFromNotifier(this);
530
531 if (IS_UNDEFINED(objectInfo)) 535 if (IS_UNDEFINED(objectInfo))
532 throw MakeTypeError("observe_notify_non_notifier"); 536 throw MakeTypeError("observe_notify_non_notifier");
533 if (!IS_STRING(changeType)) 537 if (!IS_STRING(changeType))
534 throw MakeTypeError("observe_perform_non_string"); 538 throw MakeTypeError("observe_perform_non_string");
535 if (!IS_SPEC_FUNCTION(changeFn)) 539 if (!IS_SPEC_FUNCTION(changeFn))
536 throw MakeTypeError("observe_perform_non_function"); 540 throw MakeTypeError("observe_perform_non_function");
537 541
542 return %NativeObjectNotifierPerformChange(objectInfo, changeType, changeFn)
543 }
544
545 function NativeObjectNotifierPerformChange(objectInfo, changeType, changeFn) {
Jakob Kummerow 2014/05/02 19:31:37 Please avoid name clashes of JS builtins and runti
adamk 2014/05/02 20:09:13 Done, I've renamed the runtime functions to make t
538 ObjectInfoAddPerformingType(objectInfo, changeType); 546 ObjectInfoAddPerformingType(objectInfo, changeType);
539 547
540 var changeRecord; 548 var changeRecord;
541 try { 549 try {
542 changeRecord = %_CallFunction(UNDEFINED, changeFn); 550 changeRecord = %_CallFunction(UNDEFINED, changeFn);
543 } finally { 551 } finally {
544 ObjectInfoRemovePerformingType(objectInfo, changeType); 552 ObjectInfoRemovePerformingType(objectInfo, changeType);
545 } 553 }
546 554
547 if (IS_SPEC_OBJECT(changeRecord)) 555 if (IS_SPEC_OBJECT(changeRecord))
548 ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord, changeType); 556 ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord, changeType);
549 } 557 }
550 558
551 function ObjectGetNotifier(object) { 559 function ObjectGetNotifier(object) {
552 if (!IS_SPEC_OBJECT(object)) 560 if (!IS_SPEC_OBJECT(object))
553 throw MakeTypeError("observe_non_object", ["getNotifier"]); 561 throw MakeTypeError("observe_non_object", ["getNotifier"]);
554 if (%IsJSGlobalProxy(object)) 562 if (%IsJSGlobalProxy(object))
555 throw MakeTypeError("observe_global_proxy", ["getNotifier"]); 563 throw MakeTypeError("observe_global_proxy", ["getNotifier"]);
556 564
557 if (ObjectIsFrozen(object)) return null; 565 if (ObjectIsFrozen(object)) return null;
558 566
559 if (!%ObjectWasCreatedInCurrentOrigin(object)) return null; 567 if (!%ObjectWasCreatedInCurrentOrigin(object)) return null;
560 568
569 return %NativeObjectGetNotifier(object);
570 }
571
572 function NativeObjectGetNotifier(object) {
561 var objectInfo = ObjectInfoGetOrCreate(object); 573 var objectInfo = ObjectInfoGetOrCreate(object);
562 return ObjectInfoGetNotifier(objectInfo); 574 return ObjectInfoGetNotifier(objectInfo);
563 } 575 }
564 576
565 function CallbackDeliverPending(callback) { 577 function CallbackDeliverPending(callback) {
566 var callbackInfo = GetCallbackInfoMap().get(callback); 578 var callbackInfo = GetCallbackInfoMap().get(callback);
567 if (IS_UNDEFINED(callbackInfo) || IS_NUMBER(callbackInfo)) 579 if (IS_UNDEFINED(callbackInfo) || IS_NUMBER(callbackInfo))
568 return false; 580 return false;
569 581
570 // Clear the pending change records from callback and return it to its 582 // Clear the pending change records from callback and return it to its
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 "observe", ArrayObserve, 625 "observe", ArrayObserve,
614 "unobserve", ArrayUnobserve 626 "unobserve", ArrayUnobserve
615 )); 627 ));
616 InstallFunctions(notifierPrototype, DONT_ENUM, $Array( 628 InstallFunctions(notifierPrototype, DONT_ENUM, $Array(
617 "notify", ObjectNotifierNotify, 629 "notify", ObjectNotifierNotify,
618 "performChange", ObjectNotifierPerformChange 630 "performChange", ObjectNotifierPerformChange
619 )); 631 ));
620 } 632 }
621 633
622 SetupObjectObserve(); 634 SetupObjectObserve();
OLDNEW
« no previous file with comments | « src/contexts.h ('k') | src/runtime.h » ('j') | src/runtime.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698