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

Side by Side Diff: src/v8natives.js

Issue 1316933002: [es6] Initial steps towards a correct implementation of IsCallable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: ia32, arm and arm64 ports. Misc cleanups. Created 5 years, 3 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
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 (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
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
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
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
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
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
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
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 })
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698