Index: src/v8natives.js |
=================================================================== |
--- src/v8natives.js (revision 310) |
+++ src/v8natives.js (working copy) |
@@ -414,107 +414,3 @@ |
}; |
%SetCode($Function, NewFunction); |
- |
- |
-// NOTE: The following functions (call and apply) are only used in this |
-// form on the ARM platform. On IA-32 they are handled through specialized |
-// builtins; see builtins-ia32.cc. |
- |
-%AddProperty($Function.prototype, "call", function(receiver) { |
- // Make sure the receiver of this call is a function. If it isn't |
- // we "fake" a call of it (without the right arguments) to force |
- // an exception to be thrown. |
- if (!IS_FUNCTION(this)) this(); |
- |
- // If receiver is null or undefined set the receiver to the global |
- // object. If the receiver isn't an object, we convert the |
- // receiver to an object. |
- if (receiver == null) receiver = global; |
- else if (!IS_OBJECT(receiver)) receiver = ToObject(receiver); |
- |
- %_SetThisFunction(this); |
- %_SetThis(receiver); |
- |
- var len = %_GetArgumentsLength(1); |
- return %_ShiftDownAndTailCall(len ? len - 1 : 0); |
-}, DONT_ENUM); |
- |
- |
-// This implementation of Function.prototype.apply replaces the stack frame |
-// of the apply call with the new stack frame containing the arguments from |
-// the args array. |
-%AddProperty($Function.prototype, "apply", function(receiver, args) { |
- var length = (args == null) ? 0 : ToUint32(args.length); |
- |
- // We can handle any number of apply arguments if the stack is |
- // big enough, but sanity check the value to avoid overflow when |
- // multiplying with pointer size. |
- if (length > 0x800000) { |
- throw new $RangeError( |
- "Function.prototype.apply cannot support " + length + " arguments."); |
- } |
- |
- if (!IS_FUNCTION(this)) { |
- throw new $TypeError('Function.prototype.apply was called on ' + this.toString() + ', which is a ' + (typeof this) + ' and not a function'); |
- } |
- |
- // Make sure args has the right type. |
- if (args != null && %ClassOf(args) !== 'Array' && %ClassOf(args) !== 'Arguments') { |
- throw new $TypeError('Function.prototype.apply: args has wrong type'); |
- } |
- |
- // If receiver is null or undefined set the receiver to the global |
- // object. If the receiver isn't an object, we convert the |
- // receiver to an object. |
- if (receiver == null) receiver = global; |
- else if (!IS_OBJECT(receiver)) receiver = ToObject(receiver); |
- |
- %_SetThisFunction(this); |
- %_SetThis(receiver); |
- |
- var arguments_length = %_GetArgumentsLength(2); |
- |
- // This method has 2 formal arguments so if less are passed, then space has |
- // been made. |
- if (arguments_length < 2) |
- arguments_length = 2; |
- |
- // Move some stuff to locals so they don't get overwritten when we start |
- // expanding the args array. |
- var saved_args = args; |
- |
- if (arguments_length > length) { |
- // We have too many arguments - we need to squash the frame. |
- %_SquashFrame(arguments_length, length); |
- } else if (arguments_length != length) { |
- // We have too few spaces for arguments - we need to expand the frame. |
- if (!%_ExpandFrame(arguments_length, length)) { |
- throw new $RangeError( |
- "Function.prototype.apply cannot find stack space for " + length + " arguments."); |
- } |
- // GC doesn't like junk in the arguments! |
- for (var i = 0; i < length; i++) { |
- %_SetArgument(i, 0, length); |
- } |
- } |
- |
- // Update-number-of-arguments field to keep things looking consistent for |
- // stack traces, and uses of arguments or arguments.length. |
- %_SetArgumentsLength(length); |
- |
- // NOTE: For the fast case this should be implemented in assembler, |
- // which would allow us to omit bounds and class checks galore. The |
- // assembler version could fall back to this implementation if |
- // tricky stuff is found, like arrays implemented as dictionaries or |
- // holes in arrays. |
- for (var i = 0; i < length; i++) { |
- %_SetArgument(i, saved_args[i], length); |
- } |
- |
- // Replaces the current frame with the new call. This has the added effect |
- // of removing apply from the stack trace entirely, which matches the |
- // behaviour of Firefox. |
- return %_TailCallWithArguments(length); |
-}, DONT_ENUM); |
- |
- |