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 |