// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #include "vm/regexp_assembler.h" #include "vm/flags.h" #include "vm/regexp.h" #include "vm/unibrow-inl.h" namespace dart { void PrintUtf16(uint16_t c) { const char* format = (0x20 <= c && c <= 0x7F) ? "%c" : (c <= 0xff) ? "\\x%02x" : "\\u%04x"; OS::PrintErr(format, c); } static RawBool* CaseInsensitiveCompareUC16(RawString* str_raw, RawSmi* lhs_index_raw, RawSmi* rhs_index_raw, RawSmi* length_raw) { const String& str = String::Handle(str_raw); const Smi& lhs_index = Smi::Handle(lhs_index_raw); const Smi& rhs_index = Smi::Handle(rhs_index_raw); const Smi& length = Smi::Handle(length_raw); // TODO(zerny): Optimize as single instance. V8 has this as an // isolate member. unibrow::Mapping canonicalize; for (intptr_t i = 0; i < length.Value(); i++) { int32_t c1 = str.CharAt(lhs_index.Value() + i); int32_t c2 = str.CharAt(rhs_index.Value() + i); if (c1 != c2) { int32_t s1[1] = {c1}; canonicalize.get(c1, '\0', s1); if (s1[0] != c2) { int32_t s2[1] = {c2}; canonicalize.get(c2, '\0', s2); if (s1[0] != s2[0]) { return Bool::False().raw(); } } } } return Bool::True().raw(); } DEFINE_RAW_LEAF_RUNTIME_ENTRY( CaseInsensitiveCompareUC16, 4, false /* is_float */, reinterpret_cast(&CaseInsensitiveCompareUC16)); BlockLabel::BlockLabel() : block_(NULL), is_bound_(false), is_linked_(false), pos_(-1) { #if !defined(DART_PRECOMPILED_RUNTIME) if (!FLAG_interpret_irregexp) { // Only needed by the compiled IR backend. block_ = new JoinEntryInstr(-1, -1, CompilerState::Current().GetNextDeoptId()); } #endif } RegExpMacroAssembler::RegExpMacroAssembler(Zone* zone) : slow_safe_compiler_(false), global_mode_(NOT_GLOBAL), zone_(zone) {} RegExpMacroAssembler::~RegExpMacroAssembler() {} } // namespace dart