Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index 269736b76adff537077fa42792eb622b7bb50e9d..07bac67883858bf548c47bbf7b56972e4a441c3b 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -1745,6 +1745,63 @@ BUILTIN(SymbolConstructor_ConstructStub) { |
} |
+namespace { |
+ |
+// ES6 section 9.5.15 ProxyCreate (target, handler) |
+MaybeHandle<JSProxy> ProxyCreate(Isolate* isolate, Handle<Object> target, |
+ Handle<Object> handler) { |
+ if (!target->IsJSReceiver()) { |
+ THROW_NEW_ERROR( |
+ isolate, NewTypeError(MessageTemplate::kProxyTargetNonObject), JSProxy); |
+ } |
+ if (target->IsJSProxy() && JSProxy::cast(*target)->IsRevoked()) { |
+ THROW_NEW_ERROR(isolate, |
+ NewTypeError(MessageTemplate::kProxyHandlerOrTargetRevoked), |
+ JSProxy); |
+ } |
+ if (!handler->IsJSReceiver()) { |
+ THROW_NEW_ERROR(isolate, |
+ NewTypeError(MessageTemplate::kProxyHandlerNonObject), |
+ JSProxy); |
+ } |
+ if (handler->IsJSProxy() && JSProxy::cast(*handler)->IsRevoked()) { |
+ THROW_NEW_ERROR(isolate, |
+ NewTypeError(MessageTemplate::kProxyHandlerOrTargetRevoked), |
+ JSProxy); |
+ } |
+ return isolate->factory()->NewJSProxy(Handle<JSReceiver>::cast(target), |
+ Handle<JSReceiver>::cast(handler)); |
+} |
+ |
+} // namespace |
+ |
+ |
+// ES6 section 26.2.1.1 Proxy ( target, handler ) for the [[Call]] case. |
+BUILTIN(ProxyConstructor) { |
+ HandleScope scope(isolate); |
+ THROW_NEW_ERROR_RETURN_FAILURE( |
+ isolate, |
+ NewTypeError(MessageTemplate::kConstructorNotFunction, |
+ isolate->factory()->NewStringFromAsciiChecked("Proxy"))); |
+} |
+ |
+ |
+// ES6 section 26.2.1.1 Proxy ( target, handler ) for the [[Construct]] case. |
+BUILTIN(ProxyConstructor_ConstructStub) { |
+ HandleScope scope(isolate); |
+ DCHECK_EQ(3, args.length()); |
+ Handle<Object> target = args.at<Object>(1); |
+ Handle<Object> handler = args.at<Object>(2); |
+ // The ConstructStub is executed in the context of the caller, so we need |
+ // to enter the callee context first before raising an exception. |
+ isolate->set_context(args.target()->context()); |
+ Handle<JSProxy> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
+ ProxyCreate(isolate, target, handler)); |
+ return *result; |
+} |
+ |
+ |
// ----------------------------------------------------------------------------- |
// Throwers for restricted function properties and strict arguments object |
// properties |