Chromium Code Reviews| Index: src/code-stub-assembler.cc |
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
| index 80c4c77bf6f034f21cd12a2b7d90788aa2fec7d4..c5ce7b8baa9446d61379c6be687ceb4e87968a30 100644 |
| --- a/src/code-stub-assembler.cc |
| +++ b/src/code-stub-assembler.cc |
| @@ -2429,6 +2429,56 @@ Node* CodeStubAssembler::StringFromCharCode(Node* code) { |
| return var_result.value(); |
| } |
| +Node* CodeStubAssembler::StringFromCodePoint(compiler::Node* codepoint, |
| + UnicodeEncoding encoding) { |
| + Variable var_result(this, MachineRepresentation::kTagged); |
| + var_result.Bind(EmptyStringConstant()); |
| + |
| + Label if_isword16(this), if_isword32(this), return_result(this); |
| + |
| + Branch(Uint32LessThan(codepoint, Int32Constant(0x10000)), &if_isword16, |
| + &if_isword32); |
| + |
| + Bind(&if_isword16); |
| + { |
| + var_result.Bind(StringFromCharCode(codepoint)); |
| + Goto(&return_result); |
| + } |
| + |
| + Bind(&if_isword32); |
| + { |
| + switch (encoding) { |
| + case UnicodeEncoding::UTF16: |
| + break; |
| + case UnicodeEncoding::UTF32: { |
| + // Convert UTF32 to UTF16 code units, and store as a 32 bit word. |
| + Node* lead_offset = Int32Constant(0xD800 - (0x10000 >> 10)); |
| + |
| + Node* lead = |
| + Int32Add(WordShr(codepoint, Int32Constant(10)), lead_offset); |
| + |
| + Node* trail = Int32Add(Word32And(codepoint, Int32Constant(0x3FF)), |
| + Int32Constant(0xDC00)); |
| + |
| + codepoint = Word32Or(WordShl(trail, Int32Constant(16)), lead); |
|
Benedikt Meurer
2016/09/26 18:38:22
Nit: add explicit break for readability.
caitp
2016/09/27 08:55:57
Done, although clang-format complains unless I rea
caitp
2016/09/27 09:14:18
Actually, clang-format isn't happy even with the c
Benedikt Meurer
2016/09/27 09:16:02
I mean the keyword break, not a line break.
caitp
2016/09/27 09:20:41
Oh, I see. Haven't had much coffee yet this mornin
Benedikt Meurer
2016/09/27 09:52:38
Thanks!
Now grab a coffee. ;-)
|
| + } |
| + default: |
|
Benedikt Meurer
2016/09/26 18:38:22
Don't add default here. The C++ compiler cannot fl
caitp
2016/09/27 08:55:57
Done.
|
| + UNREACHABLE(); |
| + } |
| + |
| + Node* value = AllocateSeqTwoByteString(2); |
| + StoreNoWriteBarrier( |
| + MachineRepresentation::kWord32, value, |
| + IntPtrConstant(SeqTwoByteString::kHeaderSize - kHeapObjectTag), |
| + codepoint); |
| + var_result.Bind(value); |
| + Goto(&return_result); |
| + } |
| + |
| + Bind(&return_result); |
| + return var_result.value(); |
| +} |
| + |
| Node* CodeStubAssembler::StringToNumber(Node* context, Node* input) { |
| Label runtime(this, Label::kDeferred); |
| Label end(this); |