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

Unified Diff: src/runtime.cc

Issue 669156: Removed dangerous Factory::NewUninitializedFixedArray. (Closed)
Patch Set: Created 10 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/factory.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 439d8381867372bb54a8a81f9d99c7de709d7885..d13a55d4fd0995977e3eda0be6fd9faa1bdb330f 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -4216,21 +4216,33 @@ static Object* Runtime_StringTrim(Arguments args) {
// Copies ascii characters to the given fixed array looking up
// one-char strings in the cache. Gives up on the first char that is
-// not in the cache. Returns the length of the successfully copied
-// prefix.
+// not in the cache and fills the remainder with smi zeros. Returns
+// the length of the successfully copied prefix.
static int CopyCachedAsciiCharsToArray(const char* chars,
FixedArray* elements,
int length) {
AssertNoAllocation nogc;
FixedArray* ascii_cache = Heap::single_character_string_cache();
Object* undefined = Heap::undefined_value();
- for (int i = 0; i < length; ++i) {
+ int i;
+ for (i = 0; i < length; ++i) {
Object* value = ascii_cache->get(chars[i]);
- if (value == undefined) return i;
+ if (value == undefined) break;
ASSERT(!Heap::InNewSpace(value));
elements->set(i, value, SKIP_WRITE_BARRIER);
}
- return length;
+ if (i < length) {
antonm 2010/03/05 12:18:05 maybe lift this filling into the loop itself: if
Vitaly Repeshko 2010/03/05 12:32:10 I'd like to keep the fast loop as simple as possib
+ ASSERT(kSmiTag == 0);
+ memset(elements->data_start() + i, 0, length - i);
antonm 2010/03/05 12:18:05 not insisting, but something like Smi::FromInt(0)
Vitaly Repeshko 2010/03/05 12:32:10 Done.
+ }
+#ifdef DEBUG
+ for (int j = 0; j < length; ++j) {
+ Object* element = elements->get(j);
+ ASSERT(element == Smi::FromInt(0) ||
+ (element->IsString() && String::cast(element)->LooksValid()));
+ }
+#endif
+ return i;
}
@@ -4244,24 +4256,23 @@ static Object* Runtime_StringToArray(Arguments args) {
s->TryFlatten();
const int length = s->length();
- Handle<FixedArray> elements = Factory::NewUninitializedFixedArray(length);
- if (s->IsFlat()) {
- if (s->IsAsciiRepresentation()) {
- Vector<const char> chars = s->ToAsciiVector();
- int num_copied_from_cache = CopyCachedAsciiCharsToArray(chars.start(),
- *elements,
- length);
- for (int i = num_copied_from_cache; i < length; ++i) {
- elements->set(i, *LookupSingleCharacterStringFromCode(chars[i]));
- }
- } else {
- ASSERT(s->IsTwoByteRepresentation());
- Vector<const uc16> chars = s->ToUC16Vector();
- for (int i = 0; i < length; ++i) {
- elements->set(i, *LookupSingleCharacterStringFromCode(chars[i]));
- }
+ Handle<FixedArray> elements;
+ if (s->IsFlat() && s->IsAsciiRepresentation()) {
+ Object* obj = Heap::AllocateUninitializedFixedArray(length);
antonm 2010/03/05 12:18:05 maybe add a comment that uninitialized array will
Vitaly Repeshko 2010/03/05 12:32:10 Done.
+ if (obj->IsFailure()) return obj;
+ FixedArray* raw_elements = FixedArray::cast(obj);
Mads Ager (chromium) 2010/03/05 12:17:16 Let's put elements in a handle right away here and
Vitaly Repeshko 2010/03/05 12:32:10 Done.
+
+ Vector<const char> chars = s->ToAsciiVector();
+ int num_copied_from_cache = CopyCachedAsciiCharsToArray(chars.start(),
+ raw_elements,
+ length);
+
+ elements = Handle<FixedArray>(raw_elements);
+ for (int i = num_copied_from_cache; i < length; ++i) {
+ elements->set(i, *LookupSingleCharacterStringFromCode(chars[i]));
}
} else {
+ elements = Factory::NewFixedArray(length);
for (int i = 0; i < length; ++i) {
elements->set(i, *LookupSingleCharacterStringFromCode(s->Get(i)));
}
« no previous file with comments | « src/factory.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698