Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 23f2eb39de9201ee53c46f996bfe5e3621d8af3d..720af0864a1fd19fa788bf929eede2685d602f27 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -241,21 +241,28 @@ bool FunctionTemplateInfo::IsTemplateFor(Map* map) { |
// TODO(dcarney): CallOptimization duplicates this logic, merge. |
-Object* FunctionTemplateInfo::GetCompatibleReceiver(Isolate* isolate, |
- Object* receiver) { |
+Handle<Object> FunctionTemplateInfo::GetCompatibleReceiver( |
+ Isolate* isolate, Handle<Object> receiver, bool is_construct) { |
// API calls are only supported with JSObject receivers. |
- if (!receiver->IsJSObject()) return isolate->heap()->null_value(); |
+ if (!receiver->IsJSObject()) return isolate->factory()->null_value(); |
+ auto js_receiver = Handle<JSObject>::cast(receiver); |
+ if (!is_construct && js_receiver->IsAccessCheckNeeded() && |
+ !isolate->MayAccess(js_receiver)) { |
Toon Verwaest
2015/03/25 15:28:24
This isn't good enough, as the IC you'll compile i
|
+ return isolate->factory()->null_value(); |
+ } |
Object* recv_type = this->signature(); |
// No signature, return holder. |
if (recv_type->IsUndefined()) return receiver; |
FunctionTemplateInfo* signature = FunctionTemplateInfo::cast(recv_type); |
// Check the receiver. |
- for (PrototypeIterator iter(isolate, receiver, |
+ for (PrototypeIterator iter(isolate, *receiver, |
PrototypeIterator::START_AT_RECEIVER); |
!iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN); iter.Advance()) { |
- if (signature->IsTemplateFor(iter.GetCurrent())) return iter.GetCurrent(); |
+ if (signature->IsTemplateFor(iter.GetCurrent())) { |
+ return Handle<Object>(iter.GetCurrent(), isolate); |
+ } |
} |
- return isolate->heap()->null_value(); |
+ return isolate->factory()->null_value(); |
} |