| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 0916b9398950ac5d4285b2652b7af461cce2cd5a..ef6eeb3a4970c531a1a99d6fe6fa7e1aad07d66d 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -66,23 +66,6 @@
|
| #include "v8threads.h"
|
| #include "vm-state-inl.h"
|
|
|
| -#ifdef V8_I18N_SUPPORT
|
| -#include "i18n.h"
|
| -#include "unicode/brkiter.h"
|
| -#include "unicode/calendar.h"
|
| -#include "unicode/coll.h"
|
| -#include "unicode/datefmt.h"
|
| -#include "unicode/dtfmtsym.h"
|
| -#include "unicode/dtptngen.h"
|
| -#include "unicode/locid.h"
|
| -#include "unicode/numfmt.h"
|
| -#include "unicode/numsys.h"
|
| -#include "unicode/smpdtfmt.h"
|
| -#include "unicode/timezone.h"
|
| -#include "unicode/uloc.h"
|
| -#include "unicode/uversion.h"
|
| -#endif
|
| -
|
| #ifndef _STLP_VENDOR_CSTD
|
| // STLPort doesn't import fpclassify and isless into the std namespace.
|
| using std::fpclassify;
|
| @@ -7253,6 +7236,15 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberXor) {
|
| }
|
|
|
|
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberNot) {
|
| + SealHandleScope shs(isolate);
|
| + ASSERT(args.length() == 1);
|
| +
|
| + CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
|
| + return isolate->heap()->NumberFromInt32(~x);
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShl) {
|
| SealHandleScope shs(isolate);
|
| ASSERT(args.length() == 2);
|
| @@ -8555,21 +8547,23 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) {
|
|
|
| // Use linear search of the unoptimized code's back edge table to find
|
| // the AST id matching the PC.
|
| - uint32_t target_pc_offset =
|
| - static_cast<uint32_t>(frame->pc() - unoptimized->instruction_start());
|
| + Address start = unoptimized->instruction_start();
|
| + unsigned target_pc_offset = static_cast<unsigned>(frame->pc() - start);
|
| + Address table_cursor = start + unoptimized->back_edge_table_offset();
|
| + uint32_t table_length = Memory::uint32_at(table_cursor);
|
| + table_cursor += kIntSize;
|
| uint32_t loop_depth = 0;
|
| -
|
| - for (FullCodeGenerator::BackEdgeTableIterator back_edges(*unoptimized);
|
| - !back_edges.Done();
|
| - back_edges.Next()) {
|
| - if (back_edges.pc_offset() == target_pc_offset) {
|
| - ast_id = back_edges.ast_id();
|
| - loop_depth = back_edges.loop_depth();
|
| + for (unsigned i = 0; i < table_length; ++i) {
|
| + // Table entries are (AST id, pc offset) pairs.
|
| + uint32_t pc_offset = Memory::uint32_at(table_cursor + kIntSize);
|
| + if (pc_offset == target_pc_offset) {
|
| + ast_id = BailoutId(static_cast<int>(Memory::uint32_at(table_cursor)));
|
| + loop_depth = Memory::uint32_at(table_cursor + 2 * kIntSize);
|
| break;
|
| }
|
| + table_cursor += FullCodeGenerator::kBackEdgeEntrySize;
|
| }
|
| ASSERT(!ast_id.IsNone());
|
| -
|
| if (FLAG_trace_osr) {
|
| PrintF("[replacing on-stack at AST id %d, loop depth %d in ",
|
| ast_id.ToInt(), loop_depth);
|
| @@ -8686,8 +8680,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) {
|
| CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2);
|
| CONVERT_SMI_ARG_CHECKED(offset, 3);
|
| CONVERT_SMI_ARG_CHECKED(argc, 4);
|
| - RUNTIME_ASSERT(offset >= 0);
|
| - RUNTIME_ASSERT(argc >= 0);
|
| + ASSERT(offset >= 0);
|
| + ASSERT(argc >= 0);
|
|
|
| // If there are too many arguments, allocate argv via malloc.
|
| const int argv_small_size = 10;
|
| @@ -9480,7 +9474,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ParseJson) {
|
| ASSERT_EQ(1, args.length());
|
| CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
|
|
|
| - source = Handle<String>(FlattenGetString(source));
|
| + source = Handle<String>(source->TryFlattenGetString());
|
| // Optimized fast case where we only have ASCII characters.
|
| Handle<Object> result;
|
| if (source->IsSeqOneByteString()) {
|
| @@ -13370,304 +13364,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHeapUsage) {
|
| #endif // ENABLE_DEBUGGER_SUPPORT
|
|
|
|
|
| -#ifdef V8_I18N_SUPPORT
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_CanonicalizeLanguageTag) {
|
| - HandleScope scope(isolate);
|
| -
|
| - ASSERT(args.length() == 1);
|
| - CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0);
|
| -
|
| - v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str));
|
| -
|
| - // Return value which denotes invalid language tag.
|
| - const char* const kInvalidTag = "invalid-tag";
|
| -
|
| - UErrorCode error = U_ZERO_ERROR;
|
| - char icu_result[ULOC_FULLNAME_CAPACITY];
|
| - int icu_length = 0;
|
| -
|
| - uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY,
|
| - &icu_length, &error);
|
| - if (U_FAILURE(error) || icu_length == 0) {
|
| - return isolate->heap()->AllocateStringFromOneByte(CStrVector(kInvalidTag));
|
| - }
|
| -
|
| - char result[ULOC_FULLNAME_CAPACITY];
|
| -
|
| - // Force strict BCP47 rules.
|
| - uloc_toLanguageTag(icu_result, result, ULOC_FULLNAME_CAPACITY, TRUE, &error);
|
| -
|
| - if (U_FAILURE(error)) {
|
| - return isolate->heap()->AllocateStringFromOneByte(CStrVector(kInvalidTag));
|
| - }
|
| -
|
| - return isolate->heap()->AllocateStringFromOneByte(CStrVector(result));
|
| -}
|
| -
|
| -
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_AvailableLocalesOf) {
|
| - HandleScope scope(isolate);
|
| -
|
| - ASSERT(args.length() == 1);
|
| - CONVERT_ARG_HANDLE_CHECKED(String, service, 0);
|
| -
|
| - const icu::Locale* available_locales = NULL;
|
| - int32_t count = 0;
|
| -
|
| - if (service->IsUtf8EqualTo(CStrVector("collator"))) {
|
| - available_locales = icu::Collator::getAvailableLocales(count);
|
| - } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) {
|
| - available_locales = icu::NumberFormat::getAvailableLocales(count);
|
| - } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) {
|
| - available_locales = icu::DateFormat::getAvailableLocales(count);
|
| - } else if (service->IsUtf8EqualTo(CStrVector("breakiterator"))) {
|
| - available_locales = icu::BreakIterator::getAvailableLocales(count);
|
| - }
|
| -
|
| - UErrorCode error = U_ZERO_ERROR;
|
| - char result[ULOC_FULLNAME_CAPACITY];
|
| - Handle<JSObject> locales =
|
| - isolate->factory()->NewJSObject(isolate->object_function());
|
| -
|
| - for (int32_t i = 0; i < count; ++i) {
|
| - const char* icu_name = available_locales[i].getName();
|
| -
|
| - error = U_ZERO_ERROR;
|
| - // No need to force strict BCP47 rules.
|
| - uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error);
|
| - if (U_FAILURE(error)) {
|
| - // This shouldn't happen, but lets not break the user.
|
| - continue;
|
| - }
|
| -
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - JSObject::SetLocalPropertyIgnoreAttributes(
|
| - locales,
|
| - isolate->factory()->NewStringFromAscii(CStrVector(result)),
|
| - isolate->factory()->NewNumber(i),
|
| - NONE));
|
| - }
|
| -
|
| - return *locales;
|
| -}
|
| -
|
| -
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultICULocale) {
|
| - SealHandleScope shs(isolate);
|
| -
|
| - ASSERT(args.length() == 0);
|
| -
|
| - icu::Locale default_locale;
|
| -
|
| - // Set the locale
|
| - char result[ULOC_FULLNAME_CAPACITY];
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - uloc_toLanguageTag(
|
| - default_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
|
| - if (U_SUCCESS(status)) {
|
| - return isolate->heap()->AllocateStringFromOneByte(CStrVector(result));
|
| - }
|
| -
|
| - return isolate->heap()->AllocateStringFromOneByte(CStrVector("und"));
|
| -}
|
| -
|
| -
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLanguageTagVariants) {
|
| - HandleScope scope(isolate);
|
| -
|
| - ASSERT(args.length() == 1);
|
| -
|
| - CONVERT_ARG_HANDLE_CHECKED(JSArray, input, 0);
|
| -
|
| - uint32_t length = static_cast<uint32_t>(input->length()->Number());
|
| - Handle<FixedArray> output = isolate->factory()->NewFixedArray(length);
|
| - Handle<Name> maximized =
|
| - isolate->factory()->NewStringFromAscii(CStrVector("maximized"));
|
| - Handle<Name> base =
|
| - isolate->factory()->NewStringFromAscii(CStrVector("base"));
|
| - for (unsigned int i = 0; i < length; ++i) {
|
| - MaybeObject* maybe_string = input->GetElement(i);
|
| - Object* locale_id;
|
| - if (!maybe_string->ToObject(&locale_id) || !locale_id->IsString()) {
|
| - return isolate->Throw(isolate->heap()->illegal_argument_string());
|
| - }
|
| -
|
| - v8::String::Utf8Value utf8_locale_id(
|
| - v8::Utils::ToLocal(Handle<String>(String::cast(locale_id))));
|
| -
|
| - UErrorCode error = U_ZERO_ERROR;
|
| -
|
| - // Convert from BCP47 to ICU format.
|
| - // de-DE-u-co-phonebk -> de_DE@collation=phonebook
|
| - char icu_locale[ULOC_FULLNAME_CAPACITY];
|
| - int icu_locale_length = 0;
|
| - uloc_forLanguageTag(*utf8_locale_id, icu_locale, ULOC_FULLNAME_CAPACITY,
|
| - &icu_locale_length, &error);
|
| - if (U_FAILURE(error) || icu_locale_length == 0) {
|
| - return isolate->Throw(isolate->heap()->illegal_argument_string());
|
| - }
|
| -
|
| - // Maximize the locale.
|
| - // de_DE@collation=phonebook -> de_Latn_DE@collation=phonebook
|
| - char icu_max_locale[ULOC_FULLNAME_CAPACITY];
|
| - uloc_addLikelySubtags(
|
| - icu_locale, icu_max_locale, ULOC_FULLNAME_CAPACITY, &error);
|
| -
|
| - // Remove extensions from maximized locale.
|
| - // de_Latn_DE@collation=phonebook -> de_Latn_DE
|
| - char icu_base_max_locale[ULOC_FULLNAME_CAPACITY];
|
| - uloc_getBaseName(
|
| - icu_max_locale, icu_base_max_locale, ULOC_FULLNAME_CAPACITY, &error);
|
| -
|
| - // Get original name without extensions.
|
| - // de_DE@collation=phonebook -> de_DE
|
| - char icu_base_locale[ULOC_FULLNAME_CAPACITY];
|
| - uloc_getBaseName(
|
| - icu_locale, icu_base_locale, ULOC_FULLNAME_CAPACITY, &error);
|
| -
|
| - // Convert from ICU locale format to BCP47 format.
|
| - // de_Latn_DE -> de-Latn-DE
|
| - char base_max_locale[ULOC_FULLNAME_CAPACITY];
|
| - uloc_toLanguageTag(icu_base_max_locale, base_max_locale,
|
| - ULOC_FULLNAME_CAPACITY, FALSE, &error);
|
| -
|
| - // de_DE -> de-DE
|
| - char base_locale[ULOC_FULLNAME_CAPACITY];
|
| - uloc_toLanguageTag(
|
| - icu_base_locale, base_locale, ULOC_FULLNAME_CAPACITY, FALSE, &error);
|
| -
|
| - if (U_FAILURE(error)) {
|
| - return isolate->Throw(isolate->heap()->illegal_argument_string());
|
| - }
|
| -
|
| - Handle<JSObject> result =
|
| - isolate->factory()->NewJSObject(isolate->object_function());
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - JSObject::SetLocalPropertyIgnoreAttributes(
|
| - result,
|
| - maximized,
|
| - isolate->factory()->NewStringFromAscii(CStrVector(base_max_locale)),
|
| - NONE));
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - JSObject::SetLocalPropertyIgnoreAttributes(
|
| - result,
|
| - base,
|
| - isolate->factory()->NewStringFromAscii(CStrVector(base_locale)),
|
| - NONE));
|
| - output->set(i, *result);
|
| - }
|
| -
|
| - Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(output);
|
| - result->set_length(Smi::FromInt(length));
|
| - return *result;
|
| -}
|
| -
|
| -
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateDateTimeFormat) {
|
| - HandleScope scope(isolate);
|
| -
|
| - ASSERT(args.length() == 3);
|
| -
|
| - CONVERT_ARG_HANDLE_CHECKED(String, locale, 0);
|
| - CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1);
|
| - CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
|
| -
|
| - Handle<ObjectTemplateInfo> date_format_template =
|
| - I18N::GetTemplate(isolate);
|
| -
|
| - // Create an empty object wrapper.
|
| - bool has_pending_exception = false;
|
| - Handle<JSObject> local_object = Execution::InstantiateObject(
|
| - date_format_template, &has_pending_exception);
|
| - if (has_pending_exception) {
|
| - ASSERT(isolate->has_pending_exception());
|
| - return Failure::Exception();
|
| - }
|
| -
|
| - // Set date time formatter as internal field of the resulting JS object.
|
| - icu::SimpleDateFormat* date_format = DateFormat::InitializeDateTimeFormat(
|
| - isolate, locale, options, resolved);
|
| -
|
| - if (!date_format) return isolate->ThrowIllegalOperation();
|
| -
|
| - local_object->SetInternalField(0, reinterpret_cast<Smi*>(date_format));
|
| -
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - JSObject::SetLocalPropertyIgnoreAttributes(
|
| - local_object,
|
| - isolate->factory()->NewStringFromAscii(CStrVector("dateFormat")),
|
| - isolate->factory()->NewStringFromAscii(CStrVector("valid")),
|
| - NONE));
|
| -
|
| - Persistent<v8::Object> wrapper(reinterpret_cast<v8::Isolate*>(isolate),
|
| - v8::Utils::ToLocal(local_object));
|
| - // Make object handle weak so we can delete the data format once GC kicks in.
|
| - wrapper.MakeWeak<void>(NULL, &DateFormat::DeleteDateFormat);
|
| - Handle<Object> result = Utils::OpenPersistent(wrapper);
|
| - wrapper.ClearAndLeak();
|
| - return *result;
|
| -}
|
| -
|
| -
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalDateFormat) {
|
| - HandleScope scope(isolate);
|
| -
|
| - ASSERT(args.length() == 2);
|
| -
|
| - CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0);
|
| - CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1);
|
| -
|
| - bool has_pending_exception = false;
|
| - double millis = Execution::ToNumber(date, &has_pending_exception)->Number();
|
| - if (has_pending_exception) {
|
| - ASSERT(isolate->has_pending_exception());
|
| - return Failure::Exception();
|
| - }
|
| -
|
| - icu::SimpleDateFormat* date_format =
|
| - DateFormat::UnpackDateFormat(isolate, date_format_holder);
|
| - if (!date_format) return isolate->ThrowIllegalOperation();
|
| -
|
| - icu::UnicodeString result;
|
| - date_format->format(millis, result);
|
| -
|
| - return *isolate->factory()->NewStringFromTwoByte(
|
| - Vector<const uint16_t>(
|
| - reinterpret_cast<const uint16_t*>(result.getBuffer()),
|
| - result.length()));
|
| -}
|
| -
|
| -
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalDateParse) {
|
| - HandleScope scope(isolate);
|
| -
|
| - ASSERT(args.length() == 2);
|
| -
|
| - CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0);
|
| - CONVERT_ARG_HANDLE_CHECKED(String, date_string, 1);
|
| -
|
| - v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string));
|
| - icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date));
|
| - icu::SimpleDateFormat* date_format =
|
| - DateFormat::UnpackDateFormat(isolate, date_format_holder);
|
| - if (!date_format) return isolate->ThrowIllegalOperation();
|
| -
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UDate date = date_format->parse(u_date, status);
|
| - if (U_FAILURE(status)) return isolate->heap()->undefined_value();
|
| -
|
| - bool has_pending_exception = false;
|
| - Handle<JSDate> result = Handle<JSDate>::cast(
|
| - Execution::NewDate(static_cast<double>(date), &has_pending_exception));
|
| - if (has_pending_exception) {
|
| - ASSERT(isolate->has_pending_exception());
|
| - return Failure::Exception();
|
| - }
|
| - return *result;
|
| -}
|
| -#endif // V8_I18N_SUPPORT
|
| -
|
| -
|
| // Finds the script object from the script data. NOTE: This operation uses
|
| // heap traversal to find the function generated for the source position
|
| // for the requested break point. For lazily compiled functions several heap
|
| @@ -13786,18 +13482,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_FlattenString) {
|
| }
|
|
|
|
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_MigrateInstance) {
|
| - HandleScope scope(isolate);
|
| - ASSERT(args.length() == 1);
|
| - CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
|
| - if (!object->IsJSObject()) return Smi::FromInt(0);
|
| - Handle<JSObject> js_object = Handle<JSObject>::cast(object);
|
| - if (!js_object->map()->is_deprecated()) return Smi::FromInt(0);
|
| - JSObject::MigrateInstance(js_object);
|
| - return *object;
|
| -}
|
| -
|
| -
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) {
|
| SealHandleScope shs(isolate);
|
| // This is only called from codegen, so checks might be more lax.
|
| @@ -14041,9 +13725,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetIsObserved) {
|
| ASSERT(proto->IsJSGlobalObject());
|
| obj = JSReceiver::cast(proto);
|
| }
|
| - if (obj->IsJSProxy())
|
| - return isolate->heap()->undefined_value();
|
| -
|
| ASSERT(!(obj->map()->is_observed() && obj->IsJSObject() &&
|
| JSObject::cast(obj)->HasFastElements()));
|
| ASSERT(obj->IsJSObject());
|
|
|