Index: runtime/vm/flow_graph_inliner.cc |
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc |
index 471c5118483b1c8f9ee30237a6e2ecad38d9dc90..c360c983e6727aec6420166e7b79d75fd2cf6433 100644 |
--- a/runtime/vm/flow_graph_inliner.cc |
+++ b/runtime/vm/flow_graph_inliner.cc |
@@ -2803,6 +2803,25 @@ static Definition* PrepareInlineStringIndexOp( |
call->env(), |
FlowGraph::kEffect); |
+ // For external strings: Load backing store. |
+ if (cid == kExternalOneByteStringCid) { |
+ str = new LoadUntaggedInstr(new Value(str), |
+ ExternalOneByteString::external_data_offset()); |
+ cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue); |
+ str = new LoadUntaggedInstr( |
+ new Value(str), |
+ RawExternalOneByteString::ExternalData::data_offset()); |
+ cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue); |
+ } else if (cid == kExternalTwoByteStringCid) { |
+ str = new LoadUntaggedInstr(new Value(str), |
+ ExternalTwoByteString::external_data_offset()); |
+ cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue); |
+ str = new LoadUntaggedInstr( |
+ new Value(str), |
+ RawExternalTwoByteString::ExternalData::data_offset()); |
+ cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue); |
+ } |
+ |
LoadIndexedInstr* load_indexed = new(Z) LoadIndexedInstr( |
new(Z) Value(str), |
new(Z) Value(index), |
@@ -2823,8 +2842,7 @@ static bool InlineStringBaseCharAt( |
intptr_t cid, |
TargetEntryInstr** entry, |
Definition** last) { |
- // TODO(johnmccutchan): Handle external strings in PrepareInlineStringIndexOp. |
- if (RawObject::IsExternalStringClassId(cid) || cid != kOneByteStringCid) { |
+ if ((cid != kOneByteStringCid) && (cid != kExternalOneByteStringCid)) { |
return false; |
} |
Definition* str = call->ArgumentAt(0); |
@@ -2836,8 +2854,8 @@ static bool InlineStringBaseCharAt( |
*last = PrepareInlineStringIndexOp(flow_graph, call, cid, str, index, *entry); |
- StringFromCharCodeInstr* char_at = new(Z) StringFromCharCodeInstr( |
- new(Z) Value(*last), cid); |
+ OneByteStringFromCharCodeInstr* char_at = |
+ new(Z) OneByteStringFromCharCodeInstr(new(Z) Value(*last)); |
flow_graph->AppendTo(*last, char_at, NULL, FlowGraph::kValue); |
*last = char_at; |
@@ -2852,11 +2870,6 @@ static bool InlineStringCodeUnitAt( |
intptr_t cid, |
TargetEntryInstr** entry, |
Definition** last) { |
- // TODO(johnmccutchan): Handle external strings in PrepareInlineStringIndexOp. |
- if (RawObject::IsExternalStringClassId(cid)) { |
- return false; |
- } |
- |
Definition* str = call->ArgumentAt(0); |
Definition* index = call->ArgumentAt(1); |
@@ -3097,7 +3110,10 @@ bool FlowGraphInliner::TryInlineRecognizedMethod(FlowGraph* flow_graph, |
receiver_cid, |
kTypedDataInt32x4ArrayCid, |
entry, last); |
- case MethodRecognizer::kStringBaseCodeUnitAt: |
+ case MethodRecognizer::kOneByteStringCodeUnitAt: |
+ case MethodRecognizer::kTwoByteStringCodeUnitAt: |
+ case MethodRecognizer::kExternalOneByteStringCodeUnitAt: |
+ case MethodRecognizer::kExternalTwoByteStringCodeUnitAt: |
return InlineStringCodeUnitAt( |
flow_graph, call, receiver_cid, entry, last); |
case MethodRecognizer::kStringBaseCharAt: |