mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 23:49:45 +00:00
17d6ba15b6
This change removes support for external strings from the VM along with Dart_NewExternalLatin1String, Dart_NewExternalUTF16String and Dart_IsExternalString Dart C API functions. External strings are not used by the VM nor any known embedder, but Dart VM was paying the maintenance and performance price for the external string implementation classes. TEST=ci Change-Id: I094cd2d2b7ec0840e9f09e1ca9e5a7acd4e78c28 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/358760 Reviewed-by: Ryan Macnak <rmacnak@google.com> Reviewed-by: Siva Annamalai <asiva@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
70 lines
2.2 KiB
C++
70 lines
2.2 KiB
C++
// 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 "platform/globals.h"
|
|
|
|
#include "vm/isolate.h"
|
|
#include "vm/object.h"
|
|
#include "vm/regexp.h"
|
|
#include "vm/regexp_assembler_ir.h"
|
|
#include "vm/unit_test.h"
|
|
|
|
namespace dart {
|
|
|
|
static ArrayPtr Match(const String& pat, const String& str) {
|
|
Thread* thread = Thread::Current();
|
|
Zone* zone = thread->zone();
|
|
const RegExp& regexp =
|
|
RegExp::Handle(RegExpEngine::CreateRegExp(thread, pat, RegExpFlags()));
|
|
const Smi& idx = Object::smi_zero();
|
|
return IRRegExpMacroAssembler::Execute(regexp, str, idx, /*sticky=*/false,
|
|
zone);
|
|
}
|
|
|
|
ISOLATE_UNIT_TEST_CASE(RegExp_OneByteString) {
|
|
uint8_t chars[] = {'a', 'b', 'c', 'b', 'a'};
|
|
intptr_t len = ARRAY_SIZE(chars);
|
|
const String& str =
|
|
String::Handle(OneByteString::New(chars, len, Heap::kNew));
|
|
|
|
const String& pat =
|
|
String::Handle(Symbols::New(thread, String::Handle(String::New("bc"))));
|
|
const Array& res = Array::Handle(Match(pat, str));
|
|
EXPECT_EQ(2, res.Length());
|
|
|
|
const Object& res_1 = Object::Handle(res.At(0));
|
|
const Object& res_2 = Object::Handle(res.At(1));
|
|
EXPECT(res_1.IsSmi());
|
|
EXPECT(res_2.IsSmi());
|
|
|
|
const Smi& smi_1 = Smi::Cast(res_1);
|
|
const Smi& smi_2 = Smi::Cast(res_2);
|
|
EXPECT_EQ(1, smi_1.Value());
|
|
EXPECT_EQ(3, smi_2.Value());
|
|
}
|
|
|
|
ISOLATE_UNIT_TEST_CASE(RegExp_TwoByteString) {
|
|
uint16_t chars[] = {'a', 'b', 'c', 'b', 'a'};
|
|
intptr_t len = ARRAY_SIZE(chars);
|
|
const String& str =
|
|
String::Handle(TwoByteString::New(chars, len, Heap::kNew));
|
|
|
|
const String& pat =
|
|
String::Handle(Symbols::New(thread, String::Handle(String::New("bc"))));
|
|
const Array& res = Array::Handle(Match(pat, str));
|
|
EXPECT_EQ(2, res.Length());
|
|
|
|
const Object& res_1 = Object::Handle(res.At(0));
|
|
const Object& res_2 = Object::Handle(res.At(1));
|
|
EXPECT(res_1.IsSmi());
|
|
EXPECT(res_2.IsSmi());
|
|
|
|
const Smi& smi_1 = Smi::Cast(res_1);
|
|
const Smi& smi_2 = Smi::Cast(res_2);
|
|
EXPECT_EQ(1, smi_1.Value());
|
|
EXPECT_EQ(3, smi_2.Value());
|
|
}
|
|
|
|
} // namespace dart
|