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

Side by Side Diff: src/runtime/runtime-strings.cc

Issue 799803003: Fix ArrayConcat for JSValues/JSFunctions/JSRegExps with @@isConcatSpreadable (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 6 years 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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/arguments.h" 7 #include "src/arguments.h"
8 #include "src/jsregexp-inl.h" 8 #include "src/jsregexp-inl.h"
9 #include "src/jsregexp.h" 9 #include "src/jsregexp.h"
10 #include "src/runtime/runtime-utils.h" 10 #include "src/runtime/runtime-utils.h"
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 for (int j = 0; j < length; ++j) { 794 for (int j = 0; j < length; ++j) {
795 Object* element = elements->get(j); 795 Object* element = elements->get(j);
796 DCHECK(element == Smi::FromInt(0) || 796 DCHECK(element == Smi::FromInt(0) ||
797 (element->IsString() && String::cast(element)->LooksValid())); 797 (element->IsString() && String::cast(element)->LooksValid()));
798 } 798 }
799 #endif 799 #endif
800 return i; 800 return i;
801 } 801 }
802 802
803 803
804 // Converts a String to JSArray. 804 Handle<JSArray> Runtime::StringToArray(Isolate* isolate, Handle<String> s,
805 // For example, "foo" => ["f", "o", "o"]. 805 uint32_t limit) {
806 RUNTIME_FUNCTION(Runtime_StringToArray) {
807 HandleScope scope(isolate);
808 DCHECK(args.length() == 2);
809 CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
810 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
811
812 s = String::Flatten(s); 806 s = String::Flatten(s);
813 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit)); 807 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit));
814 808
815 Handle<FixedArray> elements; 809 Handle<FixedArray> elements;
816 int position = 0; 810 int position = 0;
817 if (s->IsFlat() && s->IsOneByteRepresentation()) { 811 if (s->IsFlat() && s->IsOneByteRepresentation()) {
818 // Try using cached chars where possible. 812 // Try using cached chars where possible.
819 elements = isolate->factory()->NewUninitializedFixedArray(length); 813 elements = isolate->factory()->NewUninitializedFixedArray(length);
820 814
821 DisallowHeapAllocation no_gc; 815 DisallowHeapAllocation no_gc;
(...skipping 16 matching lines...) Expand all
838 isolate->factory()->LookupSingleCharacterStringFromCode(s->Get(i)); 832 isolate->factory()->LookupSingleCharacterStringFromCode(s->Get(i));
839 elements->set(i, *str); 833 elements->set(i, *str);
840 } 834 }
841 835
842 #ifdef DEBUG 836 #ifdef DEBUG
843 for (int i = 0; i < length; ++i) { 837 for (int i = 0; i < length; ++i) {
844 DCHECK(String::cast(elements->get(i))->length() == 1); 838 DCHECK(String::cast(elements->get(i))->length() == 1);
845 } 839 }
846 #endif 840 #endif
847 841
848 return *isolate->factory()->NewJSArrayWithElements(elements); 842 return isolate->factory()->NewJSArrayWithElements(elements);
849 } 843 }
850 844
851 845
846 // Converts a String to JSArray.
847 // For example, "foo" => ["f", "o", "o"].
848 RUNTIME_FUNCTION(Runtime_StringToArray) {
849 HandleScope scope(isolate);
850 DCHECK(args.length() == 2);
851 CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
852 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
853
854 return *Runtime::StringToArray(isolate, s, limit);
855 }
856
857
852 static inline bool ToUpperOverflows(uc32 character) { 858 static inline bool ToUpperOverflows(uc32 character) {
853 // y with umlauts and the micro sign are the only characters that stop 859 // y with umlauts and the micro sign are the only characters that stop
854 // fitting into one-byte when converting to uppercase. 860 // fitting into one-byte when converting to uppercase.
855 static const uc32 yuml_code = 0xff; 861 static const uc32 yuml_code = 0xff;
856 static const uc32 micro_code = 0xb5; 862 static const uc32 micro_code = 0xb5;
857 return (character == yuml_code || character == micro_code); 863 return (character == yuml_code || character == micro_code);
858 } 864 }
859 865
860 866
861 template <class Converter> 867 template <class Converter>
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 return __RT_impl_Runtime_StringAdd(args, isolate); 1302 return __RT_impl_Runtime_StringAdd(args, isolate);
1297 } 1303 }
1298 1304
1299 1305
1300 RUNTIME_FUNCTION(RuntimeReference_IsStringWrapperSafeForDefaultValueOf) { 1306 RUNTIME_FUNCTION(RuntimeReference_IsStringWrapperSafeForDefaultValueOf) {
1301 UNIMPLEMENTED(); 1307 UNIMPLEMENTED();
1302 return NULL; 1308 return NULL;
1303 } 1309 }
1304 } 1310 }
1305 } // namespace v8::internal 1311 } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698