| 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;
|
| }
|
|
|
|
|