Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 4195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4206 | 4206 |
| 4207 int right = length; | 4207 int right = length; |
| 4208 if (trimRight) { | 4208 if (trimRight) { |
| 4209 while (right > left && IsTrimWhiteSpace(s->Get(right - 1))) { | 4209 while (right > left && IsTrimWhiteSpace(s->Get(right - 1))) { |
| 4210 right--; | 4210 right--; |
| 4211 } | 4211 } |
| 4212 } | 4212 } |
| 4213 return s->SubString(left, right); | 4213 return s->SubString(left, right); |
| 4214 } | 4214 } |
| 4215 | 4215 |
| 4216 | |
| 4217 // Copies ascii characters to the given fixed array looking up | |
| 4218 // one-char strings in the cache. Gives up on the first char that is | |
| 4219 // not in the cache. Returns the length of the successfully copied | |
| 4220 // prefix. | |
| 4221 static int CopyCachedAsciiCharsToArray(const char* chars, | |
| 4222 FixedArray* elements, | |
| 4223 int length) { | |
| 4224 AssertNoAllocation nogc; | |
| 4225 FixedArray* ascii_cache = Heap::single_character_string_cache(); | |
| 4226 Object* undefined = Heap::undefined_value(); | |
| 4227 for (int i = 0; i < length; ++i) { | |
| 4228 Object* value = ascii_cache->get(chars[i]); | |
| 4229 if (value == undefined) return i; | |
| 4230 ASSERT(!Heap::InNewSpace(value)); | |
| 4231 elements->set(i, value, SKIP_WRITE_BARRIER); | |
| 4232 } | |
| 4233 return length; | |
| 4234 } | |
| 4235 | |
| 4236 | |
| 4237 // Converts a String to JSArray. | |
| 4238 // For example, "foo" => ["f", "o", "o"]. | |
| 4239 static Object* Runtime_StringToArray(Arguments args) { | |
| 4240 HandleScope scope; | |
| 4241 ASSERT(args.length() == 1); | |
| 4242 CONVERT_ARG_CHECKED(String, s, 0); | |
| 4243 | |
| 4244 s->TryFlatten(); | |
| 4245 const int length = s->length(); | |
| 4246 | |
| 4247 Handle<FixedArray> elements = Factory::NewUninitializedFixedArray(length); | |
| 4248 if (s->IsFlat()) { | |
| 4249 if (s->IsAsciiRepresentation()) { | |
| 4250 Vector<const char> chars = s->ToAsciiVector(); | |
| 4251 int num_copied_from_cache = CopyCachedAsciiCharsToArray(chars.start(), | |
| 4252 *elements, | |
| 4253 length); | |
| 4254 for (int i = num_copied_from_cache; i < length; ++i) { | |
| 4255 elements->set(i, *LookupSingleCharacterStringFromCode(chars[i]), | |
| 4256 UPDATE_WRITE_BARRIER); | |
|
Mads Ager (chromium)
2010/03/04 13:30:56
Just omit the WriteBarrierMode here since the defa
Vitaly Repeshko
2010/03/04 14:03:12
Done.
| |
| 4257 } | |
| 4258 } else { | |
| 4259 ASSERT(s->IsTwoByteRepresentation()); | |
| 4260 Vector<const uc16> chars = s->ToUC16Vector(); | |
| 4261 for (int i = 0; i < length; ++i) { | |
| 4262 elements->set(i, *LookupSingleCharacterStringFromCode(chars[i]), | |
| 4263 UPDATE_WRITE_BARRIER); | |
| 4264 } | |
| 4265 } | |
| 4266 } else { | |
| 4267 for (int i = 0; i < length; ++i) { | |
| 4268 elements->set(i, *LookupSingleCharacterStringFromCode(s->Get(i)), | |
| 4269 UPDATE_WRITE_BARRIER); | |
| 4270 } | |
| 4271 } | |
| 4272 | |
| 4273 #ifdef DEBUG | |
| 4274 for (int i = 0; i < length; ++i) { | |
| 4275 ASSERT(String::cast(elements->get(i))->length() == 1); | |
| 4276 } | |
| 4277 #endif | |
| 4278 | |
| 4279 return *Factory::NewJSArrayWithElements(elements); | |
| 4280 } | |
| 4281 | |
| 4282 | |
| 4216 bool Runtime::IsUpperCaseChar(uint16_t ch) { | 4283 bool Runtime::IsUpperCaseChar(uint16_t ch) { |
| 4217 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; | 4284 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; |
| 4218 int char_length = to_upper_mapping.get(ch, 0, chars); | 4285 int char_length = to_upper_mapping.get(ch, 0, chars); |
| 4219 return char_length == 0; | 4286 return char_length == 0; |
| 4220 } | 4287 } |
| 4221 | 4288 |
| 4222 | 4289 |
| 4223 static Object* Runtime_NumberToString(Arguments args) { | 4290 static Object* Runtime_NumberToString(Arguments args) { |
| 4224 NoHandleAllocation ha; | 4291 NoHandleAllocation ha; |
| 4225 ASSERT(args.length() == 1); | 4292 ASSERT(args.length() == 1); |
| (...skipping 4256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8482 } else { | 8549 } else { |
| 8483 // Handle last resort GC and make sure to allow future allocations | 8550 // Handle last resort GC and make sure to allow future allocations |
| 8484 // to grow the heap without causing GCs (if possible). | 8551 // to grow the heap without causing GCs (if possible). |
| 8485 Counters::gc_last_resort_from_js.Increment(); | 8552 Counters::gc_last_resort_from_js.Increment(); |
| 8486 Heap::CollectAllGarbage(false); | 8553 Heap::CollectAllGarbage(false); |
| 8487 } | 8554 } |
| 8488 } | 8555 } |
| 8489 | 8556 |
| 8490 | 8557 |
| 8491 } } // namespace v8::internal | 8558 } } // namespace v8::internal |
| OLD | NEW |