| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 | 6 |
| 7 #include "vm/isolate.h" | 7 #include "vm/isolate.h" |
| 8 #include "vm/object.h" | 8 #include "vm/object.h" |
| 9 #include "vm/regexp.h" | 9 #include "vm/regexp.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 DECLARE_FLAG(bool, use_jscre); | 14 DECLARE_FLAG(bool, use_jscre); |
| 15 | 15 |
| 16 static RawArray* Match(const String& pat, const String& str) { | 16 static RawArray* Match(const String& pat, const String& str) { |
| 17 Zone* zone = Thread::Current()->zone(); | 17 Zone* zone = Thread::Current()->zone(); |
| 18 const JSRegExp& regexp = JSRegExp::Handle( | 18 const JSRegExp& regexp = JSRegExp::Handle( |
| 19 RegExpEngine::CreateJSRegExp(zone, pat, false, false)); | 19 RegExpEngine::CreateJSRegExp(zone, pat, false, false)); |
| 20 const intptr_t cid = str.GetClassId(); | 20 const intptr_t cid = str.GetClassId(); |
| 21 const Function& fn = Function::Handle(regexp.function(cid)); | 21 const Function& fn = Function::Handle(regexp.function(cid)); |
| 22 EXPECT(!fn.IsNull()); | 22 EXPECT(!fn.IsNull()); |
| 23 const Smi& idx = Smi::Handle(Smi::New(0)); | 23 const Smi& idx = Smi::Handle(Smi::New(0)); |
| 24 return IRRegExpMacroAssembler::Execute(fn, str, idx, zone); | 24 return IRRegExpMacroAssembler::Execute(fn, str, idx, zone); |
| 25 } | 25 } |
| 26 | 26 |
| 27 TEST_CASE(RegExp_OneByteString) { | 27 TEST_CASE(RegExp_OneByteString) { |
| 28 if (FLAG_use_jscre) | |
| 29 return; | |
| 30 | |
| 31 uint8_t chars[] = { 'a', 'b', 'c', 'b', 'a' }; | 28 uint8_t chars[] = { 'a', 'b', 'c', 'b', 'a' }; |
| 32 intptr_t len = ARRAY_SIZE(chars); | 29 intptr_t len = ARRAY_SIZE(chars); |
| 33 const String& str = String::Handle( | 30 const String& str = String::Handle( |
| 34 OneByteString::New(chars, len, Heap::kNew)); | 31 OneByteString::New(chars, len, Heap::kNew)); |
| 35 | 32 |
| 36 const String& pat = String::Handle(String::New("bc")); | 33 const String& pat = String::Handle(String::New("bc")); |
| 37 const Array& res = Array::Handle(Match(pat, str)); | 34 const Array& res = Array::Handle(Match(pat, str)); |
| 38 EXPECT_EQ(2, res.Length()); | 35 EXPECT_EQ(2, res.Length()); |
| 39 | 36 |
| 40 const Object& res_1 = Object::Handle(res.At(0)); | 37 const Object& res_1 = Object::Handle(res.At(0)); |
| 41 const Object& res_2 = Object::Handle(res.At(1)); | 38 const Object& res_2 = Object::Handle(res.At(1)); |
| 42 EXPECT(res_1.IsSmi()); | 39 EXPECT(res_1.IsSmi()); |
| 43 EXPECT(res_2.IsSmi()); | 40 EXPECT(res_2.IsSmi()); |
| 44 | 41 |
| 45 const Smi& smi_1 = Smi::Cast(res_1); | 42 const Smi& smi_1 = Smi::Cast(res_1); |
| 46 const Smi& smi_2 = Smi::Cast(res_2); | 43 const Smi& smi_2 = Smi::Cast(res_2); |
| 47 EXPECT_EQ(1, smi_1.Value()); | 44 EXPECT_EQ(1, smi_1.Value()); |
| 48 EXPECT_EQ(3, smi_2.Value()); | 45 EXPECT_EQ(3, smi_2.Value()); |
| 49 } | 46 } |
| 50 | 47 |
| 51 TEST_CASE(RegExp_TwoByteString) { | 48 TEST_CASE(RegExp_TwoByteString) { |
| 52 if (FLAG_use_jscre) | |
| 53 return; | |
| 54 | |
| 55 uint16_t chars[] = { 'a', 'b', 'c', 'b', 'a' }; | 49 uint16_t chars[] = { 'a', 'b', 'c', 'b', 'a' }; |
| 56 intptr_t len = ARRAY_SIZE(chars); | 50 intptr_t len = ARRAY_SIZE(chars); |
| 57 const String& str = String::Handle( | 51 const String& str = String::Handle( |
| 58 TwoByteString::New(chars, len, Heap::kNew)); | 52 TwoByteString::New(chars, len, Heap::kNew)); |
| 59 | 53 |
| 60 const String& pat = String::Handle(String::New("bc")); | 54 const String& pat = String::Handle(String::New("bc")); |
| 61 const Array& res = Array::Handle(Match(pat, str)); | 55 const Array& res = Array::Handle(Match(pat, str)); |
| 62 EXPECT_EQ(2, res.Length()); | 56 EXPECT_EQ(2, res.Length()); |
| 63 | 57 |
| 64 const Object& res_1 = Object::Handle(res.At(0)); | 58 const Object& res_1 = Object::Handle(res.At(0)); |
| 65 const Object& res_2 = Object::Handle(res.At(1)); | 59 const Object& res_2 = Object::Handle(res.At(1)); |
| 66 EXPECT(res_1.IsSmi()); | 60 EXPECT(res_1.IsSmi()); |
| 67 EXPECT(res_2.IsSmi()); | 61 EXPECT(res_2.IsSmi()); |
| 68 | 62 |
| 69 const Smi& smi_1 = Smi::Cast(res_1); | 63 const Smi& smi_1 = Smi::Cast(res_1); |
| 70 const Smi& smi_2 = Smi::Cast(res_2); | 64 const Smi& smi_2 = Smi::Cast(res_2); |
| 71 EXPECT_EQ(1, smi_1.Value()); | 65 EXPECT_EQ(1, smi_1.Value()); |
| 72 EXPECT_EQ(3, smi_2.Value()); | 66 EXPECT_EQ(3, smi_2.Value()); |
| 73 } | 67 } |
| 74 | 68 |
| 75 TEST_CASE(RegExp_ExternalOneByteString) { | 69 TEST_CASE(RegExp_ExternalOneByteString) { |
| 76 if (FLAG_use_jscre) | |
| 77 return; | |
| 78 | |
| 79 uint8_t chars[] = { 'a', 'b', 'c', 'b', 'a' }; | 70 uint8_t chars[] = { 'a', 'b', 'c', 'b', 'a' }; |
| 80 intptr_t len = ARRAY_SIZE(chars); | 71 intptr_t len = ARRAY_SIZE(chars); |
| 81 const String& str = String::Handle( | 72 const String& str = String::Handle( |
| 82 ExternalOneByteString::New(chars, len, NULL, NULL, Heap::kNew)); | 73 ExternalOneByteString::New(chars, len, NULL, NULL, Heap::kNew)); |
| 83 | 74 |
| 84 const String& pat = String::Handle(String::New("bc")); | 75 const String& pat = String::Handle(String::New("bc")); |
| 85 const Array& res = Array::Handle(Match(pat, str)); | 76 const Array& res = Array::Handle(Match(pat, str)); |
| 86 EXPECT_EQ(2, res.Length()); | 77 EXPECT_EQ(2, res.Length()); |
| 87 | 78 |
| 88 const Object& res_1 = Object::Handle(res.At(0)); | 79 const Object& res_1 = Object::Handle(res.At(0)); |
| 89 const Object& res_2 = Object::Handle(res.At(1)); | 80 const Object& res_2 = Object::Handle(res.At(1)); |
| 90 EXPECT(res_1.IsSmi()); | 81 EXPECT(res_1.IsSmi()); |
| 91 EXPECT(res_2.IsSmi()); | 82 EXPECT(res_2.IsSmi()); |
| 92 | 83 |
| 93 const Smi& smi_1 = Smi::Cast(res_1); | 84 const Smi& smi_1 = Smi::Cast(res_1); |
| 94 const Smi& smi_2 = Smi::Cast(res_2); | 85 const Smi& smi_2 = Smi::Cast(res_2); |
| 95 EXPECT_EQ(1, smi_1.Value()); | 86 EXPECT_EQ(1, smi_1.Value()); |
| 96 EXPECT_EQ(3, smi_2.Value()); | 87 EXPECT_EQ(3, smi_2.Value()); |
| 97 } | 88 } |
| 98 | 89 |
| 99 TEST_CASE(RegExp_ExternalTwoByteString) { | 90 TEST_CASE(RegExp_ExternalTwoByteString) { |
| 100 if (FLAG_use_jscre) | |
| 101 return; | |
| 102 | |
| 103 uint16_t chars[] = { 'a', 'b', 'c', 'b', 'a' }; | 91 uint16_t chars[] = { 'a', 'b', 'c', 'b', 'a' }; |
| 104 intptr_t len = ARRAY_SIZE(chars); | 92 intptr_t len = ARRAY_SIZE(chars); |
| 105 const String& str = String::Handle( | 93 const String& str = String::Handle( |
| 106 ExternalTwoByteString::New(chars, len, NULL, NULL, Heap::kNew)); | 94 ExternalTwoByteString::New(chars, len, NULL, NULL, Heap::kNew)); |
| 107 | 95 |
| 108 const String& pat = String::Handle(String::New("bc")); | 96 const String& pat = String::Handle(String::New("bc")); |
| 109 const Array& res = Array::Handle(Match(pat, str)); | 97 const Array& res = Array::Handle(Match(pat, str)); |
| 110 EXPECT_EQ(2, res.Length()); | 98 EXPECT_EQ(2, res.Length()); |
| 111 | 99 |
| 112 const Object& res_1 = Object::Handle(res.At(0)); | 100 const Object& res_1 = Object::Handle(res.At(0)); |
| 113 const Object& res_2 = Object::Handle(res.At(1)); | 101 const Object& res_2 = Object::Handle(res.At(1)); |
| 114 EXPECT(res_1.IsSmi()); | 102 EXPECT(res_1.IsSmi()); |
| 115 EXPECT(res_2.IsSmi()); | 103 EXPECT(res_2.IsSmi()); |
| 116 | 104 |
| 117 const Smi& smi_1 = Smi::Cast(res_1); | 105 const Smi& smi_1 = Smi::Cast(res_1); |
| 118 const Smi& smi_2 = Smi::Cast(res_2); | 106 const Smi& smi_2 = Smi::Cast(res_2); |
| 119 EXPECT_EQ(1, smi_1.Value()); | 107 EXPECT_EQ(1, smi_1.Value()); |
| 120 EXPECT_EQ(3, smi_2.Value()); | 108 EXPECT_EQ(3, smi_2.Value()); |
| 121 } | 109 } |
| 122 | 110 |
| 123 } // namespace dart | 111 } // namespace dart |
| OLD | NEW |