Commit 02c02fe5 authored by dcarney@chromium.org's avatar dcarney@chromium.org

Reland r18714 'Unify calling to GenerateFastApiCallBody before stubbing it'

TBR=verwaest@chromium.org

BUG=

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18762 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent ea0c68df
This diff is collapsed.
This diff is collapsed.
......@@ -1994,20 +1994,44 @@ CallOptimization::CallOptimization(Handle<JSFunction> function) {
}
int CallOptimization::GetPrototypeDepthOfExpectedType(
Handle<Map> CallOptimization::LookupHolderOfExpectedType(
Handle<JSObject> receiver,
Handle<JSObject> object,
Handle<JSObject> holder) const {
Handle<JSObject> holder,
HolderLookup* holder_lookup) const {
ASSERT(is_simple_api_call());
if (expected_receiver_type_.is_null()) return 0;
int depth = 0;
ASSERT_EQ(kHolderNotFound, *holder_lookup);
*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()));
}
// start looking for the holder
while (!object.is_identical_to(holder)) {
if (expected_receiver_type_->IsTemplateFor(object->map())) return depth;
object = Handle<JSObject>(JSObject::cast(object->GetPrototype()));
if (!object->map()->is_hidden_prototype()) return kInvalidProtoDepth;
++depth;
Handle<Map> object_map(object->map());
if (expected_receiver_type_->IsTemplateFor(*object_map)) {
return map_to_holder;
}
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;
return kInvalidProtoDepth;
*holder_lookup = kHolderNotFound;
return Handle<Map>::null();
}
......
......@@ -472,9 +472,6 @@ class StubCompiler BASE_EMBEDDED {
// register is only clobbered if it the same as the holder register. The
// function returns a register containing the holder - either object_reg or
// holder_reg.
// The function can optionally (when save_at_depth !=
// kInvalidProtoDepth) save the object at the given depth by moving
// it to [esp + kPointerSize].
Register CheckPrototypes(Handle<HeapType> type,
Register object_reg,
Handle<JSObject> holder,
......@@ -483,20 +480,6 @@ class StubCompiler BASE_EMBEDDED {
Register scratch2,
Handle<Name> name,
Label* miss,
PrototypeCheckType check = CHECK_ALL_MAPS) {
return CheckPrototypes(type, object_reg, holder, holder_reg, scratch1,
scratch2, name, kInvalidProtoDepth, miss, check);
}
Register CheckPrototypes(Handle<HeapType> 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);
void GenerateBooleanCheck(Register object, Label* miss);
......@@ -1028,10 +1011,19 @@ class CallOptimization BASE_EMBEDDED {
return api_call_info_;
}
// Returns the depth of the object having the expected type in the
// prototype chain between the two arguments.
int GetPrototypeDepthOfExpectedType(Handle<JSObject> object,
Handle<JSObject> holder) const;
enum HolderLookup {
kHolderNotFound,
kHolderIsReceiver,
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) {
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