| OLD | NEW |
| 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 var $observeNotifyChange; | 5 var $observeNotifyChange; |
| 6 var $observeEnqueueSpliceRecord; | 6 var $observeEnqueueSpliceRecord; |
| 7 var $observeBeginPerformSplice; | 7 var $observeBeginPerformSplice; |
| 8 var $observeEndPerformSplice; | 8 var $observeEndPerformSplice; |
| 9 var $observeNativeObjectObserve; | 9 var $observeNativeObjectObserve; |
| 10 var $observeNativeObjectGetNotifier; | 10 var $observeNativeObjectGetNotifier; |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 function ObjectInfoGetPerformingTypes(objectInfo) { | 308 function ObjectInfoGetPerformingTypes(objectInfo) { |
| 309 return objectInfo.performingCount > 0 ? objectInfo.performing : null; | 309 return objectInfo.performingCount > 0 ? objectInfo.performing : null; |
| 310 } | 310 } |
| 311 | 311 |
| 312 | 312 |
| 313 function ConvertAcceptListToTypeMap(arg) { | 313 function ConvertAcceptListToTypeMap(arg) { |
| 314 // We use undefined as a sentinel for the default accept list. | 314 // We use undefined as a sentinel for the default accept list. |
| 315 if (IS_UNDEFINED(arg)) | 315 if (IS_UNDEFINED(arg)) |
| 316 return arg; | 316 return arg; |
| 317 | 317 |
| 318 if (!IS_SPEC_OBJECT(arg)) throw MakeTypeError(kObserveInvalidAccept); | 318 if (!IS_SPEC_OBJECT(arg)) |
| 319 throw MakeTypeError("observe_invalid_accept"); |
| 319 | 320 |
| 320 var len = ToInteger(arg.length); | 321 var len = ToInteger(arg.length); |
| 321 if (len < 0) len = 0; | 322 if (len < 0) len = 0; |
| 322 | 323 |
| 323 return TypeMapCreateFromList(arg, len); | 324 return TypeMapCreateFromList(arg, len); |
| 324 } | 325 } |
| 325 | 326 |
| 326 | 327 |
| 327 // CallbackInfo's optimized state is just a number which represents its global | 328 // CallbackInfo's optimized state is just a number which represents its global |
| 328 // priority. When a change record must be enqueued for the callback, it | 329 // priority. When a change record must be enqueued for the callback, it |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 callbackInfo = new InternalArray; | 365 callbackInfo = new InternalArray; |
| 365 callbackInfo.priority = priority; | 366 callbackInfo.priority = priority; |
| 366 CallbackInfoSet(callback, callbackInfo); | 367 CallbackInfoSet(callback, callbackInfo); |
| 367 } | 368 } |
| 368 return callbackInfo; | 369 return callbackInfo; |
| 369 } | 370 } |
| 370 | 371 |
| 371 | 372 |
| 372 function ObjectObserve(object, callback, acceptList) { | 373 function ObjectObserve(object, callback, acceptList) { |
| 373 if (!IS_SPEC_OBJECT(object)) | 374 if (!IS_SPEC_OBJECT(object)) |
| 374 throw MakeTypeError(kObserveNonObject, "observe", "observe"); | 375 throw MakeTypeError("observe_non_object", ["observe"]); |
| 375 if (%IsJSGlobalProxy(object)) | 376 if (%IsJSGlobalProxy(object)) |
| 376 throw MakeTypeError(kObserveGlobalProxy, "observe"); | 377 throw MakeTypeError("observe_global_proxy", ["observe"]); |
| 377 if (!IS_SPEC_FUNCTION(callback)) | 378 if (!IS_SPEC_FUNCTION(callback)) |
| 378 throw MakeTypeError(kObserveNonFunction, "observe"); | 379 throw MakeTypeError("observe_non_function", ["observe"]); |
| 379 if (ObjectIsFrozen(callback)) | 380 if (ObjectIsFrozen(callback)) |
| 380 throw MakeTypeError(kObserveCallbackFrozen); | 381 throw MakeTypeError("observe_callback_frozen"); |
| 381 | 382 |
| 382 var objectObserveFn = %GetObjectContextObjectObserve(object); | 383 var objectObserveFn = %GetObjectContextObjectObserve(object); |
| 383 return objectObserveFn(object, callback, acceptList); | 384 return objectObserveFn(object, callback, acceptList); |
| 384 } | 385 } |
| 385 | 386 |
| 386 | 387 |
| 387 function NativeObjectObserve(object, callback, acceptList) { | 388 function NativeObjectObserve(object, callback, acceptList) { |
| 388 var objectInfo = ObjectInfoGetOrCreate(object); | 389 var objectInfo = ObjectInfoGetOrCreate(object); |
| 389 var typeList = ConvertAcceptListToTypeMap(acceptList); | 390 var typeList = ConvertAcceptListToTypeMap(acceptList); |
| 390 ObjectInfoAddObserver(objectInfo, callback, typeList); | 391 ObjectInfoAddObserver(objectInfo, callback, typeList); |
| 391 return object; | 392 return object; |
| 392 } | 393 } |
| 393 | 394 |
| 394 | 395 |
| 395 function ObjectUnobserve(object, callback) { | 396 function ObjectUnobserve(object, callback) { |
| 396 if (!IS_SPEC_OBJECT(object)) | 397 if (!IS_SPEC_OBJECT(object)) |
| 397 throw MakeTypeError(kObserveNonObject, "unobserve", "unobserve"); | 398 throw MakeTypeError("observe_non_object", ["unobserve"]); |
| 398 if (%IsJSGlobalProxy(object)) | 399 if (%IsJSGlobalProxy(object)) |
| 399 throw MakeTypeError(kObserveGlobalProxy, "unobserve"); | 400 throw MakeTypeError("observe_global_proxy", ["unobserve"]); |
| 400 if (!IS_SPEC_FUNCTION(callback)) | 401 if (!IS_SPEC_FUNCTION(callback)) |
| 401 throw MakeTypeError(kObserveNonFunction, "unobserve"); | 402 throw MakeTypeError("observe_non_function", ["unobserve"]); |
| 402 | 403 |
| 403 var objectInfo = ObjectInfoGet(object); | 404 var objectInfo = ObjectInfoGet(object); |
| 404 if (IS_UNDEFINED(objectInfo)) | 405 if (IS_UNDEFINED(objectInfo)) |
| 405 return object; | 406 return object; |
| 406 | 407 |
| 407 ObjectInfoRemoveObserver(objectInfo, callback); | 408 ObjectInfoRemoveObserver(objectInfo, callback); |
| 408 return object; | 409 return object; |
| 409 } | 410 } |
| 410 | 411 |
| 411 | 412 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 ObjectInfoEnqueueInternalChangeRecord(objectInfo, changeRecord); | 551 ObjectInfoEnqueueInternalChangeRecord(objectInfo, changeRecord); |
| 551 } | 552 } |
| 552 | 553 |
| 553 | 554 |
| 554 function ObjectNotifierNotify(changeRecord) { | 555 function ObjectNotifierNotify(changeRecord) { |
| 555 if (!IS_SPEC_OBJECT(this)) | 556 if (!IS_SPEC_OBJECT(this)) |
| 556 throw MakeTypeError(kCalledOnNonObject, "notify"); | 557 throw MakeTypeError(kCalledOnNonObject, "notify"); |
| 557 | 558 |
| 558 var objectInfo = ObjectInfoGetFromNotifier(this); | 559 var objectInfo = ObjectInfoGetFromNotifier(this); |
| 559 if (IS_UNDEFINED(objectInfo)) | 560 if (IS_UNDEFINED(objectInfo)) |
| 560 throw MakeTypeError(kObserveNotifyNonNotifier); | 561 throw MakeTypeError("observe_notify_non_notifier"); |
| 561 if (!IS_STRING(changeRecord.type)) | 562 if (!IS_STRING(changeRecord.type)) |
| 562 throw MakeTypeError(kObserveTypeNonString); | 563 throw MakeTypeError("observe_type_non_string"); |
| 563 | 564 |
| 564 ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord); | 565 ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord); |
| 565 } | 566 } |
| 566 | 567 |
| 567 | 568 |
| 568 function ObjectNotifierPerformChange(changeType, changeFn) { | 569 function ObjectNotifierPerformChange(changeType, changeFn) { |
| 569 if (!IS_SPEC_OBJECT(this)) | 570 if (!IS_SPEC_OBJECT(this)) |
| 570 throw MakeTypeError(kCalledOnNonObject, "performChange"); | 571 throw MakeTypeError(kCalledOnNonObject, "performChange"); |
| 571 | 572 |
| 572 var objectInfo = ObjectInfoGetFromNotifier(this); | 573 var objectInfo = ObjectInfoGetFromNotifier(this); |
| 573 if (IS_UNDEFINED(objectInfo)) | 574 if (IS_UNDEFINED(objectInfo)) |
| 574 throw MakeTypeError(kObserveNotifyNonNotifier); | 575 throw MakeTypeError("observe_notify_non_notifier"); |
| 575 if (!IS_STRING(changeType)) | 576 if (!IS_STRING(changeType)) |
| 576 throw MakeTypeError(kObservePerformNonString); | 577 throw MakeTypeError("observe_perform_non_string"); |
| 577 if (!IS_SPEC_FUNCTION(changeFn)) | 578 if (!IS_SPEC_FUNCTION(changeFn)) |
| 578 throw MakeTypeError(kObservePerformNonFunction); | 579 throw MakeTypeError("observe_perform_non_function"); |
| 579 | 580 |
| 580 var performChangeFn = %GetObjectContextNotifierPerformChange(objectInfo); | 581 var performChangeFn = %GetObjectContextNotifierPerformChange(objectInfo); |
| 581 performChangeFn(objectInfo, changeType, changeFn); | 582 performChangeFn(objectInfo, changeType, changeFn); |
| 582 } | 583 } |
| 583 | 584 |
| 584 | 585 |
| 585 function NativeObjectNotifierPerformChange(objectInfo, changeType, changeFn) { | 586 function NativeObjectNotifierPerformChange(objectInfo, changeType, changeFn) { |
| 586 ObjectInfoAddPerformingType(objectInfo, changeType); | 587 ObjectInfoAddPerformingType(objectInfo, changeType); |
| 587 | 588 |
| 588 var changeRecord; | 589 var changeRecord; |
| 589 try { | 590 try { |
| 590 changeRecord = %_CallFunction(UNDEFINED, changeFn); | 591 changeRecord = %_CallFunction(UNDEFINED, changeFn); |
| 591 } finally { | 592 } finally { |
| 592 ObjectInfoRemovePerformingType(objectInfo, changeType); | 593 ObjectInfoRemovePerformingType(objectInfo, changeType); |
| 593 } | 594 } |
| 594 | 595 |
| 595 if (IS_SPEC_OBJECT(changeRecord)) | 596 if (IS_SPEC_OBJECT(changeRecord)) |
| 596 ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord, changeType); | 597 ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord, changeType); |
| 597 } | 598 } |
| 598 | 599 |
| 599 | 600 |
| 600 function ObjectGetNotifier(object) { | 601 function ObjectGetNotifier(object) { |
| 601 if (!IS_SPEC_OBJECT(object)) | 602 if (!IS_SPEC_OBJECT(object)) |
| 602 throw MakeTypeError(kObserveNonObject, "getNotifier", "getNotifier"); | 603 throw MakeTypeError("observe_non_object", ["getNotifier"]); |
| 603 if (%IsJSGlobalProxy(object)) | 604 if (%IsJSGlobalProxy(object)) |
| 604 throw MakeTypeError(kObserveGlobalProxy, "getNotifier"); | 605 throw MakeTypeError("observe_global_proxy", ["getNotifier"]); |
| 605 | 606 |
| 606 if (ObjectIsFrozen(object)) return null; | 607 if (ObjectIsFrozen(object)) return null; |
| 607 | 608 |
| 608 if (!%ObjectWasCreatedInCurrentOrigin(object)) return null; | 609 if (!%ObjectWasCreatedInCurrentOrigin(object)) return null; |
| 609 | 610 |
| 610 var getNotifierFn = %GetObjectContextObjectGetNotifier(object); | 611 var getNotifierFn = %GetObjectContextObjectGetNotifier(object); |
| 611 return getNotifierFn(object); | 612 return getNotifierFn(object); |
| 612 } | 613 } |
| 613 | 614 |
| 614 | 615 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 636 var delivered = []; | 637 var delivered = []; |
| 637 %MoveArrayContents(callbackInfo, delivered); | 638 %MoveArrayContents(callbackInfo, delivered); |
| 638 %DeliverObservationChangeRecords(callback, delivered); | 639 %DeliverObservationChangeRecords(callback, delivered); |
| 639 | 640 |
| 640 return true; | 641 return true; |
| 641 } | 642 } |
| 642 | 643 |
| 643 | 644 |
| 644 function ObjectDeliverChangeRecords(callback) { | 645 function ObjectDeliverChangeRecords(callback) { |
| 645 if (!IS_SPEC_FUNCTION(callback)) | 646 if (!IS_SPEC_FUNCTION(callback)) |
| 646 throw MakeTypeError(kObserveNonFunction, "deliverChangeRecords"); | 647 throw MakeTypeError("observe_non_function", ["deliverChangeRecords"]); |
| 647 | 648 |
| 648 while (CallbackDeliverPending(callback)) {} | 649 while (CallbackDeliverPending(callback)) {} |
| 649 } | 650 } |
| 650 | 651 |
| 651 | 652 |
| 652 function ObserveMicrotaskRunner() { | 653 function ObserveMicrotaskRunner() { |
| 653 var pendingObservers = GetPendingObservers(); | 654 var pendingObservers = GetPendingObservers(); |
| 654 if (!IS_NULL(pendingObservers)) { | 655 if (!IS_NULL(pendingObservers)) { |
| 655 SetPendingObservers(null); | 656 SetPendingObservers(null); |
| 656 for (var i in pendingObservers) { | 657 for (var i in pendingObservers) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 678 | 679 |
| 679 $observeNotifyChange = NotifyChange; | 680 $observeNotifyChange = NotifyChange; |
| 680 $observeEnqueueSpliceRecord = EnqueueSpliceRecord; | 681 $observeEnqueueSpliceRecord = EnqueueSpliceRecord; |
| 681 $observeBeginPerformSplice = BeginPerformSplice; | 682 $observeBeginPerformSplice = BeginPerformSplice; |
| 682 $observeEndPerformSplice = EndPerformSplice; | 683 $observeEndPerformSplice = EndPerformSplice; |
| 683 $observeNativeObjectObserve = NativeObjectObserve; | 684 $observeNativeObjectObserve = NativeObjectObserve; |
| 684 $observeNativeObjectGetNotifier = NativeObjectGetNotifier; | 685 $observeNativeObjectGetNotifier = NativeObjectGetNotifier; |
| 685 $observeNativeObjectNotifierPerformChange = NativeObjectNotifierPerformChange; | 686 $observeNativeObjectNotifierPerformChange = NativeObjectNotifierPerformChange; |
| 686 | 687 |
| 687 })(); | 688 })(); |
| OLD | NEW |