OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 | 50 |
51 namespace v8 { | 51 namespace v8 { |
52 namespace internal { | 52 namespace internal { |
53 | 53 |
54 namespace { | 54 namespace { |
55 | 55 |
56 bool ExtractStringSetting(Isolate* isolate, | 56 bool ExtractStringSetting(Isolate* isolate, |
57 Handle<JSObject> options, | 57 Handle<JSObject> options, |
58 const char* key, | 58 const char* key, |
59 icu::UnicodeString* setting) { | 59 icu::UnicodeString* setting) { |
60 Handle<String> str = isolate->factory()->NewStringFromAscii(CStrVector(key)); | 60 Handle<String> str = isolate->factory()->NewStringFromAsciiChecked(key); |
61 Handle<Object> object = Object::GetProperty(options, str).ToHandleChecked(); | 61 Handle<Object> object = Object::GetProperty(options, str).ToHandleChecked(); |
62 if (object->IsString()) { | 62 if (object->IsString()) { |
63 v8::String::Utf8Value utf8_string( | 63 v8::String::Utf8Value utf8_string( |
64 v8::Utils::ToLocal(Handle<String>::cast(object))); | 64 v8::Utils::ToLocal(Handle<String>::cast(object))); |
65 *setting = icu::UnicodeString::fromUTF8(*utf8_string); | 65 *setting = icu::UnicodeString::fromUTF8(*utf8_string); |
66 return true; | 66 return true; |
67 } | 67 } |
68 return false; | 68 return false; |
69 } | 69 } |
70 | 70 |
71 | 71 |
72 bool ExtractIntegerSetting(Isolate* isolate, | 72 bool ExtractIntegerSetting(Isolate* isolate, |
73 Handle<JSObject> options, | 73 Handle<JSObject> options, |
74 const char* key, | 74 const char* key, |
75 int32_t* value) { | 75 int32_t* value) { |
76 Handle<String> str = isolate->factory()->NewStringFromAscii(CStrVector(key)); | 76 Handle<String> str = isolate->factory()->NewStringFromAsciiChecked(key); |
77 Handle<Object> object = Object::GetProperty(options, str).ToHandleChecked(); | 77 Handle<Object> object = Object::GetProperty(options, str).ToHandleChecked(); |
78 if (object->IsNumber()) { | 78 if (object->IsNumber()) { |
79 object->ToInt32(value); | 79 object->ToInt32(value); |
80 return true; | 80 return true; |
81 } | 81 } |
82 return false; | 82 return false; |
83 } | 83 } |
84 | 84 |
85 | 85 |
86 bool ExtractBooleanSetting(Isolate* isolate, | 86 bool ExtractBooleanSetting(Isolate* isolate, |
87 Handle<JSObject> options, | 87 Handle<JSObject> options, |
88 const char* key, | 88 const char* key, |
89 bool* value) { | 89 bool* value) { |
90 Handle<String> str = isolate->factory()->NewStringFromAscii(CStrVector(key)); | 90 Handle<String> str = isolate->factory()->NewStringFromAsciiChecked(key); |
91 Handle<Object> object = Object::GetProperty(options, str).ToHandleChecked(); | 91 Handle<Object> object = Object::GetProperty(options, str).ToHandleChecked(); |
92 if (object->IsBoolean()) { | 92 if (object->IsBoolean()) { |
93 *value = object->BooleanValue(); | 93 *value = object->BooleanValue(); |
94 return true; | 94 return true; |
95 } | 95 } |
96 return false; | 96 return false; |
97 } | 97 } |
98 | 98 |
99 | 99 |
100 icu::SimpleDateFormat* CreateICUDateFormat( | 100 icu::SimpleDateFormat* CreateICUDateFormat( |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 } | 142 } |
143 | 143 |
144 return date_format; | 144 return date_format; |
145 } | 145 } |
146 | 146 |
147 | 147 |
148 void SetResolvedDateSettings(Isolate* isolate, | 148 void SetResolvedDateSettings(Isolate* isolate, |
149 const icu::Locale& icu_locale, | 149 const icu::Locale& icu_locale, |
150 icu::SimpleDateFormat* date_format, | 150 icu::SimpleDateFormat* date_format, |
151 Handle<JSObject> resolved) { | 151 Handle<JSObject> resolved) { |
| 152 Factory* factory = isolate->factory(); |
152 UErrorCode status = U_ZERO_ERROR; | 153 UErrorCode status = U_ZERO_ERROR; |
153 icu::UnicodeString pattern; | 154 icu::UnicodeString pattern; |
154 date_format->toPattern(pattern); | 155 date_format->toPattern(pattern); |
155 JSObject::SetProperty( | 156 JSObject::SetProperty( |
156 resolved, | 157 resolved, |
157 isolate->factory()->NewStringFromAscii(CStrVector("pattern")), | 158 factory->NewStringFromStaticAscii("pattern"), |
158 isolate->factory()->NewStringFromTwoByte( | 159 factory->NewStringFromTwoByte( |
159 Vector<const uint16_t>( | 160 Vector<const uint16_t>( |
160 reinterpret_cast<const uint16_t*>(pattern.getBuffer()), | 161 reinterpret_cast<const uint16_t*>(pattern.getBuffer()), |
161 pattern.length())), | 162 pattern.length())).ToHandleChecked(), |
162 NONE, | 163 NONE, |
163 SLOPPY).Assert(); | 164 SLOPPY).Assert(); |
164 | 165 |
165 // Set time zone and calendar. | 166 // Set time zone and calendar. |
166 const icu::Calendar* calendar = date_format->getCalendar(); | 167 const icu::Calendar* calendar = date_format->getCalendar(); |
167 const char* calendar_name = calendar->getType(); | 168 const char* calendar_name = calendar->getType(); |
168 JSObject::SetProperty( | 169 JSObject::SetProperty( |
169 resolved, | 170 resolved, |
170 isolate->factory()->NewStringFromAscii(CStrVector("calendar")), | 171 factory->NewStringFromStaticAscii("calendar"), |
171 isolate->factory()->NewStringFromAscii(CStrVector(calendar_name)), | 172 factory->NewStringFromAsciiChecked(calendar_name), |
172 NONE, | 173 NONE, |
173 SLOPPY).Assert(); | 174 SLOPPY).Assert(); |
174 | 175 |
175 const icu::TimeZone& tz = calendar->getTimeZone(); | 176 const icu::TimeZone& tz = calendar->getTimeZone(); |
176 icu::UnicodeString time_zone; | 177 icu::UnicodeString time_zone; |
177 tz.getID(time_zone); | 178 tz.getID(time_zone); |
178 | 179 |
179 icu::UnicodeString canonical_time_zone; | 180 icu::UnicodeString canonical_time_zone; |
180 icu::TimeZone::getCanonicalID(time_zone, canonical_time_zone, status); | 181 icu::TimeZone::getCanonicalID(time_zone, canonical_time_zone, status); |
181 if (U_SUCCESS(status)) { | 182 if (U_SUCCESS(status)) { |
182 if (canonical_time_zone == UNICODE_STRING_SIMPLE("Etc/GMT")) { | 183 if (canonical_time_zone == UNICODE_STRING_SIMPLE("Etc/GMT")) { |
183 JSObject::SetProperty( | 184 JSObject::SetProperty( |
184 resolved, | 185 resolved, |
185 isolate->factory()->NewStringFromAscii(CStrVector("timeZone")), | 186 factory->NewStringFromStaticAscii("timeZone"), |
186 isolate->factory()->NewStringFromAscii(CStrVector("UTC")), | 187 factory->NewStringFromStaticAscii("UTC"), |
187 NONE, | 188 NONE, |
188 SLOPPY).Assert(); | 189 SLOPPY).Assert(); |
189 } else { | 190 } else { |
190 JSObject::SetProperty( | 191 JSObject::SetProperty( |
191 resolved, | 192 resolved, |
192 isolate->factory()->NewStringFromAscii(CStrVector("timeZone")), | 193 factory->NewStringFromStaticAscii("timeZone"), |
193 isolate->factory()->NewStringFromTwoByte( | 194 factory->NewStringFromTwoByte( |
194 Vector<const uint16_t>( | 195 Vector<const uint16_t>( |
195 reinterpret_cast<const uint16_t*>( | 196 reinterpret_cast<const uint16_t*>( |
196 canonical_time_zone.getBuffer()), | 197 canonical_time_zone.getBuffer()), |
197 canonical_time_zone.length())), | 198 canonical_time_zone.length())).ToHandleChecked(), |
198 NONE, | 199 NONE, |
199 SLOPPY).Assert(); | 200 SLOPPY).Assert(); |
200 } | 201 } |
201 } | 202 } |
202 | 203 |
203 // Ugly hack. ICU doesn't expose numbering system in any way, so we have | 204 // Ugly hack. ICU doesn't expose numbering system in any way, so we have |
204 // to assume that for given locale NumberingSystem constructor produces the | 205 // to assume that for given locale NumberingSystem constructor produces the |
205 // same digits as NumberFormat/Calendar would. | 206 // same digits as NumberFormat/Calendar would. |
206 status = U_ZERO_ERROR; | 207 status = U_ZERO_ERROR; |
207 icu::NumberingSystem* numbering_system = | 208 icu::NumberingSystem* numbering_system = |
208 icu::NumberingSystem::createInstance(icu_locale, status); | 209 icu::NumberingSystem::createInstance(icu_locale, status); |
209 if (U_SUCCESS(status)) { | 210 if (U_SUCCESS(status)) { |
210 const char* ns = numbering_system->getName(); | 211 const char* ns = numbering_system->getName(); |
211 JSObject::SetProperty( | 212 JSObject::SetProperty( |
212 resolved, | 213 resolved, |
213 isolate->factory()->NewStringFromAscii(CStrVector("numberingSystem")), | 214 factory->NewStringFromStaticAscii("numberingSystem"), |
214 isolate->factory()->NewStringFromAscii(CStrVector(ns)), | 215 factory->NewStringFromAsciiChecked(ns), |
215 NONE, | 216 NONE, |
216 SLOPPY).Assert(); | 217 SLOPPY).Assert(); |
217 } else { | 218 } else { |
218 JSObject::SetProperty( | 219 JSObject::SetProperty( |
219 resolved, | 220 resolved, |
220 isolate->factory()->NewStringFromAscii(CStrVector("numberingSystem")), | 221 factory->NewStringFromStaticAscii("numberingSystem"), |
221 isolate->factory()->undefined_value(), | 222 factory->undefined_value(), |
222 NONE, | 223 NONE, |
223 SLOPPY).Assert(); | 224 SLOPPY).Assert(); |
224 } | 225 } |
225 delete numbering_system; | 226 delete numbering_system; |
226 | 227 |
227 // Set the locale | 228 // Set the locale |
228 char result[ULOC_FULLNAME_CAPACITY]; | 229 char result[ULOC_FULLNAME_CAPACITY]; |
229 status = U_ZERO_ERROR; | 230 status = U_ZERO_ERROR; |
230 uloc_toLanguageTag( | 231 uloc_toLanguageTag( |
231 icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); | 232 icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); |
232 if (U_SUCCESS(status)) { | 233 if (U_SUCCESS(status)) { |
233 JSObject::SetProperty( | 234 JSObject::SetProperty( |
234 resolved, | 235 resolved, |
235 isolate->factory()->NewStringFromAscii(CStrVector("locale")), | 236 factory->NewStringFromStaticAscii("locale"), |
236 isolate->factory()->NewStringFromAscii(CStrVector(result)), | 237 factory->NewStringFromAsciiChecked(result), |
237 NONE, | 238 NONE, |
238 SLOPPY).Assert(); | 239 SLOPPY).Assert(); |
239 } else { | 240 } else { |
240 // This would never happen, since we got the locale from ICU. | 241 // This would never happen, since we got the locale from ICU. |
241 JSObject::SetProperty( | 242 JSObject::SetProperty( |
242 resolved, | 243 resolved, |
243 isolate->factory()->NewStringFromAscii(CStrVector("locale")), | 244 factory->NewStringFromStaticAscii("locale"), |
244 isolate->factory()->NewStringFromAscii(CStrVector("und")), | 245 factory->NewStringFromStaticAscii("und"), |
245 NONE, | 246 NONE, |
246 SLOPPY).Assert(); | 247 SLOPPY).Assert(); |
247 } | 248 } |
248 } | 249 } |
249 | 250 |
250 | 251 |
251 template<int internal_fields, EternalHandles::SingletonHandle field> | 252 template<int internal_fields, EternalHandles::SingletonHandle field> |
252 Handle<ObjectTemplateInfo> GetEternal(Isolate* isolate) { | 253 Handle<ObjectTemplateInfo> GetEternal(Isolate* isolate) { |
253 if (isolate->eternal_handles()->Exists(field)) { | 254 if (isolate->eternal_handles()->Exists(field)) { |
254 return Handle<ObjectTemplateInfo>::cast( | 255 return Handle<ObjectTemplateInfo>::cast( |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 number_format->setRoundingMode(icu::DecimalFormat::kRoundHalfUp); | 370 number_format->setRoundingMode(icu::DecimalFormat::kRoundHalfUp); |
370 | 371 |
371 return number_format; | 372 return number_format; |
372 } | 373 } |
373 | 374 |
374 | 375 |
375 void SetResolvedNumberSettings(Isolate* isolate, | 376 void SetResolvedNumberSettings(Isolate* isolate, |
376 const icu::Locale& icu_locale, | 377 const icu::Locale& icu_locale, |
377 icu::DecimalFormat* number_format, | 378 icu::DecimalFormat* number_format, |
378 Handle<JSObject> resolved) { | 379 Handle<JSObject> resolved) { |
| 380 Factory* factory = isolate->factory(); |
379 icu::UnicodeString pattern; | 381 icu::UnicodeString pattern; |
380 number_format->toPattern(pattern); | 382 number_format->toPattern(pattern); |
381 JSObject::SetProperty( | 383 JSObject::SetProperty( |
382 resolved, | 384 resolved, |
383 isolate->factory()->NewStringFromAscii(CStrVector("pattern")), | 385 factory->NewStringFromStaticAscii("pattern"), |
384 isolate->factory()->NewStringFromTwoByte( | 386 factory->NewStringFromTwoByte( |
385 Vector<const uint16_t>( | 387 Vector<const uint16_t>( |
386 reinterpret_cast<const uint16_t*>(pattern.getBuffer()), | 388 reinterpret_cast<const uint16_t*>(pattern.getBuffer()), |
387 pattern.length())), | 389 pattern.length())).ToHandleChecked(), |
388 NONE, | 390 NONE, |
389 SLOPPY).Assert(); | 391 SLOPPY).Assert(); |
390 | 392 |
391 // Set resolved currency code in options.currency if not empty. | 393 // Set resolved currency code in options.currency if not empty. |
392 icu::UnicodeString currency(number_format->getCurrency()); | 394 icu::UnicodeString currency(number_format->getCurrency()); |
393 if (!currency.isEmpty()) { | 395 if (!currency.isEmpty()) { |
394 JSObject::SetProperty( | 396 JSObject::SetProperty( |
395 resolved, | 397 resolved, |
396 isolate->factory()->NewStringFromAscii(CStrVector("currency")), | 398 factory->NewStringFromStaticAscii("currency"), |
397 isolate->factory()->NewStringFromTwoByte( | 399 factory->NewStringFromTwoByte( |
398 Vector<const uint16_t>( | 400 Vector<const uint16_t>( |
399 reinterpret_cast<const uint16_t*>(currency.getBuffer()), | 401 reinterpret_cast<const uint16_t*>(currency.getBuffer()), |
400 currency.length())), | 402 currency.length())).ToHandleChecked(), |
401 NONE, | 403 NONE, |
402 SLOPPY).Assert(); | 404 SLOPPY).Assert(); |
403 } | 405 } |
404 | 406 |
405 // Ugly hack. ICU doesn't expose numbering system in any way, so we have | 407 // Ugly hack. ICU doesn't expose numbering system in any way, so we have |
406 // to assume that for given locale NumberingSystem constructor produces the | 408 // to assume that for given locale NumberingSystem constructor produces the |
407 // same digits as NumberFormat/Calendar would. | 409 // same digits as NumberFormat/Calendar would. |
408 UErrorCode status = U_ZERO_ERROR; | 410 UErrorCode status = U_ZERO_ERROR; |
409 icu::NumberingSystem* numbering_system = | 411 icu::NumberingSystem* numbering_system = |
410 icu::NumberingSystem::createInstance(icu_locale, status); | 412 icu::NumberingSystem::createInstance(icu_locale, status); |
411 if (U_SUCCESS(status)) { | 413 if (U_SUCCESS(status)) { |
412 const char* ns = numbering_system->getName(); | 414 const char* ns = numbering_system->getName(); |
413 JSObject::SetProperty( | 415 JSObject::SetProperty( |
414 resolved, | 416 resolved, |
415 isolate->factory()->NewStringFromAscii(CStrVector("numberingSystem")), | 417 factory->NewStringFromStaticAscii("numberingSystem"), |
416 isolate->factory()->NewStringFromAscii(CStrVector(ns)), | 418 factory->NewStringFromAsciiChecked(ns), |
417 NONE, | 419 NONE, |
418 SLOPPY).Assert(); | 420 SLOPPY).Assert(); |
419 } else { | 421 } else { |
420 JSObject::SetProperty( | 422 JSObject::SetProperty( |
421 resolved, | 423 resolved, |
422 isolate->factory()->NewStringFromAscii(CStrVector("numberingSystem")), | 424 factory->NewStringFromStaticAscii("numberingSystem"), |
423 isolate->factory()->undefined_value(), | 425 factory->undefined_value(), |
424 NONE, | 426 NONE, |
425 SLOPPY).Assert(); | 427 SLOPPY).Assert(); |
426 } | 428 } |
427 delete numbering_system; | 429 delete numbering_system; |
428 | 430 |
429 JSObject::SetProperty( | 431 JSObject::SetProperty( |
430 resolved, | 432 resolved, |
431 isolate->factory()->NewStringFromAscii(CStrVector("useGrouping")), | 433 factory->NewStringFromStaticAscii("useGrouping"), |
432 isolate->factory()->ToBoolean(number_format->isGroupingUsed()), | 434 factory->ToBoolean(number_format->isGroupingUsed()), |
433 NONE, | 435 NONE, |
434 SLOPPY).Assert(); | 436 SLOPPY).Assert(); |
435 | 437 |
436 JSObject::SetProperty( | 438 JSObject::SetProperty( |
437 resolved, | 439 resolved, |
438 isolate->factory()->NewStringFromAscii( | 440 factory->NewStringFromStaticAscii("minimumIntegerDigits"), |
439 CStrVector("minimumIntegerDigits")), | 441 factory->NewNumberFromInt(number_format->getMinimumIntegerDigits()), |
440 isolate->factory()->NewNumberFromInt( | |
441 number_format->getMinimumIntegerDigits()), | |
442 NONE, | 442 NONE, |
443 SLOPPY).Assert(); | 443 SLOPPY).Assert(); |
444 | 444 |
445 JSObject::SetProperty( | 445 JSObject::SetProperty( |
446 resolved, | 446 resolved, |
447 isolate->factory()->NewStringFromAscii( | 447 factory->NewStringFromStaticAscii("minimumFractionDigits"), |
448 CStrVector("minimumFractionDigits")), | 448 factory->NewNumberFromInt(number_format->getMinimumFractionDigits()), |
449 isolate->factory()->NewNumberFromInt( | |
450 number_format->getMinimumFractionDigits()), | |
451 NONE, | 449 NONE, |
452 SLOPPY).Assert(); | 450 SLOPPY).Assert(); |
453 | 451 |
454 JSObject::SetProperty( | 452 JSObject::SetProperty( |
455 resolved, | 453 resolved, |
456 isolate->factory()->NewStringFromAscii( | 454 factory->NewStringFromStaticAscii("maximumFractionDigits"), |
457 CStrVector("maximumFractionDigits")), | 455 factory->NewNumberFromInt(number_format->getMaximumFractionDigits()), |
458 isolate->factory()->NewNumberFromInt( | |
459 number_format->getMaximumFractionDigits()), | |
460 NONE, | 456 NONE, |
461 SLOPPY).Assert(); | 457 SLOPPY).Assert(); |
462 | 458 |
463 Handle<String> key = isolate->factory()->NewStringFromAscii( | 459 Handle<String> key = |
464 CStrVector("minimumSignificantDigits")); | 460 factory->NewStringFromStaticAscii("minimumSignificantDigits"); |
465 if (JSReceiver::HasLocalProperty(resolved, key)) { | 461 if (JSReceiver::HasLocalProperty(resolved, key)) { |
466 JSObject::SetProperty( | 462 JSObject::SetProperty( |
467 resolved, | 463 resolved, |
468 isolate->factory()->NewStringFromAscii( | 464 factory->NewStringFromStaticAscii("minimumSignificantDigits"), |
469 CStrVector("minimumSignificantDigits")), | 465 factory->NewNumberFromInt(number_format->getMinimumSignificantDigits()), |
470 isolate->factory()->NewNumberFromInt( | |
471 number_format->getMinimumSignificantDigits()), | |
472 NONE, | 466 NONE, |
473 SLOPPY).Assert(); | 467 SLOPPY).Assert(); |
474 } | 468 } |
475 | 469 |
476 key = isolate->factory()->NewStringFromAscii( | 470 key = factory->NewStringFromStaticAscii("maximumSignificantDigits"); |
477 CStrVector("maximumSignificantDigits")); | |
478 if (JSReceiver::HasLocalProperty(resolved, key)) { | 471 if (JSReceiver::HasLocalProperty(resolved, key)) { |
479 JSObject::SetProperty( | 472 JSObject::SetProperty( |
480 resolved, | 473 resolved, |
481 isolate->factory()->NewStringFromAscii( | 474 factory->NewStringFromStaticAscii("maximumSignificantDigits"), |
482 CStrVector("maximumSignificantDigits")), | 475 factory->NewNumberFromInt(number_format->getMaximumSignificantDigits()), |
483 isolate->factory()->NewNumberFromInt( | |
484 number_format->getMaximumSignificantDigits()), | |
485 NONE, | 476 NONE, |
486 SLOPPY).Assert(); | 477 SLOPPY).Assert(); |
487 } | 478 } |
488 | 479 |
489 // Set the locale | 480 // Set the locale |
490 char result[ULOC_FULLNAME_CAPACITY]; | 481 char result[ULOC_FULLNAME_CAPACITY]; |
491 status = U_ZERO_ERROR; | 482 status = U_ZERO_ERROR; |
492 uloc_toLanguageTag( | 483 uloc_toLanguageTag( |
493 icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); | 484 icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); |
494 if (U_SUCCESS(status)) { | 485 if (U_SUCCESS(status)) { |
495 JSObject::SetProperty( | 486 JSObject::SetProperty( |
496 resolved, | 487 resolved, |
497 isolate->factory()->NewStringFromAscii(CStrVector("locale")), | 488 factory->NewStringFromStaticAscii("locale"), |
498 isolate->factory()->NewStringFromAscii(CStrVector(result)), | 489 factory->NewStringFromAsciiChecked(result), |
499 NONE, | 490 NONE, |
500 SLOPPY).Assert(); | 491 SLOPPY).Assert(); |
501 } else { | 492 } else { |
502 // This would never happen, since we got the locale from ICU. | 493 // This would never happen, since we got the locale from ICU. |
503 JSObject::SetProperty( | 494 JSObject::SetProperty( |
504 resolved, | 495 resolved, |
505 isolate->factory()->NewStringFromAscii(CStrVector("locale")), | 496 factory->NewStringFromStaticAscii("locale"), |
506 isolate->factory()->NewStringFromAscii(CStrVector("und")), | 497 factory->NewStringFromStaticAscii("und"), |
507 NONE, | 498 NONE, |
508 SLOPPY).Assert(); | 499 SLOPPY).Assert(); |
509 } | 500 } |
510 } | 501 } |
511 | 502 |
512 | 503 |
513 icu::Collator* CreateICUCollator( | 504 icu::Collator* CreateICUCollator( |
514 Isolate* isolate, | 505 Isolate* isolate, |
515 const icu::Locale& icu_locale, | 506 const icu::Locale& icu_locale, |
516 Handle<JSObject> options) { | 507 Handle<JSObject> options) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 } | 562 } |
572 | 563 |
573 return collator; | 564 return collator; |
574 } | 565 } |
575 | 566 |
576 | 567 |
577 void SetResolvedCollatorSettings(Isolate* isolate, | 568 void SetResolvedCollatorSettings(Isolate* isolate, |
578 const icu::Locale& icu_locale, | 569 const icu::Locale& icu_locale, |
579 icu::Collator* collator, | 570 icu::Collator* collator, |
580 Handle<JSObject> resolved) { | 571 Handle<JSObject> resolved) { |
| 572 Factory* factory = isolate->factory(); |
581 UErrorCode status = U_ZERO_ERROR; | 573 UErrorCode status = U_ZERO_ERROR; |
582 | 574 |
583 JSObject::SetProperty( | 575 JSObject::SetProperty( |
584 resolved, | 576 resolved, |
585 isolate->factory()->NewStringFromAscii(CStrVector("numeric")), | 577 factory->NewStringFromStaticAscii("numeric"), |
586 isolate->factory()->ToBoolean( | 578 factory->ToBoolean( |
587 collator->getAttribute(UCOL_NUMERIC_COLLATION, status) == UCOL_ON), | 579 collator->getAttribute(UCOL_NUMERIC_COLLATION, status) == UCOL_ON), |
588 NONE, | 580 NONE, |
589 SLOPPY).Assert(); | 581 SLOPPY).Assert(); |
590 | 582 |
591 switch (collator->getAttribute(UCOL_CASE_FIRST, status)) { | 583 switch (collator->getAttribute(UCOL_CASE_FIRST, status)) { |
592 case UCOL_LOWER_FIRST: | 584 case UCOL_LOWER_FIRST: |
593 JSObject::SetProperty( | 585 JSObject::SetProperty( |
594 resolved, | 586 resolved, |
595 isolate->factory()->NewStringFromAscii(CStrVector("caseFirst")), | 587 factory->NewStringFromStaticAscii("caseFirst"), |
596 isolate->factory()->NewStringFromAscii(CStrVector("lower")), | 588 factory->NewStringFromStaticAscii("lower"), |
597 NONE, | 589 NONE, |
598 SLOPPY).Assert(); | 590 SLOPPY).Assert(); |
599 break; | 591 break; |
600 case UCOL_UPPER_FIRST: | 592 case UCOL_UPPER_FIRST: |
601 JSObject::SetProperty( | 593 JSObject::SetProperty( |
602 resolved, | 594 resolved, |
603 isolate->factory()->NewStringFromAscii(CStrVector("caseFirst")), | 595 factory->NewStringFromStaticAscii("caseFirst"), |
604 isolate->factory()->NewStringFromAscii(CStrVector("upper")), | 596 factory->NewStringFromStaticAscii("upper"), |
605 NONE, | 597 NONE, |
606 SLOPPY).Assert(); | 598 SLOPPY).Assert(); |
607 break; | 599 break; |
608 default: | 600 default: |
609 JSObject::SetProperty( | 601 JSObject::SetProperty( |
610 resolved, | 602 resolved, |
611 isolate->factory()->NewStringFromAscii(CStrVector("caseFirst")), | 603 factory->NewStringFromStaticAscii("caseFirst"), |
612 isolate->factory()->NewStringFromAscii(CStrVector("false")), | 604 factory->NewStringFromStaticAscii("false"), |
613 NONE, | 605 NONE, |
614 SLOPPY).Assert(); | 606 SLOPPY).Assert(); |
615 } | 607 } |
616 | 608 |
617 switch (collator->getAttribute(UCOL_STRENGTH, status)) { | 609 switch (collator->getAttribute(UCOL_STRENGTH, status)) { |
618 case UCOL_PRIMARY: { | 610 case UCOL_PRIMARY: { |
619 JSObject::SetProperty( | 611 JSObject::SetProperty( |
620 resolved, | 612 resolved, |
621 isolate->factory()->NewStringFromAscii(CStrVector("strength")), | 613 factory->NewStringFromStaticAscii("strength"), |
622 isolate->factory()->NewStringFromAscii(CStrVector("primary")), | 614 factory->NewStringFromStaticAscii("primary"), |
623 NONE, | 615 NONE, |
624 SLOPPY).Assert(); | 616 SLOPPY).Assert(); |
625 | 617 |
626 // case level: true + s1 -> case, s1 -> base. | 618 // case level: true + s1 -> case, s1 -> base. |
627 if (UCOL_ON == collator->getAttribute(UCOL_CASE_LEVEL, status)) { | 619 if (UCOL_ON == collator->getAttribute(UCOL_CASE_LEVEL, status)) { |
628 JSObject::SetProperty( | 620 JSObject::SetProperty( |
629 resolved, | 621 resolved, |
630 isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")), | 622 factory->NewStringFromStaticAscii("sensitivity"), |
631 isolate->factory()->NewStringFromAscii(CStrVector("case")), | 623 factory->NewStringFromStaticAscii("case"), |
632 NONE, | 624 NONE, |
633 SLOPPY).Assert(); | 625 SLOPPY).Assert(); |
634 } else { | 626 } else { |
635 JSObject::SetProperty( | 627 JSObject::SetProperty( |
636 resolved, | 628 resolved, |
637 isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")), | 629 factory->NewStringFromStaticAscii("sensitivity"), |
638 isolate->factory()->NewStringFromAscii(CStrVector("base")), | 630 factory->NewStringFromStaticAscii("base"), |
639 NONE, | 631 NONE, |
640 SLOPPY).Assert(); | 632 SLOPPY).Assert(); |
641 } | 633 } |
642 break; | 634 break; |
643 } | 635 } |
644 case UCOL_SECONDARY: | 636 case UCOL_SECONDARY: |
645 JSObject::SetProperty( | 637 JSObject::SetProperty( |
646 resolved, | 638 resolved, |
647 isolate->factory()->NewStringFromAscii(CStrVector("strength")), | 639 factory->NewStringFromStaticAscii("strength"), |
648 isolate->factory()->NewStringFromAscii(CStrVector("secondary")), | 640 factory->NewStringFromStaticAscii("secondary"), |
649 NONE, | 641 NONE, |
650 SLOPPY).Assert(); | 642 SLOPPY).Assert(); |
651 JSObject::SetProperty( | 643 JSObject::SetProperty( |
652 resolved, | 644 resolved, |
653 isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")), | 645 factory->NewStringFromStaticAscii("sensitivity"), |
654 isolate->factory()->NewStringFromAscii(CStrVector("accent")), | 646 factory->NewStringFromStaticAscii("accent"), |
655 NONE, | 647 NONE, |
656 SLOPPY).Assert(); | 648 SLOPPY).Assert(); |
657 break; | 649 break; |
658 case UCOL_TERTIARY: | 650 case UCOL_TERTIARY: |
659 JSObject::SetProperty( | 651 JSObject::SetProperty( |
660 resolved, | 652 resolved, |
661 isolate->factory()->NewStringFromAscii(CStrVector("strength")), | 653 factory->NewStringFromStaticAscii("strength"), |
662 isolate->factory()->NewStringFromAscii(CStrVector("tertiary")), | 654 factory->NewStringFromStaticAscii("tertiary"), |
663 NONE, | 655 NONE, |
664 SLOPPY).Assert(); | 656 SLOPPY).Assert(); |
665 JSObject::SetProperty( | 657 JSObject::SetProperty( |
666 resolved, | 658 resolved, |
667 isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")), | 659 factory->NewStringFromStaticAscii("sensitivity"), |
668 isolate->factory()->NewStringFromAscii(CStrVector("variant")), | 660 factory->NewStringFromStaticAscii("variant"), |
669 NONE, | 661 NONE, |
670 SLOPPY).Assert(); | 662 SLOPPY).Assert(); |
671 break; | 663 break; |
672 case UCOL_QUATERNARY: | 664 case UCOL_QUATERNARY: |
673 // We shouldn't get quaternary and identical from ICU, but if we do | 665 // We shouldn't get quaternary and identical from ICU, but if we do |
674 // put them into variant. | 666 // put them into variant. |
675 JSObject::SetProperty( | 667 JSObject::SetProperty( |
676 resolved, | 668 resolved, |
677 isolate->factory()->NewStringFromAscii(CStrVector("strength")), | 669 factory->NewStringFromStaticAscii("strength"), |
678 isolate->factory()->NewStringFromAscii(CStrVector("quaternary")), | 670 factory->NewStringFromStaticAscii("quaternary"), |
679 NONE, | 671 NONE, |
680 SLOPPY).Assert(); | 672 SLOPPY).Assert(); |
681 JSObject::SetProperty( | 673 JSObject::SetProperty( |
682 resolved, | 674 resolved, |
683 isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")), | 675 factory->NewStringFromStaticAscii("sensitivity"), |
684 isolate->factory()->NewStringFromAscii(CStrVector("variant")), | 676 factory->NewStringFromStaticAscii("variant"), |
685 NONE, | 677 NONE, |
686 SLOPPY).Assert(); | 678 SLOPPY).Assert(); |
687 break; | 679 break; |
688 default: | 680 default: |
689 JSObject::SetProperty( | 681 JSObject::SetProperty( |
690 resolved, | 682 resolved, |
691 isolate->factory()->NewStringFromAscii(CStrVector("strength")), | 683 factory->NewStringFromStaticAscii("strength"), |
692 isolate->factory()->NewStringFromAscii(CStrVector("identical")), | 684 factory->NewStringFromStaticAscii("identical"), |
693 NONE, | 685 NONE, |
694 SLOPPY).Assert(); | 686 SLOPPY).Assert(); |
695 JSObject::SetProperty( | 687 JSObject::SetProperty( |
696 resolved, | 688 resolved, |
697 isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")), | 689 factory->NewStringFromStaticAscii("sensitivity"), |
698 isolate->factory()->NewStringFromAscii(CStrVector("variant")), | 690 factory->NewStringFromStaticAscii("variant"), |
699 NONE, | 691 NONE, |
700 SLOPPY).Assert(); | 692 SLOPPY).Assert(); |
701 } | 693 } |
702 | 694 |
703 JSObject::SetProperty( | 695 JSObject::SetProperty( |
704 resolved, | 696 resolved, |
705 isolate->factory()->NewStringFromAscii(CStrVector("ignorePunctuation")), | 697 factory->NewStringFromStaticAscii("ignorePunctuation"), |
706 isolate->factory()->ToBoolean(collator->getAttribute( | 698 factory->ToBoolean(collator->getAttribute( |
707 UCOL_ALTERNATE_HANDLING, status) == UCOL_SHIFTED), | 699 UCOL_ALTERNATE_HANDLING, status) == UCOL_SHIFTED), |
708 NONE, | 700 NONE, |
709 SLOPPY).Assert(); | 701 SLOPPY).Assert(); |
710 | 702 |
711 // Set the locale | 703 // Set the locale |
712 char result[ULOC_FULLNAME_CAPACITY]; | 704 char result[ULOC_FULLNAME_CAPACITY]; |
713 status = U_ZERO_ERROR; | 705 status = U_ZERO_ERROR; |
714 uloc_toLanguageTag( | 706 uloc_toLanguageTag( |
715 icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); | 707 icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); |
716 if (U_SUCCESS(status)) { | 708 if (U_SUCCESS(status)) { |
717 JSObject::SetProperty( | 709 JSObject::SetProperty( |
718 resolved, | 710 resolved, |
719 isolate->factory()->NewStringFromAscii(CStrVector("locale")), | 711 factory->NewStringFromStaticAscii("locale"), |
720 isolate->factory()->NewStringFromAscii(CStrVector(result)), | 712 factory->NewStringFromAsciiChecked(result), |
721 NONE, | 713 NONE, |
722 SLOPPY).Assert(); | 714 SLOPPY).Assert(); |
723 } else { | 715 } else { |
724 // This would never happen, since we got the locale from ICU. | 716 // This would never happen, since we got the locale from ICU. |
725 JSObject::SetProperty( | 717 JSObject::SetProperty( |
726 resolved, | 718 resolved, |
727 isolate->factory()->NewStringFromAscii(CStrVector("locale")), | 719 factory->NewStringFromStaticAscii("locale"), |
728 isolate->factory()->NewStringFromAscii(CStrVector("und")), | 720 factory->NewStringFromStaticAscii("und"), |
729 NONE, | 721 NONE, |
730 SLOPPY).Assert(); | 722 SLOPPY).Assert(); |
731 } | 723 } |
732 } | 724 } |
733 | 725 |
734 | 726 |
735 icu::BreakIterator* CreateICUBreakIterator( | 727 icu::BreakIterator* CreateICUBreakIterator( |
736 Isolate* isolate, | 728 Isolate* isolate, |
737 const icu::Locale& icu_locale, | 729 const icu::Locale& icu_locale, |
738 Handle<JSObject> options) { | 730 Handle<JSObject> options) { |
(...skipping 23 matching lines...) Expand all Loading... |
762 } | 754 } |
763 | 755 |
764 return break_iterator; | 756 return break_iterator; |
765 } | 757 } |
766 | 758 |
767 | 759 |
768 void SetResolvedBreakIteratorSettings(Isolate* isolate, | 760 void SetResolvedBreakIteratorSettings(Isolate* isolate, |
769 const icu::Locale& icu_locale, | 761 const icu::Locale& icu_locale, |
770 icu::BreakIterator* break_iterator, | 762 icu::BreakIterator* break_iterator, |
771 Handle<JSObject> resolved) { | 763 Handle<JSObject> resolved) { |
| 764 Factory* factory = isolate->factory(); |
772 UErrorCode status = U_ZERO_ERROR; | 765 UErrorCode status = U_ZERO_ERROR; |
773 | 766 |
774 // Set the locale | 767 // Set the locale |
775 char result[ULOC_FULLNAME_CAPACITY]; | 768 char result[ULOC_FULLNAME_CAPACITY]; |
776 status = U_ZERO_ERROR; | 769 status = U_ZERO_ERROR; |
777 uloc_toLanguageTag( | 770 uloc_toLanguageTag( |
778 icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); | 771 icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); |
779 if (U_SUCCESS(status)) { | 772 if (U_SUCCESS(status)) { |
780 JSObject::SetProperty( | 773 JSObject::SetProperty( |
781 resolved, | 774 resolved, |
782 isolate->factory()->NewStringFromAscii(CStrVector("locale")), | 775 factory->NewStringFromStaticAscii("locale"), |
783 isolate->factory()->NewStringFromAscii(CStrVector(result)), | 776 factory->NewStringFromAsciiChecked(result), |
784 NONE, | 777 NONE, |
785 SLOPPY).Assert(); | 778 SLOPPY).Assert(); |
786 } else { | 779 } else { |
787 // This would never happen, since we got the locale from ICU. | 780 // This would never happen, since we got the locale from ICU. |
788 JSObject::SetProperty( | 781 JSObject::SetProperty( |
789 resolved, | 782 resolved, |
790 isolate->factory()->NewStringFromAscii(CStrVector("locale")), | 783 factory->NewStringFromStaticAscii("locale"), |
791 isolate->factory()->NewStringFromAscii(CStrVector("und")), | 784 factory->NewStringFromStaticAscii("und"), |
792 NONE, | 785 NONE, |
793 SLOPPY).Assert(); | 786 SLOPPY).Assert(); |
794 } | 787 } |
795 } | 788 } |
796 | 789 |
797 } // namespace | 790 } // namespace |
798 | 791 |
799 | 792 |
800 // static | 793 // static |
801 Handle<ObjectTemplateInfo> I18N::GetTemplate(Isolate* isolate) { | 794 Handle<ObjectTemplateInfo> I18N::GetTemplate(Isolate* isolate) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 } | 838 } |
846 | 839 |
847 return date_format; | 840 return date_format; |
848 } | 841 } |
849 | 842 |
850 | 843 |
851 icu::SimpleDateFormat* DateFormat::UnpackDateFormat( | 844 icu::SimpleDateFormat* DateFormat::UnpackDateFormat( |
852 Isolate* isolate, | 845 Isolate* isolate, |
853 Handle<JSObject> obj) { | 846 Handle<JSObject> obj) { |
854 Handle<String> key = | 847 Handle<String> key = |
855 isolate->factory()->NewStringFromAscii(CStrVector("dateFormat")); | 848 isolate->factory()->NewStringFromStaticAscii("dateFormat"); |
856 if (JSReceiver::HasLocalProperty(obj, key)) { | 849 if (JSReceiver::HasLocalProperty(obj, key)) { |
857 return reinterpret_cast<icu::SimpleDateFormat*>( | 850 return reinterpret_cast<icu::SimpleDateFormat*>( |
858 obj->GetInternalField(0)); | 851 obj->GetInternalField(0)); |
859 } | 852 } |
860 | 853 |
861 return NULL; | 854 return NULL; |
862 } | 855 } |
863 | 856 |
864 | 857 |
865 template<class T> | 858 template<class T> |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 } | 912 } |
920 | 913 |
921 return number_format; | 914 return number_format; |
922 } | 915 } |
923 | 916 |
924 | 917 |
925 icu::DecimalFormat* NumberFormat::UnpackNumberFormat( | 918 icu::DecimalFormat* NumberFormat::UnpackNumberFormat( |
926 Isolate* isolate, | 919 Isolate* isolate, |
927 Handle<JSObject> obj) { | 920 Handle<JSObject> obj) { |
928 Handle<String> key = | 921 Handle<String> key = |
929 isolate->factory()->NewStringFromAscii(CStrVector("numberFormat")); | 922 isolate->factory()->NewStringFromStaticAscii("numberFormat"); |
930 if (JSReceiver::HasLocalProperty(obj, key)) { | 923 if (JSReceiver::HasLocalProperty(obj, key)) { |
931 return reinterpret_cast<icu::DecimalFormat*>(obj->GetInternalField(0)); | 924 return reinterpret_cast<icu::DecimalFormat*>(obj->GetInternalField(0)); |
932 } | 925 } |
933 | 926 |
934 return NULL; | 927 return NULL; |
935 } | 928 } |
936 | 929 |
937 | 930 |
938 void NumberFormat::DeleteNumberFormat( | 931 void NumberFormat::DeleteNumberFormat( |
939 const v8::WeakCallbackData<v8::Value, void>& data) { | 932 const v8::WeakCallbackData<v8::Value, void>& data) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 } else { | 967 } else { |
975 SetResolvedCollatorSettings(isolate, icu_locale, collator, resolved); | 968 SetResolvedCollatorSettings(isolate, icu_locale, collator, resolved); |
976 } | 969 } |
977 | 970 |
978 return collator; | 971 return collator; |
979 } | 972 } |
980 | 973 |
981 | 974 |
982 icu::Collator* Collator::UnpackCollator(Isolate* isolate, | 975 icu::Collator* Collator::UnpackCollator(Isolate* isolate, |
983 Handle<JSObject> obj) { | 976 Handle<JSObject> obj) { |
984 Handle<String> key = | 977 Handle<String> key = isolate->factory()->NewStringFromStaticAscii("collator"); |
985 isolate->factory()->NewStringFromAscii(CStrVector("collator")); | |
986 if (JSReceiver::HasLocalProperty(obj, key)) { | 978 if (JSReceiver::HasLocalProperty(obj, key)) { |
987 return reinterpret_cast<icu::Collator*>(obj->GetInternalField(0)); | 979 return reinterpret_cast<icu::Collator*>(obj->GetInternalField(0)); |
988 } | 980 } |
989 | 981 |
990 return NULL; | 982 return NULL; |
991 } | 983 } |
992 | 984 |
993 | 985 |
994 void Collator::DeleteCollator( | 986 void Collator::DeleteCollator( |
995 const v8::WeakCallbackData<v8::Value, void>& data) { | 987 const v8::WeakCallbackData<v8::Value, void>& data) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1034 isolate, icu_locale, break_iterator, resolved); | 1026 isolate, icu_locale, break_iterator, resolved); |
1035 } | 1027 } |
1036 | 1028 |
1037 return break_iterator; | 1029 return break_iterator; |
1038 } | 1030 } |
1039 | 1031 |
1040 | 1032 |
1041 icu::BreakIterator* BreakIterator::UnpackBreakIterator(Isolate* isolate, | 1033 icu::BreakIterator* BreakIterator::UnpackBreakIterator(Isolate* isolate, |
1042 Handle<JSObject> obj) { | 1034 Handle<JSObject> obj) { |
1043 Handle<String> key = | 1035 Handle<String> key = |
1044 isolate->factory()->NewStringFromAscii(CStrVector("breakIterator")); | 1036 isolate->factory()->NewStringFromStaticAscii("breakIterator"); |
1045 if (JSReceiver::HasLocalProperty(obj, key)) { | 1037 if (JSReceiver::HasLocalProperty(obj, key)) { |
1046 return reinterpret_cast<icu::BreakIterator*>(obj->GetInternalField(0)); | 1038 return reinterpret_cast<icu::BreakIterator*>(obj->GetInternalField(0)); |
1047 } | 1039 } |
1048 | 1040 |
1049 return NULL; | 1041 return NULL; |
1050 } | 1042 } |
1051 | 1043 |
1052 | 1044 |
1053 void BreakIterator::DeleteBreakIterator( | 1045 void BreakIterator::DeleteBreakIterator( |
1054 const v8::WeakCallbackData<v8::Value, void>& data) { | 1046 const v8::WeakCallbackData<v8::Value, void>& data) { |
1055 DeleteNativeObjectAt<icu::BreakIterator>(data, 0); | 1047 DeleteNativeObjectAt<icu::BreakIterator>(data, 0); |
1056 DeleteNativeObjectAt<icu::UnicodeString>(data, 1); | 1048 DeleteNativeObjectAt<icu::UnicodeString>(data, 1); |
1057 DestroyGlobalHandle(data); | 1049 DestroyGlobalHandle(data); |
1058 } | 1050 } |
1059 | 1051 |
1060 } } // namespace v8::internal | 1052 } } // namespace v8::internal |
OLD | NEW |