Index: src/factory.cc |
=================================================================== |
--- src/factory.cc (revision 9808) |
+++ src/factory.cc (working copy) |
@@ -59,13 +59,13 @@ |
} |
-Handle<FixedArray> Factory::NewFixedDoubleArray(int size, |
- PretenureFlag pretenure) { |
+Handle<FixedDoubleArray> Factory::NewFixedDoubleArray(int size, |
+ PretenureFlag pretenure) { |
ASSERT(0 <= size); |
CALL_HEAP_FUNCTION( |
isolate(), |
isolate()->heap()->AllocateUninitializedFixedDoubleArray(size, pretenure), |
- FixedArray); |
+ FixedDoubleArray); |
} |
@@ -85,6 +85,14 @@ |
} |
+Handle<ObjectHashSet> Factory::NewObjectHashSet(int at_least_space_for) { |
+ ASSERT(0 <= at_least_space_for); |
+ CALL_HEAP_FUNCTION(isolate(), |
+ ObjectHashSet::Allocate(at_least_space_for), |
+ ObjectHashSet); |
+} |
+ |
+ |
Handle<ObjectHashTable> Factory::NewObjectHashTable(int at_least_space_for) { |
ASSERT(0 <= at_least_space_for); |
CALL_HEAP_FUNCTION(isolate(), |
@@ -471,6 +479,12 @@ |
} |
+Handle<FixedDoubleArray> Factory::CopyFixedDoubleArray( |
+ Handle<FixedDoubleArray> array) { |
+ CALL_HEAP_FUNCTION(isolate(), array->Copy(), FixedDoubleArray); |
+} |
+ |
+ |
Handle<JSFunction> Factory::BaseNewFunctionFromSharedFunctionInfo( |
Handle<SharedFunctionInfo> function_info, |
Handle<Map> function_map, |
@@ -497,16 +511,20 @@ |
pretenure); |
result->set_context(*context); |
- int number_of_literals = function_info->num_literals(); |
- Handle<FixedArray> literals = NewFixedArray(number_of_literals, pretenure); |
- if (number_of_literals > 0) { |
- // Store the object, regexp and array functions in the literals |
- // array prefix. These functions will be used when creating |
- // object, regexp and array literals in this function. |
- literals->set(JSFunction::kLiteralGlobalContextIndex, |
- context->global_context()); |
+ if (!function_info->bound()) { |
+ int number_of_literals = function_info->num_literals(); |
+ Handle<FixedArray> literals = NewFixedArray(number_of_literals, pretenure); |
+ if (number_of_literals > 0) { |
+ // Store the object, regexp and array functions in the literals |
+ // array prefix. These functions will be used when creating |
+ // object, regexp and array literals in this function. |
+ literals->set(JSFunction::kLiteralGlobalContextIndex, |
+ context->global_context()); |
+ } |
+ result->set_literals(*literals); |
+ } else { |
+ result->set_function_bindings(isolate()->heap()->empty_fixed_array()); |
} |
- result->set_literals(*literals); |
result->set_next_function_link(isolate()->heap()->undefined_value()); |
if (V8::UseCrankshaft() && |
@@ -821,10 +839,13 @@ |
// Number of descriptors added to the result so far. |
int descriptor_count = 0; |
+ // Ensure that marking will not progress and change color of objects. |
+ DescriptorArray::WhitenessWitness witness(*result); |
+ |
// Copy the descriptors from the array. |
for (int i = 0; i < array->number_of_descriptors(); i++) { |
if (array->GetType(i) != NULL_DESCRIPTOR) { |
- result->CopyFrom(descriptor_count++, *array, i); |
+ result->CopyFrom(descriptor_count++, *array, i, witness); |
} |
} |
@@ -844,7 +865,7 @@ |
if (result->LinearSearch(*key, descriptor_count) == |
DescriptorArray::kNotFound) { |
CallbacksDescriptor desc(*key, *entry, entry->property_attributes()); |
- result->Set(descriptor_count, &desc); |
+ result->Set(descriptor_count, &desc, witness); |
descriptor_count++; |
} else { |
duplicates++; |
@@ -858,13 +879,13 @@ |
Handle<DescriptorArray> new_result = |
NewDescriptorArray(number_of_descriptors); |
for (int i = 0; i < number_of_descriptors; i++) { |
- new_result->CopyFrom(i, *result, i); |
+ new_result->CopyFrom(i, *result, i, witness); |
} |
result = new_result; |
} |
// Sort the result before returning. |
- result->Sort(); |
+ result->Sort(witness); |
return result; |
} |