Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/src/factory.cc b/src/factory.cc
index 7d2dad0..bd4656e 100644
--- a/src/factory.cc
+++ b/src/factory.cc
@@ -96,6 +96,7 @@
result->set_prototype_users(WeakFixedArray::Empty());
result->set_registry_slot(PrototypeInfo::UNREGISTERED);
result->set_validity_cell(Smi::FromInt(0));
+ result->set_bit_field(0);
return result;
}
@@ -291,12 +292,10 @@
return result;
}
-
-MaybeHandle<String> Factory::NewStringFromTwoByte(Vector<const uc16> string,
+MaybeHandle<String> Factory::NewStringFromTwoByte(const uc16* string,
+ int length,
PretenureFlag pretenure) {
- int length = string.length();
- const uc16* start = string.start();
- if (String::IsOneByte(start, length)) {
+ if (String::IsOneByte(string, length)) {
if (length == 1) return LookupSingleCharacterStringFromCode(string[0]);
Handle<SeqOneByteString> result;
ASSIGN_RETURN_ON_EXCEPTION(
@@ -304,7 +303,7 @@
result,
NewRawOneByteString(length, pretenure),
String);
- CopyChars(result->GetChars(), start, length);
+ CopyChars(result->GetChars(), string, length);
return result;
} else {
Handle<SeqTwoByteString> result;
@@ -313,11 +312,21 @@
result,
NewRawTwoByteString(length, pretenure),
String);
- CopyChars(result->GetChars(), start, length);
+ CopyChars(result->GetChars(), string, length);
return result;
}
}
+MaybeHandle<String> Factory::NewStringFromTwoByte(Vector<const uc16> string,
+ PretenureFlag pretenure) {
+ return NewStringFromTwoByte(string.start(), string.length(), pretenure);
+}
+
+MaybeHandle<String> Factory::NewStringFromTwoByte(
+ const ZoneVector<uc16>* string, PretenureFlag pretenure) {
+ return NewStringFromTwoByte(string->data(), static_cast<int>(string->size()),
+ pretenure);
+}
Handle<String> Factory::NewInternalizedStringFromUtf8(Vector<const char> str,
int chars,
@@ -704,6 +713,21 @@
return external_string;
}
+Handle<ExternalOneByteString> Factory::NewNativeSourceString(
+ const ExternalOneByteString::Resource* resource) {
+ size_t length = resource->length();
+ DCHECK_LE(length, static_cast<size_t>(String::kMaxLength));
+
+ Handle<Map> map = native_source_string_map();
+ Handle<ExternalOneByteString> external_string =
+ New<ExternalOneByteString>(map, OLD_SPACE);
+ external_string->set_length(static_cast<int>(length));
+ external_string->set_hash_field(String::kEmptyHashField);
+ external_string->set_resource(resource);
+
+ return external_string;
+}
+
Handle<Symbol> Factory::NewSymbol() {
CALL_HEAP_FUNCTION(
@@ -1207,7 +1231,7 @@
function->set_code(info->code());
function->set_context(*context);
function->set_prototype_or_initial_map(*the_hole_value());
- function->set_literals(LiteralsArray::cast(*empty_fixed_array()));
+ function->set_literals(LiteralsArray::cast(*empty_literals_array()));
function->set_next_function_link(*undefined_value(), SKIP_WRITE_BARRIER);
isolate()->heap()->InitializeJSObjectBody(*function, *map, JSFunction::kSize);
return function;
@@ -1221,7 +1245,7 @@
Handle<SharedFunctionInfo> info =
NewSharedFunctionInfo(name, code, map->is_constructor());
DCHECK(is_sloppy(info->language_mode()));
- DCHECK(!map->IsUndefined());
+ DCHECK(!map->IsUndefined(isolate()));
DCHECK(
map.is_identical_to(isolate()->sloppy_function_map()) ||
map.is_identical_to(isolate()->sloppy_function_without_prototype_map()) ||
@@ -1254,16 +1278,9 @@
Handle<JSFunction> Factory::NewFunction(Handle<String> name, Handle<Code> code,
Handle<Object> prototype,
- bool read_only_prototype,
bool is_strict) {
- // In strict mode, readonly strict map is only available during bootstrap
- DCHECK(!is_strict || !read_only_prototype ||
- isolate()->bootstrapper()->IsActive());
- Handle<Map> map =
- is_strict ? isolate()->strict_function_map()
- : read_only_prototype
- ? isolate()->sloppy_function_with_readonly_prototype_map()
- : isolate()->sloppy_function_map();
+ Handle<Map> map = is_strict ? isolate()->strict_function_map()
+ : isolate()->sloppy_function_map();
Handle<JSFunction> result = NewFunction(map, name, code);
result->set_prototype_or_initial_map(*prototype);
return result;
@@ -1273,22 +1290,19 @@
Handle<JSFunction> Factory::NewFunction(Handle<String> name, Handle<Code> code,
Handle<Object> prototype,
InstanceType type, int instance_size,
- bool read_only_prototype,
- bool install_constructor,
bool is_strict) {
// Allocate the function
- Handle<JSFunction> function =
- NewFunction(name, code, prototype, read_only_prototype, is_strict);
+ Handle<JSFunction> function = NewFunction(name, code, prototype, is_strict);
ElementsKind elements_kind =
type == JS_ARRAY_TYPE ? FAST_SMI_ELEMENTS : FAST_HOLEY_SMI_ELEMENTS;
Handle<Map> initial_map = NewMap(type, instance_size, elements_kind);
- if (!function->shared()->is_generator()) {
- if (prototype->IsTheHole()) {
+ // TODO(littledan): Why do we have this is_generator test when
+ // NewFunctionPrototype already handles finding an appropriately
+ // shared prototype?
+ if (!function->shared()->is_resumable()) {
+ if (prototype->IsTheHole(isolate())) {
prototype = NewFunctionPrototype(function);
- } else if (install_constructor) {
- JSObject::AddProperty(Handle<JSObject>::cast(prototype),
- constructor_string(), function, DONT_ENUM);
}
}
@@ -1312,11 +1326,12 @@
// can be from a different context.
Handle<Context> native_context(function->context()->native_context());
Handle<Map> new_map;
- if (function->shared()->is_generator()) {
- // Generator prototypes can share maps since they don't have "constructor"
- // properties.
+ if (function->shared()->is_resumable()) {
+ // Generator and async function prototypes can share maps since they
+ // don't have "constructor" properties.
new_map = handle(native_context->generator_object_prototype_map());
} else {
+ CHECK(!function->shared()->is_async());
// Each function prototype gets a fresh map to avoid unwanted sharing of
// maps between prototypes of different constructors.
Handle<JSFunction> object_function(native_context->object_function());
@@ -1327,7 +1342,7 @@
DCHECK(!new_map->is_prototype_map());
Handle<JSObject> prototype = NewJSObjectFromMap(new_map);
- if (!function->shared()->is_generator()) {
+ if (!function->shared()->is_resumable()) {
JSObject::AddProperty(prototype, constructor_string(), function, DONT_ENUM);
}
@@ -1398,13 +1413,21 @@
bool is_debug) {
Handle<ByteArray> reloc_info = NewByteArray(desc.reloc_size, TENURED);
+ bool has_unwinding_info = desc.unwinding_info != nullptr;
+ DCHECK((has_unwinding_info && desc.unwinding_info_size > 0) ||
+ (!has_unwinding_info && desc.unwinding_info_size == 0));
+
// Compute size.
- int body_size = RoundUp(desc.instr_size, kObjectAlignment);
- int obj_size = Code::SizeFor(body_size);
+ int body_size = desc.instr_size;
+ int unwinding_info_size_field_size = kInt64Size;
+ if (has_unwinding_info) {
+ body_size = RoundUp(body_size, kInt64Size) + desc.unwinding_info_size +
+ unwinding_info_size_field_size;
+ }
+ int obj_size = Code::SizeFor(RoundUp(body_size, kObjectAlignment));
Handle<Code> code = NewCodeRaw(obj_size, immovable);
- DCHECK(isolate()->heap()->memory_allocator()->code_range() == NULL ||
- !isolate()->heap()->memory_allocator()->code_range()->valid() ||
+ DCHECK(!isolate()->heap()->memory_allocator()->code_range()->valid() ||
isolate()->heap()->memory_allocator()->code_range()->contains(
code->address()) ||
obj_size <= isolate()->heap()->code_space()->AreaSize());
@@ -1417,6 +1440,7 @@
code->set_instruction_size(desc.instr_size);
code->set_relocation_info(*reloc_info);
code->set_flags(flags);
+ code->set_has_unwinding_info(has_unwinding_info);
code->set_raw_kind_specific_flags1(0);
code->set_raw_kind_specific_flags2(0);
code->set_is_crankshafted(crankshafted);
@@ -1461,12 +1485,6 @@
}
-Handle<Code> Factory::CopyCode(Handle<Code> code, Vector<byte> reloc_info) {
- CALL_HEAP_FUNCTION(isolate(),
- isolate()->heap()->CopyCode(*code, reloc_info),
- Code);
-}
-
Handle<BytecodeArray> Factory::CopyBytecodeArray(
Handle<BytecodeArray> bytecode_array) {
CALL_HEAP_FUNCTION(isolate(),
@@ -1994,7 +2012,7 @@
} else {
map = Handle<Map>(isolate()->proxy_map());
}
- DCHECK(map->prototype()->IsNull());
+ DCHECK(map->prototype()->IsNull(isolate()));
Handle<JSProxy> result = New<JSProxy>(map, NEW_SPACE);
result->initialize_properties();
result->set_target(*target);
@@ -2066,12 +2084,6 @@
shared->set_num_literals(number_of_literals);
if (IsGeneratorFunction(kind)) {
shared->set_instance_class_name(isolate()->heap()->Generator_string());
- shared->DisableOptimization(kGenerator);
- }
- if (IsAsyncFunction(kind)) {
- // TODO(caitp): Enable optimization of async functions when they are enabled
- // for generators functions.
- shared->DisableOptimization(kGenerator);
}
return shared;
}
@@ -2126,9 +2138,7 @@
StaticFeedbackVectorSpec empty_spec;
Handle<TypeFeedbackMetadata> feedback_metadata =
TypeFeedbackMetadata::New(isolate(), &empty_spec);
- Handle<TypeFeedbackVector> feedback_vector =
- TypeFeedbackVector::New(isolate(), feedback_metadata);
- share->set_feedback_vector(*feedback_vector, SKIP_WRITE_BARRIER);
+ share->set_feedback_metadata(*feedback_metadata, SKIP_WRITE_BARRIER);
#if TRACE_MAPS
share->set_unique_id(isolate()->GetNextUniqueSharedFunctionInfoId());
#endif
@@ -2204,7 +2214,7 @@
isolate()->counters()->number_to_string_runtime()->Increment();
if (check_number_string_cache) {
Handle<Object> cached = GetNumberStringCache(number);
- if (!cached->IsUndefined()) return Handle<String>::cast(cached);
+ if (!cached->IsUndefined(isolate())) return Handle<String>::cast(cached);
}
char arr[100];
@@ -2310,7 +2320,7 @@
int cache_index = number_of_properties - 1;
Handle<Object> maybe_cache(context->map_cache(), isolate());
- if (maybe_cache->IsUndefined()) {
+ if (maybe_cache->IsUndefined(isolate())) {
// Allocate the new map cache for the native context.
maybe_cache = NewFixedArray(kMapCacheSize, TENURED);
context->set_map_cache(*maybe_cache);
@@ -2366,6 +2376,7 @@
store->set(JSRegExp::kIrregexpMaxRegisterCountIndex, Smi::FromInt(0));
store->set(JSRegExp::kIrregexpCaptureCountIndex,
Smi::FromInt(capture_count));
+ store->set(JSRegExp::kIrregexpCaptureNameMapIndex, uninitialized);
regexp->set_data(*store);
}