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

Unified Diff: runtime/vm/flow_graph_optimizer.cc

Issue 20755004: Make sure that ICData always contains valid data (non-null values). (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 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/flow_graph_optimizer.cc
===================================================================
--- runtime/vm/flow_graph_optimizer.cc (revision 25521)
+++ runtime/vm/flow_graph_optimizer.cc (working copy)
@@ -133,7 +133,7 @@
ICData& ic_data = ICData::ZoneHandle(ICData::New(
flow_graph_->parsed_function().function(),
call->function_name(),
- Object::null_array(), // Dummy argument descriptor.
+ Object::empty_array(), // Dummy argument descriptor.
call->deopt_id(),
class_ids.length()));
ic_data.AddReceiverCheck(class_ids[0], function);
@@ -155,7 +155,7 @@
const ICData& new_ic_data = ICData::ZoneHandle(ICData::New(
Function::Handle(ic_data.function()),
String::Handle(ic_data.target_name()),
- Object::null_array(), // Dummy argument descriptor.
+ Object::empty_array(), // Dummy argument descriptor.
ic_data.deopt_id(),
ic_data.num_args_tested()));
@@ -1912,32 +1912,23 @@
// ByteArray setters.
case MethodRecognizer::kByteArrayBaseSetInt8:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataInt8ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataInt8ArrayCid);
case MethodRecognizer::kByteArrayBaseSetUint8:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataUint8ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataUint8ArrayCid);
case MethodRecognizer::kByteArrayBaseSetInt16:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataInt16ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataInt16ArrayCid);
case MethodRecognizer::kByteArrayBaseSetUint16:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataUint16ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataUint16ArrayCid);
case MethodRecognizer::kByteArrayBaseSetInt32:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataInt32ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataInt32ArrayCid);
case MethodRecognizer::kByteArrayBaseSetUint32:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataUint32ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataUint32ArrayCid);
case MethodRecognizer::kByteArrayBaseSetFloat32:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataFloat32ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataFloat32ArrayCid);
case MethodRecognizer::kByteArrayBaseSetFloat64:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataFloat64ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataFloat64ArrayCid);
case MethodRecognizer::kByteArrayBaseSetFloat32x4:
- return BuildByteArrayViewStore(
- call, class_ids[0], kTypedDataFloat32x4ArrayCid);
+ return BuildByteArrayViewStore(call, kTypedDataFloat32x4ArrayCid);
default:
// Unsupported method.
return false;
@@ -2263,13 +2254,17 @@
}
-bool FlowGraphOptimizer::BuildByteArrayViewStore(
- InstanceCallInstr* call,
- intptr_t receiver_cid,
- intptr_t view_cid) {
+bool FlowGraphOptimizer::BuildByteArrayViewStore(InstanceCallInstr* call,
+ intptr_t view_cid) {
if ((view_cid == kTypedDataFloat32x4ArrayCid) && !ShouldInlineSimd()) {
return false;
}
+ ASSERT(call->HasICData());
+ Function& target = Function::Handle();
+ GrowableArray<intptr_t> class_ids;
+ call->ic_data()->GetCheckAt(0, &class_ids, &target);
+ const intptr_t receiver_cid = class_ids[0];
+
Definition* array = call->ArgumentAt(0);
PrepareByteArrayViewOp(call, receiver_cid, view_cid, &array);
ICData& value_check = ICData::ZoneHandle();
@@ -2282,12 +2277,12 @@
case kTypedDataInt16ArrayCid:
case kTypedDataUint16ArrayCid: {
// Check that value is always smi.
- value_check = ICData::New(Function::Handle(),
- Object::null_string(),
- Object::null_array(),
+ value_check = ICData::New(flow_graph_->parsed_function().function(),
+ call->function_name(),
+ Object::empty_array(), // Dummy args. descr.
Isolate::kNoDeoptId,
1);
- value_check.AddReceiverCheck(kSmiCid, Function::Handle());
+ value_check.AddReceiverCheck(kSmiCid, target);
break;
}
case kTypedDataInt32ArrayCid:
@@ -2296,33 +2291,33 @@
// smis first. If we ever deoptimized here, we require to unbox the value
// before storing to handle the mint case, too.
if (call->ic_data()->deopt_reason() == kDeoptUnknown) {
- value_check = ICData::New(Function::Handle(),
- Object::null_string(),
- Object::null_array(), // Dummy args. descr.
+ value_check = ICData::New(flow_graph_->parsed_function().function(),
+ call->function_name(),
+ Object::empty_array(), // Dummy args. descr.
Isolate::kNoDeoptId,
1);
- value_check.AddReceiverCheck(kSmiCid, Function::Handle());
+ value_check.AddReceiverCheck(kSmiCid, target);
}
break;
case kTypedDataFloat32ArrayCid:
case kTypedDataFloat64ArrayCid: {
// Check that value is always double.
- value_check = ICData::New(Function::Handle(),
- Object::null_string(),
- Object::null_array(), // Dummy args. descr.
+ value_check = ICData::New(flow_graph_->parsed_function().function(),
+ call->function_name(),
+ Object::empty_array(), // Dummy args. descr.
Isolate::kNoDeoptId,
1);
- value_check.AddReceiverCheck(kDoubleCid, Function::Handle());
+ value_check.AddReceiverCheck(kDoubleCid, target);
break;
}
case kTypedDataFloat32x4ArrayCid: {
// Check that value is always Float32x4.
- value_check = ICData::New(Function::Handle(),
- Object::null_string(),
- Object::null_array(), // Dummy args. descr.
+ value_check = ICData::New(flow_graph_->parsed_function().function(),
+ call->function_name(),
+ Object::empty_array(), // Dummy args. descr.
Isolate::kNoDeoptId,
1);
- value_check.AddReceiverCheck(kFloat32x4Cid, Function::Handle());
+ value_check.AddReceiverCheck(kFloat32x4Cid, target);
break;
}
default:
« no previous file with comments | « runtime/vm/flow_graph_optimizer.h ('k') | runtime/vm/object.h » ('j') | runtime/vm/object.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698