| Index: src/object-observe.js
|
| diff --git a/src/object-observe.js b/src/object-observe.js
|
| index 532b0d25254c28dfee157e61da3e55c175861002..f4b1f539634a58f583265695ed59e92c72f26f51 100644
|
| --- a/src/object-observe.js
|
| +++ b/src/object-observe.js
|
| @@ -127,9 +127,9 @@ function TypeMapRemoveType(typeMap, type) {
|
| typeMap[type]--;
|
| }
|
|
|
| -function TypeMapCreateFromList(typeList) {
|
| +function TypeMapCreateFromList(typeList, length) {
|
| var typeMap = TypeMapCreate();
|
| - for (var i = 0; i < typeList.length; i++) {
|
| + for (var i = 0; i < length; i++) {
|
| TypeMapAddType(typeMap, typeList[i], true);
|
| }
|
| return typeMap;
|
| @@ -151,14 +151,17 @@ function TypeMapIsDisjointFrom(typeMap1, typeMap2) {
|
| return true;
|
| }
|
|
|
| -var defaultAcceptTypes = TypeMapCreateFromList([
|
| - 'add',
|
| - 'update',
|
| - 'delete',
|
| - 'setPrototype',
|
| - 'reconfigure',
|
| - 'preventExtensions'
|
| -]);
|
| +var defaultAcceptTypes = (function() {
|
| + var defaultTypes = [
|
| + 'add',
|
| + 'update',
|
| + 'delete',
|
| + 'setPrototype',
|
| + 'reconfigure',
|
| + 'preventExtensions'
|
| + ];
|
| + return TypeMapCreateFromList(defaultTypes, defaultTypes.length);
|
| +})();
|
|
|
| // An Observer is a registration to observe an object by a callback with
|
| // a given set of accept types. If the set of accept types is the default
|
| @@ -170,7 +173,7 @@ function ObserverCreate(callback, acceptList) {
|
| return callback;
|
| var observer = nullProtoObject();
|
| observer.callback = callback;
|
| - observer.accept = TypeMapCreateFromList(acceptList);
|
| + observer.accept = acceptList;
|
| return observer;
|
| }
|
|
|
| @@ -306,16 +309,18 @@ function ObjectInfoGetPerformingTypes(objectInfo) {
|
| return objectInfo.performingCount > 0 ? objectInfo.performing : null;
|
| }
|
|
|
| -function AcceptArgIsValid(arg) {
|
| +function ConvertAcceptListToTypeMap(arg) {
|
| + // We use undefined as a sentinel for the default accept list.
|
| if (IS_UNDEFINED(arg))
|
| - return true;
|
| + return arg;
|
|
|
| - if (!IS_SPEC_OBJECT(arg) ||
|
| - !IS_NUMBER(arg.length) ||
|
| - arg.length < 0)
|
| - return false;
|
| + if (!IS_SPEC_OBJECT(arg))
|
| + throw MakeTypeError("observe_accept_invalid");
|
|
|
| - return true;
|
| + var len = ToInteger(arg.length);
|
| + if (len < 0) len = 0;
|
| +
|
| + return TypeMapCreateFromList(arg, len);
|
| }
|
|
|
| // CallbackInfo's optimized state is just a number which represents its global
|
| @@ -362,15 +367,14 @@ function ObjectObserve(object, callback, acceptList) {
|
| throw MakeTypeError("observe_non_function", ["observe"]);
|
| if (ObjectIsFrozen(callback))
|
| throw MakeTypeError("observe_callback_frozen");
|
| - if (!AcceptArgIsValid(acceptList))
|
| - throw MakeTypeError("observe_accept_invalid");
|
|
|
| return %ObjectObserveInObjectContext(object, callback, acceptList);
|
| }
|
|
|
| function NativeObjectObserve(object, callback, acceptList) {
|
| var objectInfo = ObjectInfoGetOrCreate(object);
|
| - ObjectInfoAddObserver(objectInfo, callback, acceptList);
|
| + var typeList = ConvertAcceptListToTypeMap(acceptList);
|
| + ObjectInfoAddObserver(objectInfo, callback, typeList);
|
| return object;
|
| }
|
|
|
|
|