| 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 (function(global, utils) { | 5 (function(global, utils) { | 
| 6 | 6 | 
| 7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); | 
| 8 | 8 | 
| 9 // ---------------------------------------------------------------------------- | 9 // ---------------------------------------------------------------------------- | 
| 10 // Imports | 10 // Imports | 
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 211   return %IsPropertyEnumerable(TO_OBJECT(this), P); | 211   return %IsPropertyEnumerable(TO_OBJECT(this), P); | 
| 212 } | 212 } | 
| 213 | 213 | 
| 214 | 214 | 
| 215 // Extensions for providing property getters and setters. | 215 // Extensions for providing property getters and setters. | 
| 216 function ObjectDefineGetter(name, fun) { | 216 function ObjectDefineGetter(name, fun) { | 
| 217   var receiver = this; | 217   var receiver = this; | 
| 218   if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 218   if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 
| 219     receiver = %GlobalProxy(ObjectDefineGetter); | 219     receiver = %GlobalProxy(ObjectDefineGetter); | 
| 220   } | 220   } | 
| 221   if (!IS_SPEC_FUNCTION(fun)) { | 221   if (!IS_CALLABLE(fun)) { | 
| 222     throw MakeTypeError(kObjectGetterExpectingFunction); | 222     throw MakeTypeError(kObjectGetterExpectingFunction); | 
| 223   } | 223   } | 
| 224   var desc = new PropertyDescriptor(); | 224   var desc = new PropertyDescriptor(); | 
| 225   desc.setGet(fun); | 225   desc.setGet(fun); | 
| 226   desc.setEnumerable(true); | 226   desc.setEnumerable(true); | 
| 227   desc.setConfigurable(true); | 227   desc.setConfigurable(true); | 
| 228   DefineOwnProperty(TO_OBJECT(receiver), $toName(name), desc, false); | 228   DefineOwnProperty(TO_OBJECT(receiver), $toName(name), desc, false); | 
| 229 } | 229 } | 
| 230 | 230 | 
| 231 | 231 | 
| 232 function ObjectLookupGetter(name) { | 232 function ObjectLookupGetter(name) { | 
| 233   var receiver = this; | 233   var receiver = this; | 
| 234   if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 234   if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 
| 235     receiver = %GlobalProxy(ObjectLookupGetter); | 235     receiver = %GlobalProxy(ObjectLookupGetter); | 
| 236   } | 236   } | 
| 237   return %LookupAccessor(TO_OBJECT(receiver), $toName(name), GETTER); | 237   return %LookupAccessor(TO_OBJECT(receiver), $toName(name), GETTER); | 
| 238 } | 238 } | 
| 239 | 239 | 
| 240 | 240 | 
| 241 function ObjectDefineSetter(name, fun) { | 241 function ObjectDefineSetter(name, fun) { | 
| 242   var receiver = this; | 242   var receiver = this; | 
| 243   if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 243   if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 
| 244     receiver = %GlobalProxy(ObjectDefineSetter); | 244     receiver = %GlobalProxy(ObjectDefineSetter); | 
| 245   } | 245   } | 
| 246   if (!IS_SPEC_FUNCTION(fun)) { | 246   if (!IS_CALLABLE(fun)) { | 
| 247     throw MakeTypeError(kObjectSetterExpectingFunction); | 247     throw MakeTypeError(kObjectSetterExpectingFunction); | 
| 248   } | 248   } | 
| 249   var desc = new PropertyDescriptor(); | 249   var desc = new PropertyDescriptor(); | 
| 250   desc.setSet(fun); | 250   desc.setSet(fun); | 
| 251   desc.setEnumerable(true); | 251   desc.setEnumerable(true); | 
| 252   desc.setConfigurable(true); | 252   desc.setConfigurable(true); | 
| 253   DefineOwnProperty(TO_OBJECT(receiver), $toName(name), desc, false); | 253   DefineOwnProperty(TO_OBJECT(receiver), $toName(name), desc, false); | 
| 254 } | 254 } | 
| 255 | 255 | 
| 256 | 256 | 
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 362   if ("value" in obj) { | 362   if ("value" in obj) { | 
| 363     desc.setValue(obj.value); | 363     desc.setValue(obj.value); | 
| 364   } | 364   } | 
| 365 | 365 | 
| 366   if ("writable" in obj) { | 366   if ("writable" in obj) { | 
| 367     desc.setWritable(ToBoolean(obj.writable)); | 367     desc.setWritable(ToBoolean(obj.writable)); | 
| 368   } | 368   } | 
| 369 | 369 | 
| 370   if ("get" in obj) { | 370   if ("get" in obj) { | 
| 371     var get = obj.get; | 371     var get = obj.get; | 
| 372     if (!IS_UNDEFINED(get) && !IS_SPEC_FUNCTION(get)) { | 372     if (!IS_UNDEFINED(get) && !IS_CALLABLE(get)) { | 
| 373       throw MakeTypeError(kObjectGetterCallable, get); | 373       throw MakeTypeError(kObjectGetterCallable, get); | 
| 374     } | 374     } | 
| 375     desc.setGet(get); | 375     desc.setGet(get); | 
| 376   } | 376   } | 
| 377 | 377 | 
| 378   if ("set" in obj) { | 378   if ("set" in obj) { | 
| 379     var set = obj.set; | 379     var set = obj.set; | 
| 380     if (!IS_UNDEFINED(set) && !IS_SPEC_FUNCTION(set)) { | 380     if (!IS_UNDEFINED(set) && !IS_CALLABLE(set)) { | 
| 381       throw MakeTypeError(kObjectSetterCallable, set); | 381       throw MakeTypeError(kObjectSetterCallable, set); | 
| 382     } | 382     } | 
| 383     desc.setSet(set); | 383     desc.setSet(set); | 
| 384   } | 384   } | 
| 385 | 385 | 
| 386   if (IsInconsistentDescriptor(desc)) { | 386   if (IsInconsistentDescriptor(desc)) { | 
| 387     throw MakeTypeError(kValueAndAccessor, obj); | 387     throw MakeTypeError(kValueAndAccessor, obj); | 
| 388   } | 388   } | 
| 389   return desc; | 389   return desc; | 
| 390 } | 390 } | 
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 530 | 530 | 
| 531 | 531 | 
| 532 // For Harmony proxies. | 532 // For Harmony proxies. | 
| 533 function GetTrap(handler, name, defaultTrap) { | 533 function GetTrap(handler, name, defaultTrap) { | 
| 534   var trap = handler[name]; | 534   var trap = handler[name]; | 
| 535   if (IS_UNDEFINED(trap)) { | 535   if (IS_UNDEFINED(trap)) { | 
| 536     if (IS_UNDEFINED(defaultTrap)) { | 536     if (IS_UNDEFINED(defaultTrap)) { | 
| 537       throw MakeTypeError(kProxyHandlerTrapMissing, handler, name); | 537       throw MakeTypeError(kProxyHandlerTrapMissing, handler, name); | 
| 538     } | 538     } | 
| 539     trap = defaultTrap; | 539     trap = defaultTrap; | 
| 540   } else if (!IS_SPEC_FUNCTION(trap)) { | 540   } else if (!IS_CALLABLE(trap)) { | 
| 541     throw MakeTypeError(kProxyHandlerTrapMustBeCallable, handler, name); | 541     throw MakeTypeError(kProxyHandlerTrapMustBeCallable, handler, name); | 
| 542   } | 542   } | 
| 543   return trap; | 543   return trap; | 
| 544 } | 544 } | 
| 545 | 545 | 
| 546 | 546 | 
| 547 function CallTrap0(handler, name, defaultTrap) { | 547 function CallTrap0(handler, name, defaultTrap) { | 
| 548   return %_CallFunction(handler, GetTrap(handler, name, defaultTrap)); | 548   return %_CallFunction(handler, GetTrap(handler, name, defaultTrap)); | 
| 549 } | 549 } | 
| 550 | 550 | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 599   } else { | 599   } else { | 
| 600     return; | 600     return; | 
| 601   } | 601   } | 
| 602 } | 602 } | 
| 603 | 603 | 
| 604 | 604 | 
| 605 // ES6, draft 12-24-14, section 7.3.8 | 605 // ES6, draft 12-24-14, section 7.3.8 | 
| 606 function GetMethod(obj, p) { | 606 function GetMethod(obj, p) { | 
| 607   var func = obj[p]; | 607   var func = obj[p]; | 
| 608   if (IS_NULL_OR_UNDEFINED(func)) return UNDEFINED; | 608   if (IS_NULL_OR_UNDEFINED(func)) return UNDEFINED; | 
| 609   if (IS_SPEC_FUNCTION(func)) return func; | 609   if (IS_CALLABLE(func)) return func; | 
| 610   throw MakeTypeError(kCalledNonCallable, typeof func); | 610   throw MakeTypeError(kCalledNonCallable, typeof func); | 
| 611 } | 611 } | 
| 612 | 612 | 
| 613 | 613 | 
| 614 // Harmony proxies. | 614 // Harmony proxies. | 
| 615 function DefineProxyProperty(obj, p, attributes, should_throw) { | 615 function DefineProxyProperty(obj, p, attributes, should_throw) { | 
| 616   // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 616   // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 
| 617   if (IS_SYMBOL(p)) return false; | 617   if (IS_SYMBOL(p)) return false; | 
| 618 | 618 | 
| 619   var handler = %GetHandler(obj); | 619   var handler = %GetHandler(obj); | 
| (...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1652 } | 1652 } | 
| 1653 | 1653 | 
| 1654 | 1654 | 
| 1655 function FunctionToString() { | 1655 function FunctionToString() { | 
| 1656   return FunctionSourceString(this); | 1656   return FunctionSourceString(this); | 
| 1657 } | 1657 } | 
| 1658 | 1658 | 
| 1659 | 1659 | 
| 1660 // ES5 15.3.4.5 | 1660 // ES5 15.3.4.5 | 
| 1661 function FunctionBind(this_arg) { // Length is 1. | 1661 function FunctionBind(this_arg) { // Length is 1. | 
| 1662   if (!IS_SPEC_FUNCTION(this)) throw MakeTypeError(kFunctionBind); | 1662   if (!IS_CALLABLE(this)) throw MakeTypeError(kFunctionBind); | 
| 1663 | 1663 | 
| 1664   var boundFunction = function () { | 1664   var boundFunction = function () { | 
| 1665     // Poison .arguments and .caller, but is otherwise not detectable. | 1665     // Poison .arguments and .caller, but is otherwise not detectable. | 
| 1666     "use strict"; | 1666     "use strict"; | 
| 1667     // This function must not use any object literals (Object, Array, RegExp), | 1667     // This function must not use any object literals (Object, Array, RegExp), | 
| 1668     // since the literals-array is being used to store the bound data. | 1668     // since the literals-array is being used to store the bound data. | 
| 1669     if (%_IsConstructCall()) { | 1669     if (%_IsConstructCall()) { | 
| 1670       return %NewObjectFromBound(boundFunction); | 1670       return %NewObjectFromBound(boundFunction); | 
| 1671     } | 1671     } | 
| 1672     var bindings = %BoundFunctionGetBindings(boundFunction); | 1672     var bindings = %BoundFunctionGetBindings(boundFunction); | 
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1768 | 1768 | 
| 1769 // ---------------------------------------------------------------------------- | 1769 // ---------------------------------------------------------------------------- | 
| 1770 // Iterator related spec functions. | 1770 // Iterator related spec functions. | 
| 1771 | 1771 | 
| 1772 // ES6 rev 33, 2015-02-12 | 1772 // ES6 rev 33, 2015-02-12 | 
| 1773 // 7.4.1 GetIterator ( obj, method ) | 1773 // 7.4.1 GetIterator ( obj, method ) | 
| 1774 function GetIterator(obj, method) { | 1774 function GetIterator(obj, method) { | 
| 1775   if (IS_UNDEFINED(method)) { | 1775   if (IS_UNDEFINED(method)) { | 
| 1776     method = obj[symbolIterator]; | 1776     method = obj[symbolIterator]; | 
| 1777   } | 1777   } | 
| 1778   if (!IS_SPEC_FUNCTION(method)) { | 1778   if (!IS_CALLABLE(method)) { | 
| 1779     throw MakeTypeError(kNotIterable, obj); | 1779     throw MakeTypeError(kNotIterable, obj); | 
| 1780   } | 1780   } | 
| 1781   var iterator = %_CallFunction(obj, method); | 1781   var iterator = %_CallFunction(obj, method); | 
| 1782   if (!IS_SPEC_OBJECT(iterator)) { | 1782   if (!IS_SPEC_OBJECT(iterator)) { | 
| 1783     throw MakeTypeError(kNotAnIterator, iterator); | 1783     throw MakeTypeError(kNotAnIterator, iterator); | 
| 1784   } | 1784   } | 
| 1785   return iterator; | 1785   return iterator; | 
| 1786 } | 1786 } | 
| 1787 | 1787 | 
| 1788 // ---------------------------------------------------------------------------- | 1788 // ---------------------------------------------------------------------------- | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 1810 }); | 1810 }); | 
| 1811 | 1811 | 
| 1812 %InstallToContext([ | 1812 %InstallToContext([ | 
| 1813   "global_eval_fun", GlobalEval, | 1813   "global_eval_fun", GlobalEval, | 
| 1814   "object_define_own_property", DefineOwnPropertyFromAPI, | 1814   "object_define_own_property", DefineOwnPropertyFromAPI, | 
| 1815   "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, | 1815   "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, | 
| 1816   "to_complete_property_descriptor", ToCompletePropertyDescriptor, | 1816   "to_complete_property_descriptor", ToCompletePropertyDescriptor, | 
| 1817 ]); | 1817 ]); | 
| 1818 | 1818 | 
| 1819 }) | 1819 }) | 
| OLD | NEW | 
|---|