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

Side by Side Diff: src/js/v8natives.js

Issue 1552473002: Revert of [runtime] Introduce dedicated JSBoundFunction to represent bound functions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@FunctionConstructor
Patch Set: Created 4 years, 11 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
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/json-stringifier.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1229 "parseInt", GlobalParseInt, 1229 "parseInt", GlobalParseInt,
1230 "parseFloat", GlobalParseFloat 1230 "parseFloat", GlobalParseFloat
1231 ]); 1231 ]);
1232 1232
1233 %SetForceInlineFlag(NumberIsNaN); 1233 %SetForceInlineFlag(NumberIsNaN);
1234 1234
1235 1235
1236 // ---------------------------------------------------------------------------- 1236 // ----------------------------------------------------------------------------
1237 // Function 1237 // Function
1238 1238
1239 // ES6 9.2.3.2 Function.prototype.bind(thisArg , ...args)
1240 function FunctionBind(this_arg) { // Length is 1.
1241 if (!IS_CALLABLE(this)) throw MakeTypeError(kFunctionBind);
1242
1243 var boundFunction = function () {
1244 // Poison .arguments and .caller, but is otherwise not detectable.
1245 "use strict";
1246 // This function must not use any object literals (Object, Array, RegExp),
1247 // since the literals-array is being used to store the bound data.
1248 if (!IS_UNDEFINED(new.target)) {
1249 return %NewObjectFromBound(boundFunction);
1250 }
1251 var bindings = %BoundFunctionGetBindings(boundFunction);
1252
1253 var argc = %_ArgumentsLength();
1254 if (argc == 0) {
1255 return %Apply(bindings[0], bindings[1], bindings, 2, bindings.length - 2);
1256 }
1257 if (bindings.length === 2) {
1258 return %Apply(bindings[0], bindings[1], arguments, 0, argc);
1259 }
1260 var bound_argc = bindings.length - 2;
1261 var argv = new InternalArray(bound_argc + argc);
1262 for (var i = 0; i < bound_argc; i++) {
1263 argv[i] = bindings[i + 2];
1264 }
1265 for (var j = 0; j < argc; j++) {
1266 argv[i++] = %_Arguments(j);
1267 }
1268 return %Apply(bindings[0], bindings[1], argv, 0, bound_argc + argc);
1269 };
1270
1271 var proto = %_GetPrototype(this); // in ES6 9.4.1.3 BoundFunctionCreate
1272
1273 var new_length = 0;
1274 if (ObjectGetOwnPropertyDescriptor(this, "length") !== UNDEFINED) {
1275 var old_length = this.length;
1276 if (IS_NUMBER(old_length)) {
1277 var argc = %_ArgumentsLength();
1278 if (argc > 0) argc--; // Don't count the thisArg as parameter.
1279 new_length = TO_INTEGER(old_length) - argc;
1280 if (new_length < 0) new_length = 0;
1281 }
1282 }
1283
1284 // This runtime function finds any remaining arguments on the stack,
1285 // so we don't pass the arguments object.
1286 var result = %FunctionBindArguments(boundFunction, this, this_arg,
1287 new_length, proto);
1288
1289 var name = this.name;
1290 var bound_name = IS_STRING(name) ? name : "";
1291 %DefineDataPropertyUnchecked(result, "name", "bound " + bound_name,
1292 DONT_ENUM | READ_ONLY);
1293
1294 // We already have caller and arguments properties on functions,
1295 // which are non-configurable. It therefore makes no sence to
1296 // try to redefine these as defined by the spec. The spec says
1297 // that bind should make these throw a TypeError if get or set
1298 // is called and make them non-enumerable and non-configurable.
1299 // To be consistent with our normal functions we leave this as it is.
1300 // TODO(lrn): Do set these to be thrower.
1301 return result;
1302 }
1303
1304
1239 // ---------------------------------------------------------------------------- 1305 // ----------------------------------------------------------------------------
1240 1306
1241 %AddNamedProperty(GlobalFunction.prototype, "constructor", GlobalFunction, 1307 %AddNamedProperty(GlobalFunction.prototype, "constructor", GlobalFunction,
1242 DONT_ENUM); 1308 DONT_ENUM);
1243 1309
1310 utils.InstallFunctions(GlobalFunction.prototype, DONT_ENUM, [
1311 "bind", FunctionBind,
1312 ]);
1313
1244 // ---------------------------------------------------------------------------- 1314 // ----------------------------------------------------------------------------
1245 // Iterator related spec functions. 1315 // Iterator related spec functions.
1246 1316
1247 // ES6 7.4.1 GetIterator(obj, method) 1317 // ES6 7.4.1 GetIterator(obj, method)
1248 function GetIterator(obj, method) { 1318 function GetIterator(obj, method) {
1249 if (IS_UNDEFINED(method)) { 1319 if (IS_UNDEFINED(method)) {
1250 method = obj[iteratorSymbol]; 1320 method = obj[iteratorSymbol];
1251 } 1321 }
1252 if (!IS_CALLABLE(method)) { 1322 if (!IS_CALLABLE(method)) {
1253 throw MakeTypeError(kNotIterable, obj); 1323 throw MakeTypeError(kNotIterable, obj);
(...skipping 21 matching lines...) Expand all
1275 to.ObjectIsFrozen = ObjectIsFrozen; 1345 to.ObjectIsFrozen = ObjectIsFrozen;
1276 to.ObjectIsSealed = ObjectIsSealed; 1346 to.ObjectIsSealed = ObjectIsSealed;
1277 to.ObjectKeys = ObjectKeys; 1347 to.ObjectKeys = ObjectKeys;
1278 }); 1348 });
1279 1349
1280 %InstallToContext([ 1350 %InstallToContext([
1281 "object_value_of", ObjectValueOf, 1351 "object_value_of", ObjectValueOf,
1282 ]); 1352 ]);
1283 1353
1284 }) 1354 })
OLDNEW
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/json-stringifier.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698