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

Side by Side Diff: src/code-stub-assembler.cc

Issue 2435953002: Add CodeStubAssembler::FlattenString (Closed)
Patch Set: Created 4 years, 2 months 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 unified diff | Download patch
« no previous file with comments | « src/code-stub-assembler.h ('k') | test/cctest/test-code-stub-assembler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 #include "src/code-stub-assembler.h" 4 #include "src/code-stub-assembler.h"
5 #include "src/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/frames-inl.h" 6 #include "src/frames-inl.h"
7 #include "src/frames.h" 7 #include "src/frames.h"
8 #include "src/ic/handler-configuration.h" 8 #include "src/ic/handler-configuration.h"
9 #include "src/ic/stub-cache.h" 9 #include "src/ic/stub-cache.h"
10 10
(...skipping 3592 matching lines...) Expand 10 before | Expand all | Expand 10 after
3603 3603
3604 Bind(&not_heap_number); 3604 Bind(&not_heap_number);
3605 { 3605 {
3606 GotoIf(Word32NotEqual(input_instance_type, Int32Constant(ODDBALL_TYPE)), 3606 GotoIf(Word32NotEqual(input_instance_type, Int32Constant(ODDBALL_TYPE)),
3607 &runtime); 3607 &runtime);
3608 result.Bind(LoadObjectField(input, Oddball::kToStringOffset)); 3608 result.Bind(LoadObjectField(input, Oddball::kToStringOffset));
3609 Goto(&done); 3609 Goto(&done);
3610 } 3610 }
3611 3611
3612 Bind(&runtime); 3612 Bind(&runtime);
3613 { 3613 result.Bind(CallRuntime(Runtime::kToString, context, input));
danno 2016/10/20 08:35:52 After our discussion, not sure if you want this wh
3614 result.Bind(CallRuntime(Runtime::kToString, context, input)); 3614 Goto(&done);
3615 Goto(&done);
3616 }
3617 3615
3618 Bind(&done); 3616 Bind(&done);
3619 return result.value(); 3617 return result.value();
3620 } 3618 }
3621 3619
3620 Node* CodeStubAssembler::FlattenString(Node* string) {
3621 Variable var_result(this, MachineRepresentation::kTagged);
3622 var_result.Bind(string);
3623
3624 Node* instance_type = LoadInstanceType(string);
3625
3626 // Check if the {string} is not a ConsString (i.e. already flat).
3627 Label is_flat_in_cons(this), end(this);
3628 GotoUnless(Word32Equal(Word32And(instance_type,
3629 Int32Constant(kStringRepresentationMask)),
3630 Int32Constant(kConsStringTag)),
3631 &end);
3632
3633 // Check whether the right hand side is the empty string (i.e. if
3634 // this is really a flat string in a cons string).
3635 Node* rhs = LoadObjectField(string, ConsString::kSecondOffset);
3636 GotoIf(WordEqual(rhs, EmptyStringConstant()), &is_flat_in_cons);
3637
3638 // Bail out to the runtime.
danno 2016/10/20 08:35:52 Make this label deferred. You can make that effici
3639 var_result.Bind(
3640 CallRuntime(Runtime::kFlattenString, NoContextConstant(), string));
3641 Goto(&end);
3642
3643 Bind(&is_flat_in_cons);
3644 var_result.Bind(LoadObjectField(string, ConsString::kFirstOffset));
3645 Goto(&end);
3646
3647 Bind(&end);
3648 return var_result.value();
3649 }
3650
3622 Node* CodeStubAssembler::JSReceiverToPrimitive(Node* context, Node* input) { 3651 Node* CodeStubAssembler::JSReceiverToPrimitive(Node* context, Node* input) {
3623 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); 3652 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
3624 Label if_isreceiver(this, Label::kDeferred), if_isnotreceiver(this); 3653 Label if_isreceiver(this, Label::kDeferred), if_isnotreceiver(this);
3625 Variable result(this, MachineRepresentation::kTagged); 3654 Variable result(this, MachineRepresentation::kTagged);
3626 Label done(this, &result); 3655 Label done(this, &result);
3627 3656
3628 GotoIf(TaggedIsSmi(input), &if_isnotreceiver); 3657 GotoIf(TaggedIsSmi(input), &if_isnotreceiver);
3629 3658
3630 Node* map = LoadMap(input); 3659 Node* map = LoadMap(input);
3631 Node* instance_type = LoadMapInstanceType(map); 3660 Node* instance_type = LoadMapInstanceType(map);
(...skipping 4675 matching lines...) Expand 10 before | Expand all | Expand 10 after
8307 Node* buffer_bit_field = LoadObjectField( 8336 Node* buffer_bit_field = LoadObjectField(
8308 buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32()); 8337 buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32());
8309 Node* was_neutered_mask = Int32Constant(JSArrayBuffer::WasNeutered::kMask); 8338 Node* was_neutered_mask = Int32Constant(JSArrayBuffer::WasNeutered::kMask);
8310 8339
8311 return Word32NotEqual(Word32And(buffer_bit_field, was_neutered_mask), 8340 return Word32NotEqual(Word32And(buffer_bit_field, was_neutered_mask),
8312 Int32Constant(0)); 8341 Int32Constant(0));
8313 } 8342 }
8314 8343
8315 } // namespace internal 8344 } // namespace internal
8316 } // namespace v8 8345 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | test/cctest/test-code-stub-assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698