Index: src/runtime.js |
diff --git a/src/runtime.js b/src/runtime.js |
index 4b600df7360b3431f9a3834937a022e35d1a4648..263384775abe95bd755f255e18e5c745f732ddd9 100644 |
--- a/src/runtime.js |
+++ b/src/runtime.js |
@@ -365,7 +365,7 @@ function IN(x) { |
// an expensive ToBoolean conversion in the generated code. |
function INSTANCE_OF(F) { |
var V = this; |
- if (!IS_FUNCTION(F)) { |
+ if (!IS_SPEC_FUNCTION(F)) { |
throw %MakeTypeError('instanceof_function_expected', [V]); |
} |
@@ -404,22 +404,41 @@ function FILTER_KEY(key) { |
function CALL_NON_FUNCTION() { |
var delegate = %GetFunctionDelegate(this); |
- if (!IS_FUNCTION(delegate)) { |
- throw %MakeTypeError('called_non_callable', [typeof this]); |
- } |
return delegate.apply(this, arguments); |
} |
function CALL_NON_FUNCTION_AS_CONSTRUCTOR() { |
var delegate = %GetConstructorDelegate(this); |
- if (!IS_FUNCTION(delegate)) { |
- throw %MakeTypeError('called_non_callable', [typeof this]); |
- } |
return delegate.apply(this, arguments); |
} |
+function CALL_FUNCTION_PROXY() { |
+ var arity = %_ArgumentsLength() - 1; |
+ var proxy = %_Arguments(arity); // The proxy comes in as an additional arg. |
+ var trap = %GetCallTrap(proxy); |
+ return %Apply(trap, this, arguments, 0, arity); |
+} |
+ |
+ |
+function CALL_FUNCTION_PROXY_AS_CONSTRUCTOR(proxy) { |
+ var arity = %_ArgumentsLength() - 1; |
+ var trap = %GetConstructTrap(proxy); |
+ var receiver = void 0; |
+ if (!IS_UNDEFINED(trap)) { |
+ trap = %GetCallTrap(proxy); |
+ var proto = proxy.prototype; |
+ if (!IS_SPEC_OBJECT(proto) && proto !== null) { |
+ throw MakeTypeError("proto_object_or_null", [proto]); |
+ } |
+ receiver = new global.Object(); |
+ receiver.__proto__ = proto; |
+ } |
+ return %Apply(trap, this, arguments, 1, arity); |
+} |
+ |
+ |
function APPLY_PREPARE(args) { |
var length; |
// First check whether length is a positive Smi and args is an |
@@ -427,7 +446,8 @@ function APPLY_PREPARE(args) { |
// that takes care of more eventualities. |
if (IS_ARRAY(args)) { |
length = args.length; |
- if (%_IsSmi(length) && length >= 0 && length < 0x800000 && IS_FUNCTION(this)) { |
+ if (%_IsSmi(length) && length >= 0 && length < 0x800000 && |
+ IS_SPEC_FUNCTION(this)) { |
return length; |
} |
} |
@@ -441,7 +461,7 @@ function APPLY_PREPARE(args) { |
throw %MakeRangeError('stack_overflow', []); |
} |
- if (!IS_FUNCTION(this)) { |
+ if (!IS_SPEC_FUNCTION(this)) { |
throw %MakeTypeError('apply_non_function', [ %ToString(this), typeof this ]); |
} |
@@ -609,13 +629,13 @@ function IsPrimitive(x) { |
// ECMA-262, section 8.6.2.6, page 28. |
function DefaultNumber(x) { |
var valueOf = x.valueOf; |
- if (IS_FUNCTION(valueOf)) { |
+ if (IS_SPEC_FUNCTION(valueOf)) { |
var v = %_CallFunction(x, valueOf); |
if (%IsPrimitive(v)) return v; |
} |
var toString = x.toString; |
- if (IS_FUNCTION(toString)) { |
+ if (IS_SPEC_FUNCTION(toString)) { |
var s = %_CallFunction(x, toString); |
if (%IsPrimitive(s)) return s; |
} |
@@ -627,13 +647,13 @@ function DefaultNumber(x) { |
// ECMA-262, section 8.6.2.6, page 28. |
function DefaultString(x) { |
var toString = x.toString; |
- if (IS_FUNCTION(toString)) { |
+ if (IS_SPEC_FUNCTION(toString)) { |
var s = %_CallFunction(x, toString); |
if (%IsPrimitive(s)) return s; |
} |
var valueOf = x.valueOf; |
- if (IS_FUNCTION(valueOf)) { |
+ if (IS_SPEC_FUNCTION(valueOf)) { |
var v = %_CallFunction(x, valueOf); |
if (%IsPrimitive(v)) return v; |
} |