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

Unified Diff: runtime/vm/regexp_assembler.cc

Issue 765743003: Support use of external strings as inputs to LoadCodeUnitsInstr. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month 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/regexp_assembler.cc
diff --git a/runtime/vm/regexp_assembler.cc b/runtime/vm/regexp_assembler.cc
index fa666ae3e55f77a89a0fefa3d1117b628693ded0..5784506aa7d52aabb89011b4fc28a0a7ff7db189 100644
--- a/runtime/vm/regexp_assembler.cc
+++ b/runtime/vm/regexp_assembler.cc
@@ -613,6 +613,32 @@ Value* IRRegExpMacroAssembler::BindLoadLocal(const LocalVariable& local) {
}
+Value* IRRegExpMacroAssembler::BindUntaggedExternalString(
+ const LocalVariable& str) {
+ Value* str_val = BindLoadLocal(str);
+ if (!RawObject::IsExternalStringClassId(specialization_cid_)) {
+ return str_val;
+ }
+ // The data of an external string is stored through two indirections.
+ intptr_t external_offset;
+ intptr_t data_offset;
+ if (specialization_cid_ == kExternalOneByteStringCid) {
+ external_offset = RawExternalOneByteString::data_offset();
+ data_offset = RawExternalOneByteString::ExternalData::data_offset();
+ } else if (specialization_cid_ == kExternalTwoByteStringCid) {
+ external_offset = RawExternalTwoByteString::data_offset();
+ data_offset = RawExternalTwoByteString::ExternalData::data_offset();
+ } else {
+ UNREACHABLE();
+ }
+ Value* external_val =
+ Bind(new(I) LoadUntaggedInstr(str_val, external_offset));
+ Value* data_val =
+ Bind(new(I) LoadUntaggedInstr(external_val, data_offset));
+ return data_val;
+}
+
+
// In some cases, the V8 irregexp engine generates unreachable code by emitting
// a jmp not followed by a bind. We cannot do the same, since it is impossible
// to append to a block following a jmp. In such cases, assume that we are doing
@@ -1766,7 +1792,7 @@ void IRRegExpMacroAssembler::LoadCurrentCharacterUnchecked(
}
// Bind the pattern as the load receiver.
- Value* pattern = BindLoadLocal(*string_param_);
+ Value* pattern = BindUntaggedExternalString(*string_param_);
// Calculate the addressed string index as:
// cp_offset + current_position_ + string_param_length_
@@ -1789,7 +1815,7 @@ void IRRegExpMacroAssembler::LoadCurrentCharacterUnchecked(
Value* IRRegExpMacroAssembler::CharacterAt(Definition* index) {
- Value* pattern_val = BindLoadLocal(*string_param_);
+ Value* pattern_val = BindUntaggedExternalString(*string_param_);
Value* index_val = Bind(index);
return LoadCodeUnitsAt(pattern_val, index_val, 1);
}

Powered by Google App Engine
This is Rietveld 408576698