| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 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 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 } | 1722 } |
| 1723 return undefined_value(); | 1723 return undefined_value(); |
| 1724 } | 1724 } |
| 1725 | 1725 |
| 1726 | 1726 |
| 1727 void Heap::SetNumberStringCache(Object* number, String* string) { | 1727 void Heap::SetNumberStringCache(Object* number, String* string) { |
| 1728 int hash; | 1728 int hash; |
| 1729 int mask = (number_string_cache()->length() >> 1) - 1; | 1729 int mask = (number_string_cache()->length() >> 1) - 1; |
| 1730 if (number->IsSmi()) { | 1730 if (number->IsSmi()) { |
| 1731 hash = smi_get_hash(Smi::cast(number)) & mask; | 1731 hash = smi_get_hash(Smi::cast(number)) & mask; |
| 1732 number_string_cache()->set(hash * 2, number, SKIP_WRITE_BARRIER); | 1732 number_string_cache()->set(hash * 2, Smi::cast(number)); |
| 1733 } else { | 1733 } else { |
| 1734 hash = double_get_hash(number->Number()) & mask; | 1734 hash = double_get_hash(number->Number()) & mask; |
| 1735 number_string_cache()->set(hash * 2, number); | 1735 number_string_cache()->set(hash * 2, number); |
| 1736 } | 1736 } |
| 1737 number_string_cache()->set(hash * 2 + 1, string); | 1737 number_string_cache()->set(hash * 2 + 1, string); |
| 1738 } | 1738 } |
| 1739 | 1739 |
| 1740 | 1740 |
| 1741 Object* Heap::SmiOrNumberFromDouble(double value, | 1741 Object* Heap::SmiOrNumberFromDouble(double value, |
| 1742 bool new_object, | 1742 bool new_object, |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1979 String::WriteToFlat(first, dest, 0, first_length); | 1979 String::WriteToFlat(first, dest, 0, first_length); |
| 1980 String::WriteToFlat(second, dest + first_length, 0, second_length); | 1980 String::WriteToFlat(second, dest + first_length, 0, second_length); |
| 1981 return result; | 1981 return result; |
| 1982 } | 1982 } |
| 1983 } | 1983 } |
| 1984 | 1984 |
| 1985 Map* map = is_ascii ? cons_ascii_string_map() : cons_string_map(); | 1985 Map* map = is_ascii ? cons_ascii_string_map() : cons_string_map(); |
| 1986 | 1986 |
| 1987 Object* result = Allocate(map, NEW_SPACE); | 1987 Object* result = Allocate(map, NEW_SPACE); |
| 1988 if (result->IsFailure()) return result; | 1988 if (result->IsFailure()) return result; |
| 1989 |
| 1990 AssertNoAllocation no_gc; |
| 1989 ConsString* cons_string = ConsString::cast(result); | 1991 ConsString* cons_string = ConsString::cast(result); |
| 1990 WriteBarrierMode mode = cons_string->GetWriteBarrierMode(); | 1992 WriteBarrierMode mode = cons_string->GetWriteBarrierMode(no_gc); |
| 1991 cons_string->set_length(length); | 1993 cons_string->set_length(length); |
| 1992 cons_string->set_hash_field(String::kEmptyHashField); | 1994 cons_string->set_hash_field(String::kEmptyHashField); |
| 1993 cons_string->set_first(first, mode); | 1995 cons_string->set_first(first, mode); |
| 1994 cons_string->set_second(second, mode); | 1996 cons_string->set_second(second, mode); |
| 1995 return result; | 1997 return result; |
| 1996 } | 1998 } |
| 1997 | 1999 |
| 1998 | 2000 |
| 1999 Object* Heap::AllocateSubString(String* buffer, | 2001 Object* Heap::AllocateSubString(String* buffer, |
| 2000 int start, | 2002 int start, |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2278 | 2280 |
| 2279 Object* Heap::InitializeFunction(JSFunction* function, | 2281 Object* Heap::InitializeFunction(JSFunction* function, |
| 2280 SharedFunctionInfo* shared, | 2282 SharedFunctionInfo* shared, |
| 2281 Object* prototype) { | 2283 Object* prototype) { |
| 2282 ASSERT(!prototype->IsMap()); | 2284 ASSERT(!prototype->IsMap()); |
| 2283 function->initialize_properties(); | 2285 function->initialize_properties(); |
| 2284 function->initialize_elements(); | 2286 function->initialize_elements(); |
| 2285 function->set_shared(shared); | 2287 function->set_shared(shared); |
| 2286 function->set_prototype_or_initial_map(prototype); | 2288 function->set_prototype_or_initial_map(prototype); |
| 2287 function->set_context(undefined_value()); | 2289 function->set_context(undefined_value()); |
| 2288 function->set_literals(empty_fixed_array(), SKIP_WRITE_BARRIER); | 2290 function->set_literals(empty_fixed_array()); |
| 2289 return function; | 2291 return function; |
| 2290 } | 2292 } |
| 2291 | 2293 |
| 2292 | 2294 |
| 2293 Object* Heap::AllocateFunctionPrototype(JSFunction* function) { | 2295 Object* Heap::AllocateFunctionPrototype(JSFunction* function) { |
| 2294 // Allocate the prototype. Make sure to use the object function | 2296 // Allocate the prototype. Make sure to use the object function |
| 2295 // from the function's context, since the function can be from a | 2297 // from the function's context, since the function can be from a |
| 2296 // different context. | 2298 // different context. |
| 2297 JSFunction* object_function = | 2299 JSFunction* object_function = |
| 2298 function->context()->global_context()->object_function(); | 2300 function->context()->global_context()->object_function(); |
| (...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2879 if (Heap::InNewSpace(obj)) { | 2881 if (Heap::InNewSpace(obj)) { |
| 2880 HeapObject* dst = HeapObject::cast(obj); | 2882 HeapObject* dst = HeapObject::cast(obj); |
| 2881 CopyBlock(reinterpret_cast<Object**>(dst->address()), | 2883 CopyBlock(reinterpret_cast<Object**>(dst->address()), |
| 2882 reinterpret_cast<Object**>(src->address()), | 2884 reinterpret_cast<Object**>(src->address()), |
| 2883 FixedArray::SizeFor(len)); | 2885 FixedArray::SizeFor(len)); |
| 2884 return obj; | 2886 return obj; |
| 2885 } | 2887 } |
| 2886 HeapObject::cast(obj)->set_map(src->map()); | 2888 HeapObject::cast(obj)->set_map(src->map()); |
| 2887 FixedArray* result = FixedArray::cast(obj); | 2889 FixedArray* result = FixedArray::cast(obj); |
| 2888 result->set_length(len); | 2890 result->set_length(len); |
| 2891 |
| 2889 // Copy the content | 2892 // Copy the content |
| 2890 WriteBarrierMode mode = result->GetWriteBarrierMode(); | 2893 AssertNoAllocation no_gc; |
| 2894 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); |
| 2891 for (int i = 0; i < len; i++) result->set(i, src->get(i), mode); | 2895 for (int i = 0; i < len; i++) result->set(i, src->get(i), mode); |
| 2892 return result; | 2896 return result; |
| 2893 } | 2897 } |
| 2894 | 2898 |
| 2895 | 2899 |
| 2896 Object* Heap::AllocateFixedArray(int length) { | 2900 Object* Heap::AllocateFixedArray(int length) { |
| 2897 ASSERT(length >= 0); | 2901 ASSERT(length >= 0); |
| 2898 if (length == 0) return empty_fixed_array(); | 2902 if (length == 0) return empty_fixed_array(); |
| 2899 Object* result = AllocateRawFixedArray(length); | 2903 Object* result = AllocateRawFixedArray(length); |
| 2900 if (!result->IsFailure()) { | 2904 if (!result->IsFailure()) { |
| 2901 // Initialize header. | 2905 // Initialize header. |
| 2902 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); | 2906 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); |
| 2903 FixedArray* array = FixedArray::cast(result); | 2907 FixedArray* array = FixedArray::cast(result); |
| 2904 array->set_length(length); | 2908 array->set_length(length); |
| 2905 Object* value = undefined_value(); | 2909 Object* value = undefined_value(); |
| 2906 // Initialize body. | 2910 // Initialize body. |
| 2907 for (int index = 0; index < length; index++) { | 2911 for (int index = 0; index < length; index++) { |
| 2912 ASSERT(!Heap::InNewSpace(value)); // value = undefined |
| 2908 array->set(index, value, SKIP_WRITE_BARRIER); | 2913 array->set(index, value, SKIP_WRITE_BARRIER); |
| 2909 } | 2914 } |
| 2910 } | 2915 } |
| 2911 return result; | 2916 return result; |
| 2912 } | 2917 } |
| 2913 | 2918 |
| 2914 | 2919 |
| 2915 Object* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { | 2920 Object* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { |
| 2916 ASSERT(length >= 0); | 2921 ASSERT(length >= 0); |
| 2917 ASSERT(empty_fixed_array()->IsFixedArray()); | 2922 ASSERT(empty_fixed_array()->IsFixedArray()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2953 result = lo_space_->AllocateRawFixedArray(size); | 2958 result = lo_space_->AllocateRawFixedArray(size); |
| 2954 } | 2959 } |
| 2955 if (result->IsFailure()) return result; | 2960 if (result->IsFailure()) return result; |
| 2956 | 2961 |
| 2957 // Initialize the object. | 2962 // Initialize the object. |
| 2958 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); | 2963 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); |
| 2959 FixedArray* array = FixedArray::cast(result); | 2964 FixedArray* array = FixedArray::cast(result); |
| 2960 array->set_length(length); | 2965 array->set_length(length); |
| 2961 Object* value = undefined_value(); | 2966 Object* value = undefined_value(); |
| 2962 for (int index = 0; index < length; index++) { | 2967 for (int index = 0; index < length; index++) { |
| 2968 ASSERT(!Heap::InNewSpace(value)); // value = undefined |
| 2963 array->set(index, value, SKIP_WRITE_BARRIER); | 2969 array->set(index, value, SKIP_WRITE_BARRIER); |
| 2964 } | 2970 } |
| 2965 return array; | 2971 return array; |
| 2966 } | 2972 } |
| 2967 | 2973 |
| 2968 | 2974 |
| 2969 Object* Heap::AllocateFixedArrayWithHoles(int length) { | 2975 Object* Heap::AllocateFixedArrayWithHoles(int length) { |
| 2970 if (length == 0) return empty_fixed_array(); | 2976 if (length == 0) return empty_fixed_array(); |
| 2971 Object* result = AllocateRawFixedArray(length); | 2977 Object* result = AllocateRawFixedArray(length); |
| 2972 if (!result->IsFailure()) { | 2978 if (!result->IsFailure()) { |
| 2973 // Initialize header. | 2979 // Initialize header. |
| 2974 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); | 2980 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); |
| 2975 FixedArray* array = FixedArray::cast(result); | 2981 FixedArray* array = FixedArray::cast(result); |
| 2976 array->set_length(length); | 2982 array->set_length(length); |
| 2977 // Initialize body. | 2983 // Initialize body. |
| 2978 Object* value = the_hole_value(); | 2984 Object* value = the_hole_value(); |
| 2979 for (int index = 0; index < length; index++) { | 2985 for (int index = 0; index < length; index++) { |
| 2986 ASSERT(!Heap::InNewSpace(value)); // value = the hole |
| 2980 array->set(index, value, SKIP_WRITE_BARRIER); | 2987 array->set(index, value, SKIP_WRITE_BARRIER); |
| 2981 } | 2988 } |
| 2982 } | 2989 } |
| 2983 return result; | 2990 return result; |
| 2984 } | 2991 } |
| 2985 | 2992 |
| 2986 | 2993 |
| 2987 Object* Heap::AllocateHashTable(int length) { | 2994 Object* Heap::AllocateHashTable(int length) { |
| 2988 Object* result = Heap::AllocateFixedArray(length); | 2995 Object* result = Heap::AllocateFixedArray(length); |
| 2989 if (result->IsFailure()) return result; | 2996 if (result->IsFailure()) return result; |
| (...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4215 void ExternalStringTable::TearDown() { | 4222 void ExternalStringTable::TearDown() { |
| 4216 new_space_strings_.Free(); | 4223 new_space_strings_.Free(); |
| 4217 old_space_strings_.Free(); | 4224 old_space_strings_.Free(); |
| 4218 } | 4225 } |
| 4219 | 4226 |
| 4220 | 4227 |
| 4221 List<Object*> ExternalStringTable::new_space_strings_; | 4228 List<Object*> ExternalStringTable::new_space_strings_; |
| 4222 List<Object*> ExternalStringTable::old_space_strings_; | 4229 List<Object*> ExternalStringTable::old_space_strings_; |
| 4223 | 4230 |
| 4224 } } // namespace v8::internal | 4231 } } // namespace v8::internal |
| OLD | NEW |