Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Unified Diff: src/ast.cc

Issue 148223002: Remove CallICs (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Update test262 status file Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ast.h ('k') | src/code-stubs.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ast.cc
diff --git a/src/ast.cc b/src/ast.cc
index 9d8624ca1b179b239314388eab61e9d4a8062f74..1a9919b5aa52c0343d60cac4cffd4dcf2ee4d24e 100644
--- a/src/ast.cc
+++ b/src/ast.cc
@@ -138,7 +138,6 @@ Assignment::Assignment(Zone* zone,
binary_operation_(NULL),
assignment_id_(GetNextId(zone)),
is_uninitialized_(false),
- is_pre_monomorphic_(false),
store_mode_(STANDARD_STORE) { }
@@ -611,59 +610,6 @@ Call::CallType Call::GetCallType(Isolate* isolate) const {
}
-bool Call::ComputeTarget(Handle<Map> type, Handle<String> name) {
- // If there is an interceptor, we can't compute the target for a direct call.
- if (type->has_named_interceptor()) return false;
-
- if (check_type_ == RECEIVER_MAP_CHECK) {
- // For primitive checks the holder is set up to point to the corresponding
- // prototype object, i.e. one step of the algorithm below has been already
- // performed. For non-primitive checks we clear it to allow computing
- // targets for polymorphic calls.
- holder_ = Handle<JSObject>::null();
- }
- LookupResult lookup(type->GetIsolate());
- while (true) {
- // If a dictionary map is found in the prototype chain before the actual
- // target, a new target can always appear. In that case, bail out.
- // TODO(verwaest): Alternatively a runtime negative lookup on the normal
- // receiver or prototype could be added.
- if (type->is_dictionary_map()) return false;
- type->LookupDescriptor(NULL, *name, &lookup);
- if (lookup.IsFound()) {
- switch (lookup.type()) {
- case CONSTANT: {
- // We surely know the target for a constant function.
- Handle<Object> constant(lookup.GetConstantFromMap(*type),
- type->GetIsolate());
- if (constant->IsJSFunction()) {
- target_ = Handle<JSFunction>::cast(constant);
- return true;
- }
- // Fall through.
- }
- case NORMAL:
- case FIELD:
- case CALLBACKS:
- case HANDLER:
- case INTERCEPTOR:
- // We don't know the target.
- return false;
- case TRANSITION:
- case NONEXISTENT:
- UNREACHABLE();
- break;
- }
- }
- // If we reach the end of the prototype chain, we don't know the target.
- if (!type->prototype()->IsJSObject()) return false;
- // Go up the prototype chain, recording where we are currently.
- holder_ = Handle<JSObject>(JSObject::cast(type->prototype()));
- type = Handle<Map>(holder()->map());
- }
-}
-
-
bool Call::ComputeGlobalTarget(Handle<GlobalObject> global,
LookupResult* lookup) {
target_ = Handle<JSFunction>::null();
@@ -685,75 +631,6 @@ bool Call::ComputeGlobalTarget(Handle<GlobalObject> global,
}
-Handle<JSObject> Call::GetPrototypeForPrimitiveCheck(
- CheckType check, Isolate* isolate) {
- v8::internal::Context* native_context = isolate->context()->native_context();
- JSFunction* function = NULL;
- switch (check) {
- case RECEIVER_MAP_CHECK:
- UNREACHABLE();
- break;
- case STRING_CHECK:
- function = native_context->string_function();
- break;
- case SYMBOL_CHECK:
- function = native_context->symbol_function();
- break;
- case NUMBER_CHECK:
- function = native_context->number_function();
- break;
- case BOOLEAN_CHECK:
- function = native_context->boolean_function();
- break;
- }
- ASSERT(function != NULL);
- return Handle<JSObject>(JSObject::cast(function->instance_prototype()));
-}
-
-
-void Call::RecordTypeFeedback(TypeFeedbackOracle* oracle) {
- is_monomorphic_ = oracle->CallIsMonomorphic(CallFeedbackId());
- Property* property = expression()->AsProperty();
- if (property == NULL) {
- // Function call. Specialize for monomorphic calls.
- if (is_monomorphic_) target_ = oracle->GetCallTarget(CallFeedbackId());
- } else if (property->key()->IsPropertyName()) {
- // Method call. Specialize for the receiver types seen at runtime.
- Literal* key = property->key()->AsLiteral();
- ASSERT(key != NULL && key->value()->IsString());
- Handle<String> name = Handle<String>::cast(key->value());
- check_type_ = oracle->GetCallCheckType(CallFeedbackId());
- receiver_types_.Clear();
- if (check_type_ == RECEIVER_MAP_CHECK) {
- oracle->CallReceiverTypes(CallFeedbackId(),
- name, arguments()->length(), &receiver_types_);
- is_monomorphic_ = is_monomorphic_ && receiver_types_.length() > 0;
- } else {
- holder_ = GetPrototypeForPrimitiveCheck(check_type_, oracle->isolate());
- receiver_types_.Add(handle(holder_->map()), oracle->zone());
- }
-#ifdef ENABLE_SLOW_ASSERTS
- if (FLAG_enable_slow_asserts) {
- int length = receiver_types_.length();
- for (int i = 0; i < length; i++) {
- Handle<Map> map = receiver_types_.at(i);
- ASSERT(!map.is_null() && *map != NULL);
- }
- }
-#endif
- if (is_monomorphic_) {
- Handle<Map> map = receiver_types_.first();
- is_monomorphic_ = ComputeTarget(map, name);
- }
- } else {
- if (is_monomorphic_) {
- keyed_array_call_is_holey_ =
- oracle->KeyedArrayCallIsHoley(CallFeedbackId());
- }
- }
-}
-
-
void CallNew::RecordTypeFeedback(TypeFeedbackOracle* oracle) {
allocation_site_ =
oracle->GetCallNewAllocationSite(CallNewFeedbackId());
« no previous file with comments | « src/ast.h ('k') | src/code-stubs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698