Commit 058c5c9f authored by dcarney@chromium.org's avatar dcarney@chromium.org

Unify calling to GenerateFastApiCallBody before stubbing it

R=verwaest@chromium.org

BUG=

Review URL: https://codereview.chromium.org/142973005

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18714 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 80195df5
This diff is collapsed.
This diff is collapsed.
...@@ -1994,20 +1994,45 @@ CallOptimization::CallOptimization(Handle<JSFunction> function) { ...@@ -1994,20 +1994,45 @@ CallOptimization::CallOptimization(Handle<JSFunction> function) {
} }
int CallOptimization::GetPrototypeDepthOfExpectedType( Handle<Map> CallOptimization::LookupHolderOfExpectedType(
Handle<JSObject> receiver,
Handle<JSObject> object, Handle<JSObject> object,
Handle<JSObject> holder) const { Handle<JSObject> holder,
HolderLookup* holder_lookup) const {
ASSERT(is_simple_api_call()); ASSERT(is_simple_api_call());
if (expected_receiver_type_.is_null()) return 0; ASSERT_EQ(kHolderNotFound, *holder_lookup);
int depth = 0; *holder_lookup = kHolderIsReceiver;
Handle<Map> map_to_holder;
if (expected_receiver_type_.is_null()) {
// no expected type, load from receiver.
return map_to_holder;
}
// walk down the prototype chain to the object
while (!receiver.is_identical_to(object)) {
*holder_lookup = kHolderIsPrototypeOfMap;
map_to_holder = Handle<Map>(receiver->map());
receiver = Handle<JSObject>(JSObject::cast(map_to_holder->prototype()));
ASSERT(!expected_receiver_type_->IsTemplateFor(*map_to_holder));
}
// start looking for the holder
while (!object.is_identical_to(holder)) { while (!object.is_identical_to(holder)) {
if (expected_receiver_type_->IsTemplateFor(object->map())) return depth; Handle<Map> object_map(object->map());
object = Handle<JSObject>(JSObject::cast(object->GetPrototype())); if (expected_receiver_type_->IsTemplateFor(*object_map)) {
if (!object->map()->is_hidden_prototype()) return kInvalidProtoDepth; return map_to_holder;
++depth; }
if (!object_map->is_hidden_prototype()) {
*holder_lookup = kHolderNotFound;
return Handle<Map>::null();
}
*holder_lookup = kHolderIsPrototypeOfMap;
map_to_holder = object_map;
object = Handle<JSObject>(JSObject::cast(object_map->prototype()));
}
if (expected_receiver_type_->IsTemplateFor(holder->map())) {
return map_to_holder;
} }
if (expected_receiver_type_->IsTemplateFor(holder->map())) return depth; *holder_lookup = kHolderNotFound;
return kInvalidProtoDepth; return Handle<Map>::null();
} }
......
...@@ -483,20 +483,6 @@ class StubCompiler BASE_EMBEDDED { ...@@ -483,20 +483,6 @@ class StubCompiler BASE_EMBEDDED {
Register scratch2, Register scratch2,
Handle<Name> name, Handle<Name> name,
Label* miss, Label* miss,
PrototypeCheckType check = CHECK_ALL_MAPS) {
return CheckPrototypes(type, object_reg, holder, holder_reg, scratch1,
scratch2, name, kInvalidProtoDepth, miss, check);
}
Register CheckPrototypes(Handle<Type> type,
Register object_reg,
Handle<JSObject> holder,
Register holder_reg,
Register scratch1,
Register scratch2,
Handle<Name> name,
int save_at_depth,
Label* miss,
PrototypeCheckType check = CHECK_ALL_MAPS); PrototypeCheckType check = CHECK_ALL_MAPS);
void GenerateBooleanCheck(Register object, Label* miss); void GenerateBooleanCheck(Register object, Label* miss);
...@@ -1028,10 +1014,19 @@ class CallOptimization BASE_EMBEDDED { ...@@ -1028,10 +1014,19 @@ class CallOptimization BASE_EMBEDDED {
return api_call_info_; return api_call_info_;
} }
// Returns the depth of the object having the expected type in the enum HolderLookup {
// prototype chain between the two arguments. kHolderNotFound,
int GetPrototypeDepthOfExpectedType(Handle<JSObject> object, kHolderIsReceiver,
Handle<JSObject> holder) const; kHolderIsPrototypeOfMap
};
// Returns a map whose prototype has the expected type in the
// prototype chain between the two arguments
// null will be returned if the first argument has that property
// lookup will be set accordingly
Handle<Map> LookupHolderOfExpectedType(Handle<JSObject> receiver,
Handle<JSObject> object,
Handle<JSObject> holder,
HolderLookup* holder_lookup) const;
bool IsCompatibleReceiver(Object* receiver) { bool IsCompatibleReceiver(Object* receiver) {
ASSERT(is_simple_api_call()); ASSERT(is_simple_api_call());
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment