Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Unified Diff: src/runtime/runtime-literals.cc

Issue 2632503003: [runtime] Allocate space for computed property names (Closed)
Patch Set: Comments and reorder. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/parsing/preparser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime/runtime-literals.cc
diff --git a/src/runtime/runtime-literals.cc b/src/runtime/runtime-literals.cc
index 45b83293b6334d48ee6f7a4292f062aab46889bc..6abdfd35522e91e866e58f97c81941a625acb58e 100644
--- a/src/runtime/runtime-literals.cc
+++ b/src/runtime/runtime-literals.cc
@@ -15,13 +15,13 @@ namespace v8 {
namespace internal {
static Handle<Map> ComputeObjectLiteralMap(
- Handle<Context> context, Handle<FixedArray> constant_properties,
+ Handle<Context> context,
+ Handle<BoilerplateDescription> boilerplate_description,
bool* is_result_from_cache) {
- int properties_length = constant_properties->length();
- int number_of_properties = properties_length / 2;
+ int number_of_properties = boilerplate_description->backing_store_size();
- for (int p = 0; p != properties_length; p += 2) {
- Object* key = constant_properties->get(p);
+ for (int index = 0; index < boilerplate_description->size(); index++) {
+ Object* key = boilerplate_description->name(index);
uint32_t element_index = 0;
if (key->ToArrayIndex(&element_index)) {
// An index key does not require space in the property backing store.
@@ -35,11 +35,12 @@ static Handle<Map> ComputeObjectLiteralMap(
MUST_USE_RESULT static MaybeHandle<Object> CreateLiteralBoilerplate(
Isolate* isolate, Handle<LiteralsArray> literals,
- Handle<FixedArray> constant_properties);
+ Handle<BoilerplateDescription> boilerplate_description);
MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate(
Isolate* isolate, Handle<LiteralsArray> literals,
- Handle<FixedArray> constant_properties, bool should_have_fast_elements) {
+ Handle<BoilerplateDescription> boilerplate_description,
+ bool should_have_fast_elements) {
Handle<Context> context = isolate->native_context();
// In case we have function literals, we want the object to be in
@@ -47,7 +48,7 @@ MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate(
// maps with constant functions can't be shared if the functions are
// not the same (which is the common case).
bool is_result_from_cache = false;
- Handle<Map> map = ComputeObjectLiteralMap(context, constant_properties,
+ Handle<Map> map = ComputeObjectLiteralMap(context, boilerplate_description,
&is_result_from_cache);
PretenureFlag pretenure_flag =
@@ -60,26 +61,27 @@ MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate(
if (!should_have_fast_elements) JSObject::NormalizeElements(boilerplate);
// Add the constant properties to the boilerplate.
- int length = constant_properties->length();
+ int length = boilerplate_description->size();
bool should_transform =
!is_result_from_cache && boilerplate->HasFastProperties();
bool should_normalize = should_transform;
if (should_normalize) {
// TODO(verwaest): We might not want to ever normalize here.
- JSObject::NormalizeProperties(boilerplate, KEEP_INOBJECT_PROPERTIES,
- length / 2, "Boilerplate");
+ JSObject::NormalizeProperties(boilerplate, KEEP_INOBJECT_PROPERTIES, length,
+ "Boilerplate");
}
// TODO(verwaest): Support tracking representations in the boilerplate.
- for (int index = 0; index < length; index += 2) {
- Handle<Object> key(constant_properties->get(index + 0), isolate);
- Handle<Object> value(constant_properties->get(index + 1), isolate);
- if (value->IsFixedArray()) {
- // The value contains the constant_properties of a
+ for (int index = 0; index < length; index++) {
+ Handle<Object> key(boilerplate_description->name(index), isolate);
+ Handle<Object> value(boilerplate_description->value(index), isolate);
+ if (value->IsBoilerplateDescription()) {
+ // The value contains the boilerplate properties of a
// simple object or array literal.
- Handle<FixedArray> array = Handle<FixedArray>::cast(value);
+ Handle<BoilerplateDescription> boilerplate =
+ Handle<BoilerplateDescription>::cast(value);
ASSIGN_RETURN_ON_EXCEPTION(
- isolate, value, CreateLiteralBoilerplate(isolate, literals, array),
- Object);
+ isolate, value,
+ CreateLiteralBoilerplate(isolate, literals, boilerplate), Object);
}
MaybeHandle<Object> maybe_result;
uint32_t element_index = 0;
@@ -161,15 +163,16 @@ static MaybeHandle<Object> CreateArrayLiteralBoilerplate(
copied_elements_values = fixed_array_values_copy;
FOR_WITH_HANDLE_SCOPE(
isolate, int, i = 0, i, i < fixed_array_values->length(), i++, {
- if (fixed_array_values->get(i)->IsFixedArray()) {
- // The value contains the constant_properties of a
+ if (fixed_array_values->get(i)->IsBoilerplateDescription()) {
+ // The value contains the boilerplate properties of a
// simple object or array literal.
- Handle<FixedArray> fa(
- FixedArray::cast(fixed_array_values->get(i)));
+ Handle<BoilerplateDescription> boilerplate(
+ BoilerplateDescription::cast(fixed_array_values->get(i)));
Handle<Object> result;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, result,
- CreateLiteralBoilerplate(isolate, literals, fa), Object);
+ CreateLiteralBoilerplate(isolate, literals, boilerplate),
+ Object);
fixed_array_values_copy->set(i, *result);
}
});
@@ -184,15 +187,17 @@ static MaybeHandle<Object> CreateArrayLiteralBoilerplate(
MUST_USE_RESULT static MaybeHandle<Object> CreateLiteralBoilerplate(
Isolate* isolate, Handle<LiteralsArray> literals,
- Handle<FixedArray> array) {
+ Handle<BoilerplateDescription> array) {
Handle<HeapObject> elements = CompileTimeValue::GetElements(array);
switch (CompileTimeValue::GetLiteralType(array)) {
case CompileTimeValue::OBJECT_LITERAL_FAST_ELEMENTS: {
- Handle<FixedArray> props = Handle<FixedArray>::cast(elements);
+ Handle<BoilerplateDescription> props =
+ Handle<BoilerplateDescription>::cast(elements);
return CreateObjectLiteralBoilerplate(isolate, literals, props, true);
}
case CompileTimeValue::OBJECT_LITERAL_SLOW_ELEMENTS: {
- Handle<FixedArray> props = Handle<FixedArray>::cast(elements);
+ Handle<BoilerplateDescription> props =
+ Handle<BoilerplateDescription>::cast(elements);
return CreateObjectLiteralBoilerplate(isolate, literals, props, false);
}
case CompileTimeValue::ARRAY_LITERAL: {
@@ -231,7 +236,8 @@ RUNTIME_FUNCTION(Runtime_CreateObjectLiteral) {
DCHECK_EQ(4, args.length());
CONVERT_ARG_HANDLE_CHECKED(JSFunction, closure, 0);
CONVERT_SMI_ARG_CHECKED(literals_index, 1);
- CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2);
+ CONVERT_ARG_HANDLE_CHECKED(BoilerplateDescription, boilerplate_description,
+ 2);
CONVERT_SMI_ARG_CHECKED(flags, 3);
Handle<LiteralsArray> literals(closure->literals(), isolate);
bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0;
@@ -248,7 +254,8 @@ RUNTIME_FUNCTION(Runtime_CreateObjectLiteral) {
Handle<Object> raw_boilerplate;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, raw_boilerplate,
- CreateObjectLiteralBoilerplate(isolate, literals, constant_properties,
+ CreateObjectLiteralBoilerplate(isolate, literals,
+ boilerplate_description,
should_have_fast_elements));
boilerplate = Handle<JSObject>::cast(raw_boilerplate);
« no previous file with comments | « src/parsing/preparser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698