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()); |