| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 StackLimitCheck check; | 100 StackLimitCheck check; |
| 101 if (check.HasOverflowed()) return Top::StackOverflow(); | 101 if (check.HasOverflowed()) return Top::StackOverflow(); |
| 102 | 102 |
| 103 Object* result = Heap::CopyJSObject(boilerplate); | 103 Object* result = Heap::CopyJSObject(boilerplate); |
| 104 if (result->IsFailure()) return result; | 104 if (result->IsFailure()) return result; |
| 105 JSObject* copy = JSObject::cast(result); | 105 JSObject* copy = JSObject::cast(result); |
| 106 | 106 |
| 107 // Deep copy local properties. | 107 // Deep copy local properties. |
| 108 if (copy->HasFastProperties()) { | 108 if (copy->HasFastProperties()) { |
| 109 FixedArray* properties = copy->properties(); | 109 FixedArray* properties = copy->properties(); |
| 110 WriteBarrierMode mode = properties->GetWriteBarrierMode(); | |
| 111 for (int i = 0; i < properties->length(); i++) { | 110 for (int i = 0; i < properties->length(); i++) { |
| 112 Object* value = properties->get(i); | 111 Object* value = properties->get(i); |
| 113 if (value->IsJSObject()) { | 112 if (value->IsJSObject()) { |
| 114 JSObject* jsObject = JSObject::cast(value); | 113 JSObject* js_object = JSObject::cast(value); |
| 115 result = DeepCopyBoilerplate(jsObject); | 114 result = DeepCopyBoilerplate(js_object); |
| 116 if (result->IsFailure()) return result; | 115 if (result->IsFailure()) return result; |
| 117 properties->set(i, result, mode); | 116 properties->set(i, result); |
| 118 } | 117 } |
| 119 } | 118 } |
| 120 mode = copy->GetWriteBarrierMode(); | |
| 121 int nof = copy->map()->inobject_properties(); | 119 int nof = copy->map()->inobject_properties(); |
| 122 for (int i = 0; i < nof; i++) { | 120 for (int i = 0; i < nof; i++) { |
| 123 Object* value = copy->InObjectPropertyAt(i); | 121 Object* value = copy->InObjectPropertyAt(i); |
| 124 if (value->IsJSObject()) { | 122 if (value->IsJSObject()) { |
| 125 JSObject* jsObject = JSObject::cast(value); | 123 JSObject* js_object = JSObject::cast(value); |
| 126 result = DeepCopyBoilerplate(jsObject); | 124 result = DeepCopyBoilerplate(js_object); |
| 127 if (result->IsFailure()) return result; | 125 if (result->IsFailure()) return result; |
| 128 copy->InObjectPropertyAtPut(i, result, mode); | 126 copy->InObjectPropertyAtPut(i, result); |
| 129 } | 127 } |
| 130 } | 128 } |
| 131 } else { | 129 } else { |
| 132 result = Heap::AllocateFixedArray(copy->NumberOfLocalProperties(NONE)); | 130 result = Heap::AllocateFixedArray(copy->NumberOfLocalProperties(NONE)); |
| 133 if (result->IsFailure()) return result; | 131 if (result->IsFailure()) return result; |
| 134 FixedArray* names = FixedArray::cast(result); | 132 FixedArray* names = FixedArray::cast(result); |
| 135 copy->GetLocalPropertyNames(names, 0); | 133 copy->GetLocalPropertyNames(names, 0); |
| 136 for (int i = 0; i < names->length(); i++) { | 134 for (int i = 0; i < names->length(); i++) { |
| 137 ASSERT(names->get(i)->IsString()); | 135 ASSERT(names->get(i)->IsString()); |
| 138 String* keyString = String::cast(names->get(i)); | 136 String* key_string = String::cast(names->get(i)); |
| 139 PropertyAttributes attributes = | 137 PropertyAttributes attributes = |
| 140 copy->GetLocalPropertyAttribute(keyString); | 138 copy->GetLocalPropertyAttribute(key_string); |
| 141 // Only deep copy fields from the object literal expression. | 139 // Only deep copy fields from the object literal expression. |
| 142 // In particular, don't try to copy the length attribute of | 140 // In particular, don't try to copy the length attribute of |
| 143 // an array. | 141 // an array. |
| 144 if (attributes != NONE) continue; | 142 if (attributes != NONE) continue; |
| 145 Object* value = copy->GetProperty(keyString, &attributes); | 143 Object* value = copy->GetProperty(key_string, &attributes); |
| 146 ASSERT(!value->IsFailure()); | 144 ASSERT(!value->IsFailure()); |
| 147 if (value->IsJSObject()) { | 145 if (value->IsJSObject()) { |
| 148 JSObject* jsObject = JSObject::cast(value); | 146 JSObject* js_object = JSObject::cast(value); |
| 149 result = DeepCopyBoilerplate(jsObject); | 147 result = DeepCopyBoilerplate(js_object); |
| 150 if (result->IsFailure()) return result; | 148 if (result->IsFailure()) return result; |
| 151 result = copy->SetProperty(keyString, result, NONE); | 149 result = copy->SetProperty(key_string, result, NONE); |
| 152 if (result->IsFailure()) return result; | 150 if (result->IsFailure()) return result; |
| 153 } | 151 } |
| 154 } | 152 } |
| 155 } | 153 } |
| 156 | 154 |
| 157 // Deep copy local elements. | 155 // Deep copy local elements. |
| 158 // Pixel elements cannot be created using an object literal. | 156 // Pixel elements cannot be created using an object literal. |
| 159 ASSERT(!copy->HasPixelElements() && !copy->HasExternalArrayElements()); | 157 ASSERT(!copy->HasPixelElements() && !copy->HasExternalArrayElements()); |
| 160 switch (copy->GetElementsKind()) { | 158 switch (copy->GetElementsKind()) { |
| 161 case JSObject::FAST_ELEMENTS: { | 159 case JSObject::FAST_ELEMENTS: { |
| 162 FixedArray* elements = FixedArray::cast(copy->elements()); | 160 FixedArray* elements = FixedArray::cast(copy->elements()); |
| 163 WriteBarrierMode mode = elements->GetWriteBarrierMode(); | |
| 164 for (int i = 0; i < elements->length(); i++) { | 161 for (int i = 0; i < elements->length(); i++) { |
| 165 Object* value = elements->get(i); | 162 Object* value = elements->get(i); |
| 166 if (value->IsJSObject()) { | 163 if (value->IsJSObject()) { |
| 167 JSObject* jsObject = JSObject::cast(value); | 164 JSObject* js_object = JSObject::cast(value); |
| 168 result = DeepCopyBoilerplate(jsObject); | 165 result = DeepCopyBoilerplate(js_object); |
| 169 if (result->IsFailure()) return result; | 166 if (result->IsFailure()) return result; |
| 170 elements->set(i, result, mode); | 167 elements->set(i, result); |
| 171 } | 168 } |
| 172 } | 169 } |
| 173 break; | 170 break; |
| 174 } | 171 } |
| 175 case JSObject::DICTIONARY_ELEMENTS: { | 172 case JSObject::DICTIONARY_ELEMENTS: { |
| 176 NumberDictionary* element_dictionary = copy->element_dictionary(); | 173 NumberDictionary* element_dictionary = copy->element_dictionary(); |
| 177 int capacity = element_dictionary->Capacity(); | 174 int capacity = element_dictionary->Capacity(); |
| 178 for (int i = 0; i < capacity; i++) { | 175 for (int i = 0; i < capacity; i++) { |
| 179 Object* k = element_dictionary->KeyAt(i); | 176 Object* k = element_dictionary->KeyAt(i); |
| 180 if (element_dictionary->IsKey(k)) { | 177 if (element_dictionary->IsKey(k)) { |
| 181 Object* value = element_dictionary->ValueAt(i); | 178 Object* value = element_dictionary->ValueAt(i); |
| 182 if (value->IsJSObject()) { | 179 if (value->IsJSObject()) { |
| 183 JSObject* jsObject = JSObject::cast(value); | 180 JSObject* js_object = JSObject::cast(value); |
| 184 result = DeepCopyBoilerplate(jsObject); | 181 result = DeepCopyBoilerplate(js_object); |
| 185 if (result->IsFailure()) return result; | 182 if (result->IsFailure()) return result; |
| 186 element_dictionary->ValueAtPut(i, result); | 183 element_dictionary->ValueAtPut(i, result); |
| 187 } | 184 } |
| 188 } | 185 } |
| 189 } | 186 } |
| 190 break; | 187 break; |
| 191 } | 188 } |
| 192 default: | 189 default: |
| 193 UNREACHABLE(); | 190 UNREACHABLE(); |
| 194 break; | 191 break; |
| (...skipping 1235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1430 int number_of_literals = fun->NumberOfLiterals(); | 1427 int number_of_literals = fun->NumberOfLiterals(); |
| 1431 Handle<FixedArray> literals = | 1428 Handle<FixedArray> literals = |
| 1432 Factory::NewFixedArray(number_of_literals, TENURED); | 1429 Factory::NewFixedArray(number_of_literals, TENURED); |
| 1433 if (number_of_literals > 0) { | 1430 if (number_of_literals > 0) { |
| 1434 // Insert the object, regexp and array functions in the literals | 1431 // Insert the object, regexp and array functions in the literals |
| 1435 // array prefix. These are the functions that will be used when | 1432 // array prefix. These are the functions that will be used when |
| 1436 // creating object, regexp and array literals. | 1433 // creating object, regexp and array literals. |
| 1437 literals->set(JSFunction::kLiteralGlobalContextIndex, | 1434 literals->set(JSFunction::kLiteralGlobalContextIndex, |
| 1438 context->global_context()); | 1435 context->global_context()); |
| 1439 } | 1436 } |
| 1437 // It's okay to skip the write barrier here because the literals |
| 1438 // are guaranteed to be in old space. |
| 1440 target->set_literals(*literals, SKIP_WRITE_BARRIER); | 1439 target->set_literals(*literals, SKIP_WRITE_BARRIER); |
| 1441 } | 1440 } |
| 1442 | 1441 |
| 1443 target->set_context(*context); | 1442 target->set_context(*context); |
| 1444 return *target; | 1443 return *target; |
| 1445 } | 1444 } |
| 1446 | 1445 |
| 1447 | 1446 |
| 1448 static Object* CharCodeAt(String* subject, Object* index) { | 1447 static Object* CharCodeAt(String* subject, Object* index) { |
| 1449 uint32_t i = 0; | 1448 uint32_t i = 0; |
| (...skipping 3258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4708 JavaScriptFrame* frame = it.frame(); | 4707 JavaScriptFrame* frame = it.frame(); |
| 4709 | 4708 |
| 4710 const int length = frame->GetProvidedParametersCount(); | 4709 const int length = frame->GetProvidedParametersCount(); |
| 4711 Object* result = Heap::AllocateArgumentsObject(callee, length); | 4710 Object* result = Heap::AllocateArgumentsObject(callee, length); |
| 4712 if (result->IsFailure()) return result; | 4711 if (result->IsFailure()) return result; |
| 4713 if (length > 0) { | 4712 if (length > 0) { |
| 4714 Object* obj = Heap::AllocateFixedArray(length); | 4713 Object* obj = Heap::AllocateFixedArray(length); |
| 4715 if (obj->IsFailure()) return obj; | 4714 if (obj->IsFailure()) return obj; |
| 4716 FixedArray* array = FixedArray::cast(obj); | 4715 FixedArray* array = FixedArray::cast(obj); |
| 4717 ASSERT(array->length() == length); | 4716 ASSERT(array->length() == length); |
| 4718 WriteBarrierMode mode = array->GetWriteBarrierMode(); | 4717 |
| 4718 AssertNoAllocation no_gc; |
| 4719 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); |
| 4719 for (int i = 0; i < length; i++) { | 4720 for (int i = 0; i < length; i++) { |
| 4720 array->set(i, frame->GetParameter(i), mode); | 4721 array->set(i, frame->GetParameter(i), mode); |
| 4721 } | 4722 } |
| 4722 JSObject::cast(result)->set_elements(array); | 4723 JSObject::cast(result)->set_elements(array); |
| 4723 } | 4724 } |
| 4724 return result; | 4725 return result; |
| 4725 } | 4726 } |
| 4726 | 4727 |
| 4727 | 4728 |
| 4728 static Object* Runtime_NewArgumentsFast(Arguments args) { | 4729 static Object* Runtime_NewArgumentsFast(Arguments args) { |
| 4729 NoHandleAllocation ha; | 4730 NoHandleAllocation ha; |
| 4730 ASSERT(args.length() == 3); | 4731 ASSERT(args.length() == 3); |
| 4731 | 4732 |
| 4732 JSFunction* callee = JSFunction::cast(args[0]); | 4733 JSFunction* callee = JSFunction::cast(args[0]); |
| 4733 Object** parameters = reinterpret_cast<Object**>(args[1]); | 4734 Object** parameters = reinterpret_cast<Object**>(args[1]); |
| 4734 const int length = Smi::cast(args[2])->value(); | 4735 const int length = Smi::cast(args[2])->value(); |
| 4735 | 4736 |
| 4736 Object* result = Heap::AllocateArgumentsObject(callee, length); | 4737 Object* result = Heap::AllocateArgumentsObject(callee, length); |
| 4737 if (result->IsFailure()) return result; | 4738 if (result->IsFailure()) return result; |
| 4738 // Allocate the elements if needed. | 4739 // Allocate the elements if needed. |
| 4739 if (length > 0) { | 4740 if (length > 0) { |
| 4740 // Allocate the fixed array. | 4741 // Allocate the fixed array. |
| 4741 Object* obj = Heap::AllocateRawFixedArray(length); | 4742 Object* obj = Heap::AllocateRawFixedArray(length); |
| 4742 if (obj->IsFailure()) return obj; | 4743 if (obj->IsFailure()) return obj; |
| 4744 |
| 4745 AssertNoAllocation no_gc; |
| 4743 reinterpret_cast<Array*>(obj)->set_map(Heap::fixed_array_map()); | 4746 reinterpret_cast<Array*>(obj)->set_map(Heap::fixed_array_map()); |
| 4744 FixedArray* array = FixedArray::cast(obj); | 4747 FixedArray* array = FixedArray::cast(obj); |
| 4745 array->set_length(length); | 4748 array->set_length(length); |
| 4746 WriteBarrierMode mode = array->GetWriteBarrierMode(); | 4749 |
| 4750 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); |
| 4747 for (int i = 0; i < length; i++) { | 4751 for (int i = 0; i < length; i++) { |
| 4748 array->set(i, *--parameters, mode); | 4752 array->set(i, *--parameters, mode); |
| 4749 } | 4753 } |
| 4750 JSObject::cast(result)->set_elements(FixedArray::cast(obj)); | 4754 JSObject::cast(result)->set_elements(FixedArray::cast(obj)); |
| 4751 } | 4755 } |
| 4752 return result; | 4756 return result; |
| 4753 } | 4757 } |
| 4754 | 4758 |
| 4755 | 4759 |
| 4756 static Object* Runtime_NewClosure(Arguments args) { | 4760 static Object* Runtime_NewClosure(Arguments args) { |
| (...skipping 1268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6025 | 6029 |
| 6026 | 6030 |
| 6027 // Move contents of argument 0 (an array) to argument 1 (an array) | 6031 // Move contents of argument 0 (an array) to argument 1 (an array) |
| 6028 static Object* Runtime_MoveArrayContents(Arguments args) { | 6032 static Object* Runtime_MoveArrayContents(Arguments args) { |
| 6029 ASSERT(args.length() == 2); | 6033 ASSERT(args.length() == 2); |
| 6030 CONVERT_CHECKED(JSArray, from, args[0]); | 6034 CONVERT_CHECKED(JSArray, from, args[0]); |
| 6031 CONVERT_CHECKED(JSArray, to, args[1]); | 6035 CONVERT_CHECKED(JSArray, to, args[1]); |
| 6032 to->SetContent(FixedArray::cast(from->elements())); | 6036 to->SetContent(FixedArray::cast(from->elements())); |
| 6033 to->set_length(from->length()); | 6037 to->set_length(from->length()); |
| 6034 from->SetContent(Heap::empty_fixed_array()); | 6038 from->SetContent(Heap::empty_fixed_array()); |
| 6035 from->set_length(0); | 6039 from->set_length(Smi::FromInt(0)); |
| 6036 return to; | 6040 return to; |
| 6037 } | 6041 } |
| 6038 | 6042 |
| 6039 | 6043 |
| 6040 // How many elements does this array have? | 6044 // How many elements does this array have? |
| 6041 static Object* Runtime_EstimateNumberOfElements(Arguments args) { | 6045 static Object* Runtime_EstimateNumberOfElements(Arguments args) { |
| 6042 ASSERT(args.length() == 1); | 6046 ASSERT(args.length() == 1); |
| 6043 CONVERT_CHECKED(JSArray, array, args[0]); | 6047 CONVERT_CHECKED(JSArray, array, args[0]); |
| 6044 HeapObject* elements = array->elements(); | 6048 HeapObject* elements = array->elements(); |
| 6045 if (elements->IsDictionary()) { | 6049 if (elements->IsDictionary()) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 6068 uint32_t index; | 6072 uint32_t index; |
| 6069 if (!Array::IndexFromObject(key, &index) || index >= length) { | 6073 if (!Array::IndexFromObject(key, &index) || index >= length) { |
| 6070 // Zap invalid keys. | 6074 // Zap invalid keys. |
| 6071 keys->set_undefined(i); | 6075 keys->set_undefined(i); |
| 6072 } | 6076 } |
| 6073 } | 6077 } |
| 6074 return *Factory::NewJSArrayWithElements(keys); | 6078 return *Factory::NewJSArrayWithElements(keys); |
| 6075 } else { | 6079 } else { |
| 6076 Handle<FixedArray> single_interval = Factory::NewFixedArray(2); | 6080 Handle<FixedArray> single_interval = Factory::NewFixedArray(2); |
| 6077 // -1 means start of array. | 6081 // -1 means start of array. |
| 6078 single_interval->set(0, | 6082 single_interval->set(0, Smi::FromInt(-1)); |
| 6079 Smi::FromInt(-1), | |
| 6080 SKIP_WRITE_BARRIER); | |
| 6081 uint32_t actual_length = static_cast<uint32_t>(array->elements()->length()); | 6083 uint32_t actual_length = static_cast<uint32_t>(array->elements()->length()); |
| 6082 uint32_t min_length = actual_length < length ? actual_length : length; | 6084 uint32_t min_length = actual_length < length ? actual_length : length; |
| 6083 Handle<Object> length_object = | 6085 Handle<Object> length_object = |
| 6084 Factory::NewNumber(static_cast<double>(min_length)); | 6086 Factory::NewNumber(static_cast<double>(min_length)); |
| 6085 single_interval->set(1, *length_object); | 6087 single_interval->set(1, *length_object); |
| 6086 return *Factory::NewJSArrayWithElements(single_interval); | 6088 return *Factory::NewJSArrayWithElements(single_interval); |
| 6087 } | 6089 } |
| 6088 } | 6090 } |
| 6089 | 6091 |
| 6090 | 6092 |
| (...skipping 1352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7443 index = ScopeInfo<>::ContextSlotIndex(*code, Heap::arguments_symbol(), | 7445 index = ScopeInfo<>::ContextSlotIndex(*code, Heap::arguments_symbol(), |
| 7444 NULL); | 7446 NULL); |
| 7445 if (index != -1) { | 7447 if (index != -1) { |
| 7446 return Handle<Object>(function_context->get(index)); | 7448 return Handle<Object>(function_context->get(index)); |
| 7447 } | 7449 } |
| 7448 } | 7450 } |
| 7449 | 7451 |
| 7450 const int length = frame->GetProvidedParametersCount(); | 7452 const int length = frame->GetProvidedParametersCount(); |
| 7451 Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length); | 7453 Handle<JSObject> arguments = Factory::NewArgumentsObject(function, length); |
| 7452 Handle<FixedArray> array = Factory::NewFixedArray(length); | 7454 Handle<FixedArray> array = Factory::NewFixedArray(length); |
| 7453 WriteBarrierMode mode = array->GetWriteBarrierMode(); | 7455 |
| 7456 AssertNoAllocation no_gc; |
| 7457 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); |
| 7454 for (int i = 0; i < length; i++) { | 7458 for (int i = 0; i < length; i++) { |
| 7455 array->set(i, frame->GetParameter(i), mode); | 7459 array->set(i, frame->GetParameter(i), mode); |
| 7456 } | 7460 } |
| 7457 arguments->set_elements(*array); | 7461 arguments->set_elements(*array); |
| 7458 return arguments; | 7462 return arguments; |
| 7459 } | 7463 } |
| 7460 | 7464 |
| 7461 | 7465 |
| 7462 // Evaluate a piece of JavaScript in the context of a stack frame for | 7466 // Evaluate a piece of JavaScript in the context of a stack frame for |
| 7463 // debugging. This is accomplished by creating a new context which in its | 7467 // debugging. This is accomplished by creating a new context which in its |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8025 JavaScriptFrame* frame = JavaScriptFrame::cast(raw_frame); | 8029 JavaScriptFrame* frame = JavaScriptFrame::cast(raw_frame); |
| 8026 Object* recv = frame->receiver(); | 8030 Object* recv = frame->receiver(); |
| 8027 Object* fun = frame->function(); | 8031 Object* fun = frame->function(); |
| 8028 Address pc = frame->pc(); | 8032 Address pc = frame->pc(); |
| 8029 Address start = frame->code()->address(); | 8033 Address start = frame->code()->address(); |
| 8030 Smi* offset = Smi::FromInt(static_cast<int>(pc - start)); | 8034 Smi* offset = Smi::FromInt(static_cast<int>(pc - start)); |
| 8031 FixedArray* elements = FixedArray::cast(result->elements()); | 8035 FixedArray* elements = FixedArray::cast(result->elements()); |
| 8032 if (cursor + 2 < elements->length()) { | 8036 if (cursor + 2 < elements->length()) { |
| 8033 elements->set(cursor++, recv); | 8037 elements->set(cursor++, recv); |
| 8034 elements->set(cursor++, fun); | 8038 elements->set(cursor++, fun); |
| 8035 elements->set(cursor++, offset, SKIP_WRITE_BARRIER); | 8039 elements->set(cursor++, offset); |
| 8036 } else { | 8040 } else { |
| 8037 HandleScope scope; | 8041 HandleScope scope; |
| 8038 Handle<Object> recv_handle(recv); | 8042 Handle<Object> recv_handle(recv); |
| 8039 Handle<Object> fun_handle(fun); | 8043 Handle<Object> fun_handle(fun); |
| 8040 SetElement(result, cursor++, recv_handle); | 8044 SetElement(result, cursor++, recv_handle); |
| 8041 SetElement(result, cursor++, fun_handle); | 8045 SetElement(result, cursor++, fun_handle); |
| 8042 SetElement(result, cursor++, Handle<Smi>(offset)); | 8046 SetElement(result, cursor++, Handle<Smi>(offset)); |
| 8043 } | 8047 } |
| 8044 } | 8048 } |
| 8045 iter.Advance(); | 8049 iter.Advance(); |
| 8046 } | 8050 } |
| 8047 | 8051 |
| 8048 result->set_length(Smi::FromInt(cursor), SKIP_WRITE_BARRIER); | 8052 result->set_length(Smi::FromInt(cursor)); |
| 8049 | |
| 8050 return *result; | 8053 return *result; |
| 8051 } | 8054 } |
| 8052 | 8055 |
| 8053 | 8056 |
| 8054 // Returns V8 version as a string. | 8057 // Returns V8 version as a string. |
| 8055 static Object* Runtime_GetV8Version(Arguments args) { | 8058 static Object* Runtime_GetV8Version(Arguments args) { |
| 8056 ASSERT_EQ(args.length(), 0); | 8059 ASSERT_EQ(args.length(), 0); |
| 8057 | 8060 |
| 8058 NoHandleAllocation ha; | 8061 NoHandleAllocation ha; |
| 8059 | 8062 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8163 } else { | 8166 } else { |
| 8164 // Handle last resort GC and make sure to allow future allocations | 8167 // Handle last resort GC and make sure to allow future allocations |
| 8165 // to grow the heap without causing GCs (if possible). | 8168 // to grow the heap without causing GCs (if possible). |
| 8166 Counters::gc_last_resort_from_js.Increment(); | 8169 Counters::gc_last_resort_from_js.Increment(); |
| 8167 Heap::CollectAllGarbage(false); | 8170 Heap::CollectAllGarbage(false); |
| 8168 } | 8171 } |
| 8169 } | 8172 } |
| 8170 | 8173 |
| 8171 | 8174 |
| 8172 } } // namespace v8::internal | 8175 } } // namespace v8::internal |
| OLD | NEW |