OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
59 #include "runtime.h" | 59 #include "runtime.h" |
60 #include "scopeinfo.h" | 60 #include "scopeinfo.h" |
61 #include "smart-pointers.h" | 61 #include "smart-pointers.h" |
62 #include "string-search.h" | 62 #include "string-search.h" |
63 #include "stub-cache.h" | 63 #include "stub-cache.h" |
64 #include "uri.h" | 64 #include "uri.h" |
65 #include "v8conversions.h" | 65 #include "v8conversions.h" |
66 #include "v8threads.h" | 66 #include "v8threads.h" |
67 #include "vm-state-inl.h" | 67 #include "vm-state-inl.h" |
68 | 68 |
69 #ifdef V8_I18N_SUPPORT | |
70 #include "unicode/brkiter.h" | |
71 #include "unicode/coll.h" | |
72 #include "unicode/datefmt.h" | |
73 #include "unicode/numfmt.h" | |
74 #include "unicode/uloc.h" | |
75 #include "unicode/uversion.h" | |
76 #endif | |
77 | |
69 #ifndef _STLP_VENDOR_CSTD | 78 #ifndef _STLP_VENDOR_CSTD |
70 // STLPort doesn't import fpclassify and isless into the std namespace. | 79 // STLPort doesn't import fpclassify and isless into the std namespace. |
71 using std::fpclassify; | 80 using std::fpclassify; |
72 using std::isless; | 81 using std::isless; |
73 #endif | 82 #endif |
74 | 83 |
75 namespace v8 { | 84 namespace v8 { |
76 namespace internal { | 85 namespace internal { |
77 | 86 |
78 | 87 |
(...skipping 13276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13355 int usage = static_cast<int>(isolate->heap()->SizeOfObjects()); | 13364 int usage = static_cast<int>(isolate->heap()->SizeOfObjects()); |
13356 if (!Smi::IsValid(usage)) { | 13365 if (!Smi::IsValid(usage)) { |
13357 return *isolate->factory()->NewNumberFromInt(usage); | 13366 return *isolate->factory()->NewNumberFromInt(usage); |
13358 } | 13367 } |
13359 return Smi::FromInt(usage); | 13368 return Smi::FromInt(usage); |
13360 } | 13369 } |
13361 | 13370 |
13362 #endif // ENABLE_DEBUGGER_SUPPORT | 13371 #endif // ENABLE_DEBUGGER_SUPPORT |
13363 | 13372 |
13364 | 13373 |
13374 #ifdef V8_I18N_SUPPORT | |
13375 RUNTIME_FUNCTION(MaybeObject*, Runtime_CanonicalizeLanguageTag) { | |
13376 HandleScope scope(isolate); | |
13377 | |
Michael Starzinger
2013/08/01 09:58:20
nit: Can we add asserts that check the number of a
| |
13378 CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0); | |
13379 | |
13380 v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str)); | |
13381 | |
13382 // Return value which denotes invalid language tag. | |
13383 const char* const kInvalidTag = "invalid-tag"; | |
13384 | |
13385 UErrorCode error = U_ZERO_ERROR; | |
13386 char icu_result[ULOC_FULLNAME_CAPACITY]; | |
13387 int icu_length = 0; | |
13388 | |
13389 uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY, | |
13390 &icu_length, &error); | |
13391 if (U_FAILURE(error) || icu_length == 0) { | |
13392 return isolate->heap()->AllocateStringFromOneByte(CStrVector(kInvalidTag)); | |
13393 } | |
13394 | |
13395 char result[ULOC_FULLNAME_CAPACITY]; | |
13396 | |
13397 // Force strict BCP47 rules. | |
13398 uloc_toLanguageTag(icu_result, result, ULOC_FULLNAME_CAPACITY, TRUE, &error); | |
13399 | |
13400 if (U_FAILURE(error)) { | |
13401 return isolate->heap()->AllocateStringFromOneByte(CStrVector(kInvalidTag)); | |
13402 } | |
13403 | |
13404 return isolate->heap()->AllocateStringFromOneByte(CStrVector(result)); | |
13405 } | |
13406 | |
13407 | |
13408 RUNTIME_FUNCTION(MaybeObject*, Runtime_AvailableLocalesOf) { | |
13409 HandleScope scope(isolate); | |
13410 | |
Michael Starzinger
2013/08/01 09:58:20
Likewise.
| |
13411 CONVERT_ARG_HANDLE_CHECKED(String, service, 0); | |
13412 | |
13413 const icu::Locale* available_locales = NULL; | |
13414 int32_t count = 0; | |
13415 | |
13416 if (service->IsUtf8EqualTo(CStrVector("collator"))) { | |
13417 available_locales = icu::Collator::getAvailableLocales(count); | |
13418 } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) { | |
13419 available_locales = icu::NumberFormat::getAvailableLocales(count); | |
13420 } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) { | |
13421 available_locales = icu::DateFormat::getAvailableLocales(count); | |
13422 } else if (service->IsUtf8EqualTo(CStrVector("breakiterator"))) { | |
13423 available_locales = icu::BreakIterator::getAvailableLocales(count); | |
13424 } | |
13425 | |
13426 UErrorCode error = U_ZERO_ERROR; | |
13427 char result[ULOC_FULLNAME_CAPACITY]; | |
13428 Handle<JSObject> locales = | |
13429 isolate->factory()->NewJSObject(isolate->object_function()); | |
13430 | |
13431 for (int32_t i = 0; i < count; ++i) { | |
13432 const char* icu_name = available_locales[i].getName(); | |
13433 | |
13434 error = U_ZERO_ERROR; | |
13435 // No need to force strict BCP47 rules. | |
13436 uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error); | |
13437 if (U_FAILURE(error)) { | |
13438 // This shouldn't happen, but lets not break the user. | |
13439 continue; | |
13440 } | |
13441 | |
13442 RETURN_IF_EMPTY_HANDLE(isolate, | |
13443 JSObject::SetLocalPropertyIgnoreAttributes( | |
13444 locales, | |
13445 isolate->factory()->NewStringFromAscii(CStrVector(result)), | |
13446 isolate->factory()->NewNumber(i), | |
13447 NONE)); | |
13448 } | |
13449 | |
13450 return *locales; | |
13451 } | |
13452 | |
13453 | |
13454 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultICULocale) { | |
13455 SealHandleScope shs(isolate); | |
13456 | |
Michael Starzinger
2013/08/01 09:58:20
Likewise.
| |
13457 icu::Locale default_locale; | |
13458 | |
13459 // Set the locale | |
13460 char result[ULOC_FULLNAME_CAPACITY]; | |
13461 UErrorCode status = U_ZERO_ERROR; | |
13462 uloc_toLanguageTag( | |
13463 default_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); | |
13464 if (U_SUCCESS(status)) { | |
13465 return isolate->heap()->AllocateStringFromOneByte(CStrVector(result)); | |
13466 } | |
13467 | |
13468 return isolate->heap()->AllocateStringFromOneByte(CStrVector("und")); | |
13469 } | |
13470 | |
13471 | |
13472 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLanguageTagVariants) { | |
13473 HandleScope scope(isolate); | |
13474 | |
Michael Starzinger
2013/08/01 09:58:20
Likewise.
| |
13475 CONVERT_ARG_HANDLE_CHECKED(JSArray, input, 0); | |
13476 | |
13477 uint32_t length = static_cast<uint32_t>(input->length()->Number()); | |
13478 Handle<FixedArray> output = isolate->factory()->NewFixedArray(length); | |
13479 Handle<Name> maximized = | |
13480 isolate->factory()->NewStringFromAscii(CStrVector("maximized")); | |
13481 Handle<Name> base = | |
13482 isolate->factory()->NewStringFromAscii(CStrVector("base")); | |
13483 for (unsigned int i = 0; i < length; ++i) { | |
13484 MaybeObject* maybe_string = input->GetElement(i); | |
13485 Object* locale_id; | |
13486 if (!maybe_string->ToObject(&locale_id) || !locale_id->IsString()) { | |
13487 return isolate->Throw(isolate->heap()->illegal_argument_string()); | |
13488 } | |
13489 | |
13490 v8::String::Utf8Value utf8_locale_id( | |
13491 v8::Utils::ToLocal(Handle<String>(String::cast(locale_id)))); | |
13492 | |
13493 UErrorCode error = U_ZERO_ERROR; | |
13494 | |
13495 // Convert from BCP47 to ICU format. | |
13496 // de-DE-u-co-phonebk -> de_DE@collation=phonebook | |
13497 char icu_locale[ULOC_FULLNAME_CAPACITY]; | |
13498 int icu_locale_length = 0; | |
13499 uloc_forLanguageTag(*utf8_locale_id, icu_locale, ULOC_FULLNAME_CAPACITY, | |
13500 &icu_locale_length, &error); | |
13501 if (U_FAILURE(error) || icu_locale_length == 0) { | |
13502 return isolate->Throw(isolate->heap()->illegal_argument_string()); | |
13503 } | |
13504 | |
13505 // Maximize the locale. | |
13506 // de_DE@collation=phonebook -> de_Latn_DE@collation=phonebook | |
13507 char icu_max_locale[ULOC_FULLNAME_CAPACITY]; | |
13508 uloc_addLikelySubtags( | |
13509 icu_locale, icu_max_locale, ULOC_FULLNAME_CAPACITY, &error); | |
13510 | |
13511 // Remove extensions from maximized locale. | |
13512 // de_Latn_DE@collation=phonebook -> de_Latn_DE | |
13513 char icu_base_max_locale[ULOC_FULLNAME_CAPACITY]; | |
13514 uloc_getBaseName( | |
13515 icu_max_locale, icu_base_max_locale, ULOC_FULLNAME_CAPACITY, &error); | |
13516 | |
13517 // Get original name without extensions. | |
13518 // de_DE@collation=phonebook -> de_DE | |
13519 char icu_base_locale[ULOC_FULLNAME_CAPACITY]; | |
13520 uloc_getBaseName( | |
13521 icu_locale, icu_base_locale, ULOC_FULLNAME_CAPACITY, &error); | |
13522 | |
13523 // Convert from ICU locale format to BCP47 format. | |
13524 // de_Latn_DE -> de-Latn-DE | |
13525 char base_max_locale[ULOC_FULLNAME_CAPACITY]; | |
13526 uloc_toLanguageTag(icu_base_max_locale, base_max_locale, | |
13527 ULOC_FULLNAME_CAPACITY, FALSE, &error); | |
13528 | |
13529 // de_DE -> de-DE | |
13530 char base_locale[ULOC_FULLNAME_CAPACITY]; | |
13531 uloc_toLanguageTag( | |
13532 icu_base_locale, base_locale, ULOC_FULLNAME_CAPACITY, FALSE, &error); | |
13533 | |
13534 if (U_FAILURE(error)) { | |
13535 return isolate->Throw(isolate->heap()->illegal_argument_string()); | |
13536 } | |
13537 | |
13538 Handle<JSObject> result = | |
13539 isolate->factory()->NewJSObject(isolate->object_function()); | |
13540 RETURN_IF_EMPTY_HANDLE(isolate, | |
13541 JSObject::SetLocalPropertyIgnoreAttributes( | |
13542 result, | |
13543 maximized, | |
13544 isolate->factory()->NewStringFromAscii(CStrVector(base_max_locale)), | |
13545 NONE)); | |
13546 RETURN_IF_EMPTY_HANDLE(isolate, | |
13547 JSObject::SetLocalPropertyIgnoreAttributes( | |
13548 result, | |
13549 base, | |
13550 isolate->factory()->NewStringFromAscii(CStrVector(base_locale)), | |
13551 NONE)); | |
13552 output->set(i, *result); | |
13553 } | |
13554 | |
13555 Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(output); | |
13556 result->set_length(Smi::FromInt(length)); | |
13557 return *result; | |
13558 } | |
13559 #endif // V8_I18N_SUPPORT | |
13560 | |
13561 | |
13365 // Finds the script object from the script data. NOTE: This operation uses | 13562 // Finds the script object from the script data. NOTE: This operation uses |
13366 // heap traversal to find the function generated for the source position | 13563 // heap traversal to find the function generated for the source position |
13367 // for the requested break point. For lazily compiled functions several heap | 13564 // for the requested break point. For lazily compiled functions several heap |
13368 // traversals might be required rendering this operation as a rather slow | 13565 // traversals might be required rendering this operation as a rather slow |
13369 // operation. However for setting break points which is normally done through | 13566 // operation. However for setting break points which is normally done through |
13370 // some kind of user interaction the performance is not crucial. | 13567 // some kind of user interaction the performance is not crucial. |
13371 static Handle<Object> Runtime_GetScriptFromScriptName( | 13568 static Handle<Object> Runtime_GetScriptFromScriptName( |
13372 Handle<String> script_name) { | 13569 Handle<String> script_name) { |
13373 // Scan the heap for Script objects to find the script with the requested | 13570 // Scan the heap for Script objects to find the script with the requested |
13374 // script data. | 13571 // script data. |
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13953 // Handle last resort GC and make sure to allow future allocations | 14150 // Handle last resort GC and make sure to allow future allocations |
13954 // to grow the heap without causing GCs (if possible). | 14151 // to grow the heap without causing GCs (if possible). |
13955 isolate->counters()->gc_last_resort_from_js()->Increment(); | 14152 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13956 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 14153 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13957 "Runtime::PerformGC"); | 14154 "Runtime::PerformGC"); |
13958 } | 14155 } |
13959 } | 14156 } |
13960 | 14157 |
13961 | 14158 |
13962 } } // namespace v8::internal | 14159 } } // namespace v8::internal |
OLD | NEW |