Skip to content

Commit 0a7d4f4

Browse files
svenpanneCommit bot
authored andcommitted
Added %_NewConsString intrinsic.
No compiler support for now (BTW: %_NewString, doesn't have that, either), inline allocation will come later. Hopefully the last intrisic to add for a StringAddStub POC... Review URL: https://codereview.chromium.org/1041723002 Cr-Commit-Position: refs/heads/master@{#27508}
1 parent c24ed0a commit 0a7d4f4

File tree

5 files changed

+68
-5
lines changed

5 files changed

+68
-5
lines changed

src/factory.cc

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,10 +538,30 @@ MaybeHandle<String> Factory::NewConsString(Handle<String> left,
538538
NewRawTwoByteString(length).ToHandleChecked(), left, right);
539539
}
540540

541-
Handle<Map> map = (is_one_byte || is_one_byte_data_in_two_byte_string)
542-
? cons_one_byte_string_map()
543-
: cons_string_map();
544-
Handle<ConsString> result = New<ConsString>(map, NEW_SPACE);
541+
return (is_one_byte || is_one_byte_data_in_two_byte_string)
542+
? NewOneByteConsString(length, left, right)
543+
: NewTwoByteConsString(length, left, right);
544+
}
545+
546+
547+
MaybeHandle<String> Factory::NewOneByteConsString(int length,
548+
Handle<String> left,
549+
Handle<String> right) {
550+
return NewRawConsString(cons_one_byte_string_map(), length, left, right);
551+
}
552+
553+
554+
MaybeHandle<String> Factory::NewTwoByteConsString(int length,
555+
Handle<String> left,
556+
Handle<String> right) {
557+
return NewRawConsString(cons_string_map(), length, left, right);
558+
}
559+
560+
561+
MaybeHandle<String> Factory::NewRawConsString(Handle<Map> map, int length,
562+
Handle<String> left,
563+
Handle<String> right) {
564+
Handle<ConsString> result = New<ConsString>(map, NEW_SPACE);
545565

546566
DisallowHeapAllocation no_gc;
547567
WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc);

src/factory.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,14 @@ class Factory FINAL {
196196
// Create a new cons string object which consists of a pair of strings.
197197
MUST_USE_RESULT MaybeHandle<String> NewConsString(Handle<String> left,
198198
Handle<String> right);
199+
MUST_USE_RESULT MaybeHandle<String> NewOneByteConsString(
200+
int length, Handle<String> left, Handle<String> right);
201+
MUST_USE_RESULT MaybeHandle<String> NewTwoByteConsString(
202+
int length, Handle<String> left, Handle<String> right);
203+
MUST_USE_RESULT MaybeHandle<String> NewRawConsString(Handle<Map> map,
204+
int length,
205+
Handle<String> left,
206+
Handle<String> right);
199207

200208
// Create a new string object which holds a proper substring of a string.
201209
Handle<String> NewProperSubString(Handle<String> str,

src/runtime/runtime-strings.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,28 @@ RUNTIME_FUNCTION(Runtime_NewString) {
12211221
}
12221222

12231223

1224+
RUNTIME_FUNCTION(Runtime_NewConsString) {
1225+
HandleScope scope(isolate);
1226+
DCHECK(args.length() == 4);
1227+
CONVERT_INT32_ARG_CHECKED(length, 0);
1228+
CONVERT_BOOLEAN_ARG_CHECKED(is_one_byte, 1);
1229+
CONVERT_ARG_HANDLE_CHECKED(String, left, 2);
1230+
CONVERT_ARG_HANDLE_CHECKED(String, right, 3);
1231+
1232+
Handle<String> result;
1233+
if (is_one_byte) {
1234+
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1235+
isolate, result,
1236+
isolate->factory()->NewOneByteConsString(length, left, right));
1237+
} else {
1238+
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1239+
isolate, result,
1240+
isolate->factory()->NewTwoByteConsString(length, left, right));
1241+
}
1242+
return *result;
1243+
}
1244+
1245+
12241246
RUNTIME_FUNCTION(Runtime_StringEquals) {
12251247
HandleScope handle_scope(isolate);
12261248
DCHECK(args.length() == 2);

src/runtime/runtime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ namespace internal {
172172
F(StringToArray, 2, 1) \
173173
F(NewStringWrapper, 1, 1) \
174174
F(NewString, 2, 1) \
175+
F(NewConsString, 4, 1) \
175176
F(TruncateString, 2, 1) \
176177
\
177178
/* Numbers */ \

test/cctest/compiler/test-run-intrinsics.cc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ TEST(IncrementStatsCounter) {
6363
reinterpret_cast<v8::Isolate*>(CcTest::InitIsolateOnce())
6464
->SetCounterFunction(LookupCounter);
6565
FunctionTester T(
66-
"(function() { %_IncrementStatsCounter(\"" COUNTER_NAME "\"); })", flags);
66+
"(function() { %_IncrementStatsCounter('" COUNTER_NAME "'); })", flags);
6767
StatsCounter counter(T.main_isolate(), COUNTER_NAME);
6868
if (!counter.Enabled()) return;
6969

@@ -235,6 +235,18 @@ TEST(OneByteSeqStringSetChar) {
235235
}
236236

237237

238+
TEST(NewConsString) {
239+
FLAG_turbo_deoptimization = true;
240+
FunctionTester T(
241+
"(function() { "
242+
" return %_NewConsString(14, true, 'abcdefghi', 'jklmn');"
243+
" })",
244+
flags);
245+
246+
T.CheckCall(T.Val("abcdefghijklmn"));
247+
}
248+
249+
238250
TEST(SetValueOf) {
239251
FLAG_turbo_deoptimization = true;
240252
FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags);

0 commit comments

Comments
 (0)