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

Unified Diff: runtime/vm/opt_code_generator_ia32.cc

Issue 10581006: Replace class with class ids inside ICData (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 6 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
Index: runtime/vm/opt_code_generator_ia32.cc
===================================================================
--- runtime/vm/opt_code_generator_ia32.cc (revision 8832)
+++ runtime/vm/opt_code_generator_ia32.cc (working copy)
@@ -327,29 +327,20 @@
ASSERT(ic_data.num_args_tested() == 1);
Function& target = Function::Handle();
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- Class& cls = Class::ZoneHandle();
- ic_data.GetOneClassCheckAt(i, &cls, &target);
- result->Add(&cls);
+ intptr_t class_id;
+ ic_data.GetOneClassCheckAt(i, &class_id, &target);
+ result->Add(&Class::ZoneHandle(
+ Isolate::Current()->class_table()->At(class_id)));
}
return result;
}
-// Debugging helper function.
+// Debugging helper function. TODO(srdjan): Remove
void OptimizingCodeGenerator::PrintCollectedClasses(AstNode* node) {
const ICData& ic_data = node->ic_data();
OS::Print("Collected classes id %d num: %d\n",
node->id(), ic_data.NumberOfChecks());
- for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- Function& target = Function::Handle();
- GrowableArray<const Class*> classes;
- ic_data.GetCheckAt(i, &classes, &target);
- OS::Print("[");
- for (intptr_t c = 0; c < classes.length(); c++) {
- OS::Print("%s%s", (c > 0) ? ", " : "", classes[c]->ToCString());
- }
- OS::Print("] -> %s\n", target.ToFullyQualifiedCString());
- }
}
@@ -547,14 +538,14 @@
bool cls1_found = false;
bool cls2_found = false;
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- GrowableArray<const Class*> classes;
+ GrowableArray<intptr_t> class_ids;
Function& target = Function::Handle();
- ic_data.GetCheckAt(i, &classes, &target);
- if (!classes.is_empty()) {
- if (classes[0]->raw() == cls1.raw()) {
+ ic_data.GetCheckAt(i, &class_ids, &target);
+ if (!class_ids.is_empty()) {
+ if (class_ids[0] == cls1.id()) {
cls1_found = true;
}
- if (classes[0]->raw() == cls2.raw()) {
+ if (class_ids[0] == cls2.id()) {
cls2_found = true;
}
if (cls1_found && cls2_found) {
@@ -579,13 +570,13 @@
}
ASSERT(ic_data.num_args_tested() > arg_index);
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- GrowableArray<const Class*> classes;
+ GrowableArray<intptr_t> class_ids;
Function& target = Function::Handle();
- ic_data.GetCheckAt(i, &classes, &target);
- if (classes.is_empty()) {
+ ic_data.GetCheckAt(i, &class_ids, &target);
+ if (class_ids.is_empty()) {
return false;
}
- if (classes[arg_index]->raw() != cls.raw()) {
+ if (class_ids[arg_index] != cls.id()) {
return false;
}
}
@@ -606,9 +597,9 @@
return false;
}
Function& target = Function::Handle();
- GrowableArray<const Class*> classes;
- ic_data.GetCheckAt(0, &classes, &target);
- if ((cls0.raw() == classes[0]->raw()) && (cls1.raw() == classes[1]->raw())) {
+ GrowableArray<intptr_t> class_ids;
+ ic_data.GetCheckAt(0, &class_ids, &target);
+ if ((cls0.id() == class_ids[0]) && (cls1.id() == class_ids[1])) {
return true;
}
return false;
@@ -842,11 +833,10 @@
ASSERT(ic_data.num_args_tested() == 2);
ASSERT(ic_data.NumberOfChecks() > 0);
Function& target = Function::Handle();
- GrowableArray<const Class*> classes;
- ic_data.GetCheckAt(0, &classes, &target);
+ GrowableArray<intptr_t> class_ids;
+ ic_data.GetCheckAt(0, &class_ids, &target);
ASSERT(ic_data.NumberOfChecks() == 1);
- ASSERT((classes[0]->raw() == smi_class_.raw()) &&
- (classes[1]->raw() == smi_class_.raw()));
+ ASSERT((class_ids[0] == kSmi) && (class_ids[1] == kSmi));
CodeGenInfo left_info(node->left());
CodeGenInfo right_info(node->right());
VisitLoadTwo(node->left(), node->right(), EAX, EDX);
@@ -1413,22 +1403,24 @@
Function& target = Function::Handle();
Label load_field;
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- Class& cls = Class::Handle();
- ic_data.GetOneClassCheckAt(i, &cls, &target);
- __ cmpl(EAX, Immediate(cls.id()));
+ intptr_t class_id = -1;
Vyacheslav Egorov (Google) 2012/06/19 12:01:06 kIllegalObjectKind instead of -1?
srdjan 2012/06/19 15:19:16 Done.
+ ic_data.GetOneClassCheckAt(i, &class_id, &target);
+ __ cmpl(EAX, Immediate(class_id));
if (i == (ic_data.NumberOfChecks() - 1)) {
__ j(NOT_EQUAL, deopt_blob->label());
} else {
__ j(EQUAL, &load_field);
}
}
- Class& cls = Class::Handle();
- ic_data.GetOneClassCheckAt(0, &cls, &target);
+ intptr_t class_id = -1;
+ ic_data.GetOneClassCheckAt(0, &class_id, &target);
__ Bind(&load_field);
// EBX: receiver.
if (target.kind() == RawFunction::kImplicitGetter) {
TraceOpt(node, "Inlines instance getter with same target");
+ const Class& cls =
+ Class::Handle(Isolate::Current()->class_table()->At(class_id));
intptr_t field_offset = GetFieldOffset(cls, field_name);
ASSERT(field_offset >= 0);
__ movl(EAX, FieldAddress(EBX, field_offset));
@@ -1477,9 +1469,9 @@
static RawFunction* GetUniqueTarget(const ICData& ic_data) {
Function& prev_target = Function::Handle();
Function& target = Function::Handle();
- Class& cls = Class::Handle();
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- ic_data.GetOneClassCheckAt(i, &cls, &target);
+ intptr_t class_id;
+ ic_data.GetOneClassCheckAt(i, &class_id, &target);
ASSERT(!target.IsNull());
if (!prev_target.IsNull() && (prev_target.raw() != target.raw())) {
return Function::null();
@@ -1597,9 +1589,11 @@
ASSERT(ic_data.NumberOfChecks() > 0);
ASSERT(ic_data.num_args_tested() == 1);
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- Class& cls = Class::ZoneHandle();
Function& target = Function::ZoneHandle();
- ic_data.GetOneClassCheckAt(i, &cls, &target);
+ intptr_t class_id;
+ ic_data.GetOneClassCheckAt(i, &class_id, &target);
+ Class& cls =
+ Class::ZoneHandle(Isolate::Current()->class_table()->At(class_id));
classes.Add(&cls);
targets.Add(&target);
}
@@ -2524,13 +2518,11 @@
ASSERT(classes != NULL);
ASSERT(targets != NULL);
// Check if we can add Smi class in front.
- Class& smi_test_class = Class::Handle();
Function& smi_target = Function::ZoneHandle();
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- GrowableArray<const Class*> test_classes;
- ic_data.GetCheckAt(i, &test_classes, &smi_target);
- smi_test_class = test_classes[0]->raw();
- if (smi_test_class.raw() == smi_class_.raw()) {
+ GrowableArray<intptr_t> test_class_ids;
+ ic_data.GetCheckAt(i, &test_class_ids, &smi_target);
+ if (test_class_ids[0] == kSmi) {
classes->Add(&Class::ZoneHandle(smi_class_.raw()));
targets->Add(&Function::ZoneHandle(smi_target.raw()));
break;
@@ -2539,12 +2531,13 @@
// Add all classes except Smi.
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
Function& target = Function::ZoneHandle();
- Class& cls = Class::ZoneHandle();
- GrowableArray<const Class*> test_classes;
- ic_data.GetCheckAt(i, &test_classes, &target);
- cls = test_classes[0]->raw();
- ASSERT(!cls.IsNullClass());
- if (cls.raw() != smi_class_.raw()) {
+ GrowableArray<intptr_t> test_class_ids;
+ ic_data.GetCheckAt(i, &test_class_ids, &target);
+ ASSERT(test_class_ids[0] != kNullClassId);
+ if (test_class_ids[0] != kSmi) {
+ const Class& cls =
+ Class::Handle(Isolate::Current()->class_table()->At(
+ test_class_ids[0]));
ASSERT(!cls.IsNull());
ASSERT(!target.IsNull());
classes->Add(&cls);
« no previous file with comments | « runtime/vm/object_test.cc ('k') | runtime/vm/raw_object.h » ('j') | runtime/vm/stub_code_ia32.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698