OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Review notes: | 5 // Review notes: |
6 // | 6 // |
7 // - The use of macros in these inline functions may seem superfluous | 7 // - The use of macros in these inline functions may seem superfluous |
8 // but it is absolutely needed to make sure gcc generates optimal | 8 // but it is absolutely needed to make sure gcc generates optimal |
9 // code. gcc is not happy when attempting to inline too deep. | 9 // code. gcc is not happy when attempting to inline too deep. |
10 // | 10 // |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
155 #undef SIMD128_TYPE_CHECKER | 155 #undef SIMD128_TYPE_CHECKER |
156 | 156 |
157 #define IS_TYPE_FUNCTION_DEF(type_) \ | 157 #define IS_TYPE_FUNCTION_DEF(type_) \ |
158 bool Object::Is##type_() const { \ | 158 bool Object::Is##type_() const { \ |
159 return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \ | 159 return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \ |
160 } | 160 } |
161 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF) | 161 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF) |
162 ODDBALL_LIST(IS_TYPE_FUNCTION_DEF) | 162 ODDBALL_LIST(IS_TYPE_FUNCTION_DEF) |
163 #undef IS_TYPE_FUNCTION_DEF | 163 #undef IS_TYPE_FUNCTION_DEF |
164 | 164 |
165 bool HeapObject::IsTheHole(Isolate* isolate) const { | |
166 return this == isolate->heap()->the_hole_value(); | |
167 } | |
168 | |
169 bool HeapObject::IsUndefined(Isolate* isolate) const { | |
170 return this == isolate->heap()->undefined_value(); | |
171 } | |
172 | |
173 bool Object::IsTheHole(Isolate* isolate) const { | |
174 return this == isolate->heap()->the_hole_value(); | |
175 } | |
176 | |
177 bool Object::IsUndefined(Isolate* isolate) const { | |
178 return this == isolate->heap()->undefined_value(); | |
179 } | |
180 | |
165 bool HeapObject::IsString() const { | 181 bool HeapObject::IsString() const { |
166 return map()->instance_type() < FIRST_NONSTRING_TYPE; | 182 return map()->instance_type() < FIRST_NONSTRING_TYPE; |
167 } | 183 } |
168 | 184 |
169 bool HeapObject::IsName() const { | 185 bool HeapObject::IsName() const { |
170 return map()->instance_type() <= LAST_NAME_TYPE; | 186 return map()->instance_type() <= LAST_NAME_TYPE; |
171 } | 187 } |
172 | 188 |
173 bool HeapObject::IsUniqueName() const { | 189 bool HeapObject::IsUniqueName() const { |
174 return IsInternalizedString() || IsSymbol(); | 190 return IsInternalizedString() || IsSymbol(); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
237 return StringShape(String::cast(this)).IsExternal() && | 253 return StringShape(String::cast(this)).IsExternal() && |
238 String::cast(this)->IsOneByteRepresentation(); | 254 String::cast(this)->IsOneByteRepresentation(); |
239 } | 255 } |
240 | 256 |
241 bool HeapObject::IsExternalTwoByteString() const { | 257 bool HeapObject::IsExternalTwoByteString() const { |
242 if (!IsString()) return false; | 258 if (!IsString()) return false; |
243 return StringShape(String::cast(this)).IsExternal() && | 259 return StringShape(String::cast(this)).IsExternal() && |
244 String::cast(this)->IsTwoByteRepresentation(); | 260 String::cast(this)->IsTwoByteRepresentation(); |
245 } | 261 } |
246 | 262 |
247 | |
248 bool Object::HasValidElements() { | 263 bool Object::HasValidElements() { |
249 // Dictionary is covered under FixedArray. | 264 // Dictionary is covered under FixedArray. |
250 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); | 265 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); |
251 } | 266 } |
252 | 267 |
253 | 268 |
254 bool Object::KeyEquals(Object* second) { | 269 bool Object::KeyEquals(Object* second) { |
255 Object* first = this; | 270 Object* first = this; |
256 if (second->IsNumber()) { | 271 if (second->IsNumber()) { |
257 if (first->IsNumber()) return first->Number() == second->Number(); | 272 if (first->IsNumber()) return first->Number() == second->Number(); |
(...skipping 1258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1516 | 1531 |
1517 ACCESSORS(JSReceiver, properties, FixedArray, kPropertiesOffset) | 1532 ACCESSORS(JSReceiver, properties, FixedArray, kPropertiesOffset) |
1518 | 1533 |
1519 | 1534 |
1520 Object** FixedArray::GetFirstElementAddress() { | 1535 Object** FixedArray::GetFirstElementAddress() { |
1521 return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0))); | 1536 return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0))); |
1522 } | 1537 } |
1523 | 1538 |
1524 | 1539 |
1525 bool FixedArray::ContainsOnlySmisOrHoles() { | 1540 bool FixedArray::ContainsOnlySmisOrHoles() { |
1526 Object* the_hole = GetHeap()->the_hole_value(); | 1541 Isolate* isolate = GetIsolate(); |
1527 Object** current = GetFirstElementAddress(); | 1542 Object** current = GetFirstElementAddress(); |
1528 for (int i = 0; i < length(); ++i) { | 1543 for (int i = 0; i < length(); ++i) { |
1529 Object* candidate = *current++; | 1544 Object* candidate = *current++; |
1530 if (!candidate->IsSmi() && candidate != the_hole) return false; | 1545 if (!candidate->IsSmi() && !candidate->IsTheHole(isolate)) return false; |
1531 } | 1546 } |
1532 return true; | 1547 return true; |
1533 } | 1548 } |
1534 | 1549 |
1535 | 1550 |
1536 FixedArrayBase* JSObject::elements() const { | 1551 FixedArrayBase* JSObject::elements() const { |
1537 Object* array = READ_FIELD(this, kElementsOffset); | 1552 Object* array = READ_FIELD(this, kElementsOffset); |
1538 return static_cast<FixedArrayBase*>(array); | 1553 return static_cast<FixedArrayBase*>(array); |
1539 } | 1554 } |
1540 | 1555 |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1794 Object** objects, | 1809 Object** objects, |
1795 uint32_t count, | 1810 uint32_t count, |
1796 EnsureElementsMode mode) { | 1811 EnsureElementsMode mode) { |
1797 ElementsKind current_kind = object->GetElementsKind(); | 1812 ElementsKind current_kind = object->GetElementsKind(); |
1798 ElementsKind target_kind = current_kind; | 1813 ElementsKind target_kind = current_kind; |
1799 { | 1814 { |
1800 DisallowHeapAllocation no_allocation; | 1815 DisallowHeapAllocation no_allocation; |
1801 DCHECK(mode != ALLOW_COPIED_DOUBLE_ELEMENTS); | 1816 DCHECK(mode != ALLOW_COPIED_DOUBLE_ELEMENTS); |
1802 bool is_holey = IsFastHoleyElementsKind(current_kind); | 1817 bool is_holey = IsFastHoleyElementsKind(current_kind); |
1803 if (current_kind == FAST_HOLEY_ELEMENTS) return; | 1818 if (current_kind == FAST_HOLEY_ELEMENTS) return; |
1804 Heap* heap = object->GetHeap(); | 1819 Isolate* isolate = object->GetIsolate(); |
1805 Object* the_hole = heap->the_hole_value(); | |
1806 for (uint32_t i = 0; i < count; ++i) { | 1820 for (uint32_t i = 0; i < count; ++i) { |
1807 Object* current = *objects++; | 1821 Object* current = *objects++; |
1808 if (current == the_hole) { | 1822 if (current->IsTheHole(isolate)) { |
1809 is_holey = true; | 1823 is_holey = true; |
1810 target_kind = GetHoleyElementsKind(target_kind); | 1824 target_kind = GetHoleyElementsKind(target_kind); |
1811 } else if (!current->IsSmi()) { | 1825 } else if (!current->IsSmi()) { |
1812 if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && current->IsNumber()) { | 1826 if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && current->IsNumber()) { |
1813 if (IsFastSmiElementsKind(target_kind)) { | 1827 if (IsFastSmiElementsKind(target_kind)) { |
1814 if (is_holey) { | 1828 if (is_holey) { |
1815 target_kind = FAST_HOLEY_DOUBLE_ELEMENTS; | 1829 target_kind = FAST_HOLEY_DOUBLE_ELEMENTS; |
1816 } else { | 1830 } else { |
1817 target_kind = FAST_DOUBLE_ELEMENTS; | 1831 target_kind = FAST_DOUBLE_ELEMENTS; |
1818 } | 1832 } |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2001 WRITE_BARRIER(GetHeap(), this, kNextOffset, val); | 2015 WRITE_BARRIER(GetHeap(), this, kNextOffset, val); |
2002 } | 2016 } |
2003 } | 2017 } |
2004 | 2018 |
2005 | 2019 |
2006 void WeakCell::clear_next(Object* the_hole_value) { | 2020 void WeakCell::clear_next(Object* the_hole_value) { |
2007 DCHECK_EQ(GetHeap()->the_hole_value(), the_hole_value); | 2021 DCHECK_EQ(GetHeap()->the_hole_value(), the_hole_value); |
2008 set_next(the_hole_value, SKIP_WRITE_BARRIER); | 2022 set_next(the_hole_value, SKIP_WRITE_BARRIER); |
2009 } | 2023 } |
2010 | 2024 |
2011 | 2025 bool WeakCell::next_cleared() { return next()->IsTheHole(GetIsolate()); } |
2012 bool WeakCell::next_cleared() { return next()->IsTheHole(); } | |
2013 | |
2014 | 2026 |
2015 int JSObject::GetHeaderSize() { return GetHeaderSize(map()->instance_type()); } | 2027 int JSObject::GetHeaderSize() { return GetHeaderSize(map()->instance_type()); } |
2016 | 2028 |
2017 | 2029 |
2018 int JSObject::GetHeaderSize(InstanceType type) { | 2030 int JSObject::GetHeaderSize(InstanceType type) { |
2019 // Check for the most common kind of JavaScript object before | 2031 // Check for the most common kind of JavaScript object before |
2020 // falling into the generic switch. This speeds up the internal | 2032 // falling into the generic switch. This speeds up the internal |
2021 // field operations considerably on average. | 2033 // field operations considerably on average. |
2022 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; | 2034 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; |
2023 switch (type) { | 2035 switch (type) { |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2273 bool Object::ToArrayLength(uint32_t* index) { return Object::ToUint32(index); } | 2285 bool Object::ToArrayLength(uint32_t* index) { return Object::ToUint32(index); } |
2274 | 2286 |
2275 | 2287 |
2276 bool Object::ToArrayIndex(uint32_t* index) { | 2288 bool Object::ToArrayIndex(uint32_t* index) { |
2277 return Object::ToUint32(index) && *index != kMaxUInt32; | 2289 return Object::ToUint32(index) && *index != kMaxUInt32; |
2278 } | 2290 } |
2279 | 2291 |
2280 | 2292 |
2281 void Object::VerifyApiCallResultType() { | 2293 void Object::VerifyApiCallResultType() { |
2282 #if DEBUG | 2294 #if DEBUG |
2283 if (!(IsSmi() || IsString() || IsSymbol() || IsJSReceiver() || | 2295 if (IsSmi()) return; |
2284 IsHeapNumber() || IsSimd128Value() || IsUndefined() || IsTrue() || | 2296 DCHECK(IsHeapObject()); |
2285 IsFalse() || IsNull())) { | 2297 Isolate* isolate = HeapObject::cast(this)->GetIsolate(); |
2298 if (!(IsString() || IsSymbol() || IsJSReceiver() || IsHeapNumber() || | |
2299 IsSimd128Value() || IsUndefined(isolate) || IsTrue() || IsFalse() || | |
2300 IsNull())) { | |
2286 FATAL("API call returned invalid object"); | 2301 FATAL("API call returned invalid object"); |
2287 } | 2302 } |
2288 #endif // DEBUG | 2303 #endif // DEBUG |
2289 } | 2304 } |
2290 | 2305 |
2291 | 2306 |
2292 Object* FixedArray::get(int index) const { | 2307 Object* FixedArray::get(int index) const { |
2293 SLOW_DCHECK(index >= 0 && index < this->length()); | 2308 SLOW_DCHECK(index >= 0 && index < this->length()); |
2294 return READ_FIELD(this, kHeaderSize + index * kPointerSize); | 2309 return READ_FIELD(this, kHeaderSize + index * kPointerSize); |
2295 } | 2310 } |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2458 return data_start() + kFirstIndex + index; | 2473 return data_start() + kFirstIndex + index; |
2459 } | 2474 } |
2460 | 2475 |
2461 | 2476 |
2462 void ArrayList::Set(int index, Object* obj) { | 2477 void ArrayList::Set(int index, Object* obj) { |
2463 FixedArray::cast(this)->set(kFirstIndex + index, obj); | 2478 FixedArray::cast(this)->set(kFirstIndex + index, obj); |
2464 } | 2479 } |
2465 | 2480 |
2466 | 2481 |
2467 void ArrayList::Clear(int index, Object* undefined) { | 2482 void ArrayList::Clear(int index, Object* undefined) { |
2468 DCHECK(undefined->IsUndefined()); | 2483 DCHECK(undefined->IsUndefined(GetIsolate())); |
2469 FixedArray::cast(this) | 2484 FixedArray::cast(this) |
2470 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER); | 2485 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER); |
2471 } | 2486 } |
2472 | 2487 |
2473 | 2488 |
2474 WriteBarrierMode HeapObject::GetWriteBarrierMode( | 2489 WriteBarrierMode HeapObject::GetWriteBarrierMode( |
2475 const DisallowHeapAllocation& promise) { | 2490 const DisallowHeapAllocation& promise) { |
2476 Heap* heap = GetHeap(); | 2491 Heap* heap = GetHeap(); |
2477 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; | 2492 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; |
2478 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; | 2493 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3014 const int kMinCapacity = 4; | 3029 const int kMinCapacity = 4; |
3015 int capacity = base::bits::RoundUpToPowerOfTwo32(at_least_space_for * 2); | 3030 int capacity = base::bits::RoundUpToPowerOfTwo32(at_least_space_for * 2); |
3016 return Max(capacity, kMinCapacity); | 3031 return Max(capacity, kMinCapacity); |
3017 } | 3032 } |
3018 | 3033 |
3019 bool HashTableBase::IsKey(Heap* heap, Object* k) { | 3034 bool HashTableBase::IsKey(Heap* heap, Object* k) { |
3020 return k != heap->the_hole_value() && k != heap->undefined_value(); | 3035 return k != heap->the_hole_value() && k != heap->undefined_value(); |
3021 } | 3036 } |
3022 | 3037 |
3023 bool HashTableBase::IsKey(Object* k) { | 3038 bool HashTableBase::IsKey(Object* k) { |
3024 return !k->IsTheHole() && !k->IsUndefined(); | 3039 Isolate* isolate = this->GetIsolate(); |
3040 return !k->IsTheHole(isolate) && !k->IsUndefined(isolate); | |
3025 } | 3041 } |
3026 | 3042 |
3027 | 3043 |
3028 void HashTableBase::SetNumberOfElements(int nof) { | 3044 void HashTableBase::SetNumberOfElements(int nof) { |
3029 set(kNumberOfElementsIndex, Smi::FromInt(nof)); | 3045 set(kNumberOfElementsIndex, Smi::FromInt(nof)); |
3030 } | 3046 } |
3031 | 3047 |
3032 | 3048 |
3033 void HashTableBase::SetNumberOfDeletedElements(int nod) { | 3049 void HashTableBase::SetNumberOfDeletedElements(int nod) { |
3034 set(kNumberOfDeletedElementsIndex, Smi::FromInt(nod)); | 3050 set(kNumberOfDeletedElementsIndex, Smi::FromInt(nod)); |
(...skipping 13 matching lines...) Expand all Loading... | |
3048 | 3064 |
3049 | 3065 |
3050 // Find entry for key otherwise return kNotFound. | 3066 // Find entry for key otherwise return kNotFound. |
3051 template <typename Derived, typename Shape, typename Key> | 3067 template <typename Derived, typename Shape, typename Key> |
3052 int HashTable<Derived, Shape, Key>::FindEntry(Isolate* isolate, Key key, | 3068 int HashTable<Derived, Shape, Key>::FindEntry(Isolate* isolate, Key key, |
3053 int32_t hash) { | 3069 int32_t hash) { |
3054 uint32_t capacity = Capacity(); | 3070 uint32_t capacity = Capacity(); |
3055 uint32_t entry = FirstProbe(hash, capacity); | 3071 uint32_t entry = FirstProbe(hash, capacity); |
3056 uint32_t count = 1; | 3072 uint32_t count = 1; |
3057 // EnsureCapacity will guarantee the hash table is never full. | 3073 // EnsureCapacity will guarantee the hash table is never full. |
3058 Object* undefined = isolate->heap()->undefined_value(); | |
3059 Object* the_hole = isolate->heap()->the_hole_value(); | |
3060 while (true) { | 3074 while (true) { |
3061 Object* element = KeyAt(entry); | 3075 Object* element = KeyAt(entry); |
3062 // Empty entry. Uses raw unchecked accessors because it is called by the | 3076 // Empty entry. Uses raw unchecked accessors because it is called by the |
3063 // string table during bootstrapping. | 3077 // string table during bootstrapping. |
3064 if (element == undefined) break; | 3078 if (element->IsUndefined(isolate)) break; |
ulan
2016/06/01 19:01:44
Isn't this performance critical?
Before it was on
| |
3065 if (element != the_hole && Shape::IsMatch(key, element)) return entry; | 3079 if (!element->IsTheHole(isolate) && Shape::IsMatch(key, element)) { |
3080 return entry; | |
3081 } | |
3066 entry = NextProbe(entry, count++, capacity); | 3082 entry = NextProbe(entry, count++, capacity); |
3067 } | 3083 } |
3068 return kNotFound; | 3084 return kNotFound; |
3069 } | 3085 } |
3070 | 3086 |
3071 bool StringSetShape::IsMatch(String* key, Object* value) { | 3087 bool StringSetShape::IsMatch(String* key, Object* value) { |
3072 return value->IsString() && key->Equals(String::cast(value)); | 3088 return value->IsString() && key->Equals(String::cast(value)); |
3073 } | 3089 } |
3074 | 3090 |
3075 uint32_t StringSetShape::Hash(String* key) { return key->Hash(); } | 3091 uint32_t StringSetShape::Hash(String* key) { return key->Hash(); } |
(...skipping 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4214 ElementType cast_value = Traits::defaultValue(); | 4230 ElementType cast_value = Traits::defaultValue(); |
4215 if (value->IsSmi()) { | 4231 if (value->IsSmi()) { |
4216 int int_value = Smi::cast(value)->value(); | 4232 int int_value = Smi::cast(value)->value(); |
4217 cast_value = from_int(int_value); | 4233 cast_value = from_int(int_value); |
4218 } else if (value->IsHeapNumber()) { | 4234 } else if (value->IsHeapNumber()) { |
4219 double double_value = HeapNumber::cast(value)->value(); | 4235 double double_value = HeapNumber::cast(value)->value(); |
4220 cast_value = from_double(double_value); | 4236 cast_value = from_double(double_value); |
4221 } else { | 4237 } else { |
4222 // Clamp undefined to the default value. All other types have been | 4238 // Clamp undefined to the default value. All other types have been |
4223 // converted to a number type further up in the call chain. | 4239 // converted to a number type further up in the call chain. |
4224 DCHECK(value->IsUndefined()); | 4240 DCHECK(value->IsUndefined(GetIsolate())); |
4225 } | 4241 } |
4226 set(index, cast_value); | 4242 set(index, cast_value); |
4227 } | 4243 } |
4228 | 4244 |
4229 | 4245 |
4230 Handle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) { | 4246 Handle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) { |
4231 return handle(Smi::FromInt(scalar), isolate); | 4247 return handle(Smi::FromInt(scalar), isolate); |
4232 } | 4248 } |
4233 | 4249 |
4234 | 4250 |
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5398 void Map::set_prototype_info(Object* value, WriteBarrierMode mode) { | 5414 void Map::set_prototype_info(Object* value, WriteBarrierMode mode) { |
5399 DCHECK(is_prototype_map()); | 5415 DCHECK(is_prototype_map()); |
5400 WRITE_FIELD(this, Map::kTransitionsOrPrototypeInfoOffset, value); | 5416 WRITE_FIELD(this, Map::kTransitionsOrPrototypeInfoOffset, value); |
5401 CONDITIONAL_WRITE_BARRIER( | 5417 CONDITIONAL_WRITE_BARRIER( |
5402 GetHeap(), this, Map::kTransitionsOrPrototypeInfoOffset, value, mode); | 5418 GetHeap(), this, Map::kTransitionsOrPrototypeInfoOffset, value, mode); |
5403 } | 5419 } |
5404 | 5420 |
5405 | 5421 |
5406 void Map::SetBackPointer(Object* value, WriteBarrierMode mode) { | 5422 void Map::SetBackPointer(Object* value, WriteBarrierMode mode) { |
5407 DCHECK(instance_type() >= FIRST_JS_RECEIVER_TYPE); | 5423 DCHECK(instance_type() >= FIRST_JS_RECEIVER_TYPE); |
5408 DCHECK((value->IsMap() && GetBackPointer()->IsUndefined())); | 5424 DCHECK(value->IsMap()); |
5425 DCHECK(GetBackPointer()->IsUndefined(GetIsolate())); | |
5409 DCHECK(!value->IsMap() || | 5426 DCHECK(!value->IsMap() || |
5410 Map::cast(value)->GetConstructor() == constructor_or_backpointer()); | 5427 Map::cast(value)->GetConstructor() == constructor_or_backpointer()); |
5411 set_constructor_or_backpointer(value, mode); | 5428 set_constructor_or_backpointer(value, mode); |
5412 } | 5429 } |
5413 | 5430 |
5414 | 5431 |
5415 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) | 5432 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) |
5416 ACCESSORS(Map, dependent_code, DependentCode, kDependentCodeOffset) | 5433 ACCESSORS(Map, dependent_code, DependentCode, kDependentCodeOffset) |
5417 ACCESSORS(Map, weak_cell_cache, Object, kWeakCellCacheOffset) | 5434 ACCESSORS(Map, weak_cell_cache, Object, kWeakCellCacheOffset) |
5418 ACCESSORS(Map, constructor_or_backpointer, Object, | 5435 ACCESSORS(Map, constructor_or_backpointer, Object, |
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5938 return function_data()->IsFunctionTemplateInfo(); | 5955 return function_data()->IsFunctionTemplateInfo(); |
5939 } | 5956 } |
5940 | 5957 |
5941 | 5958 |
5942 FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() { | 5959 FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() { |
5943 DCHECK(IsApiFunction()); | 5960 DCHECK(IsApiFunction()); |
5944 return FunctionTemplateInfo::cast(function_data()); | 5961 return FunctionTemplateInfo::cast(function_data()); |
5945 } | 5962 } |
5946 | 5963 |
5947 void SharedFunctionInfo::set_api_func_data(FunctionTemplateInfo* data) { | 5964 void SharedFunctionInfo::set_api_func_data(FunctionTemplateInfo* data) { |
5948 DCHECK(function_data()->IsUndefined()); | 5965 DCHECK(function_data()->IsUndefined(GetIsolate())); |
5949 set_function_data(data); | 5966 set_function_data(data); |
5950 } | 5967 } |
5951 | 5968 |
5952 bool SharedFunctionInfo::HasBytecodeArray() { | 5969 bool SharedFunctionInfo::HasBytecodeArray() { |
5953 return function_data()->IsBytecodeArray(); | 5970 return function_data()->IsBytecodeArray(); |
5954 } | 5971 } |
5955 | 5972 |
5956 BytecodeArray* SharedFunctionInfo::bytecode_array() { | 5973 BytecodeArray* SharedFunctionInfo::bytecode_array() { |
5957 DCHECK(HasBytecodeArray()); | 5974 DCHECK(HasBytecodeArray()); |
5958 return BytecodeArray::cast(function_data()); | 5975 return BytecodeArray::cast(function_data()); |
5959 } | 5976 } |
5960 | 5977 |
5961 void SharedFunctionInfo::set_bytecode_array(BytecodeArray* bytecode) { | 5978 void SharedFunctionInfo::set_bytecode_array(BytecodeArray* bytecode) { |
5962 DCHECK(function_data()->IsUndefined()); | 5979 DCHECK(function_data()->IsUndefined(GetIsolate())); |
5963 set_function_data(bytecode); | 5980 set_function_data(bytecode); |
5964 } | 5981 } |
5965 | 5982 |
5966 void SharedFunctionInfo::ClearBytecodeArray() { | 5983 void SharedFunctionInfo::ClearBytecodeArray() { |
5967 DCHECK(function_data()->IsUndefined() || HasBytecodeArray()); | 5984 DCHECK(function_data()->IsUndefined(GetIsolate()) || HasBytecodeArray()); |
5968 set_function_data(GetHeap()->undefined_value()); | 5985 set_function_data(GetHeap()->undefined_value()); |
5969 } | 5986 } |
5970 | 5987 |
5971 bool SharedFunctionInfo::HasBuiltinFunctionId() { | 5988 bool SharedFunctionInfo::HasBuiltinFunctionId() { |
5972 return function_identifier()->IsSmi(); | 5989 return function_identifier()->IsSmi(); |
5973 } | 5990 } |
5974 | 5991 |
5975 BuiltinFunctionId SharedFunctionInfo::builtin_function_id() { | 5992 BuiltinFunctionId SharedFunctionInfo::builtin_function_id() { |
5976 DCHECK(HasBuiltinFunctionId()); | 5993 DCHECK(HasBuiltinFunctionId()); |
5977 return static_cast<BuiltinFunctionId>( | 5994 return static_cast<BuiltinFunctionId>( |
5978 Smi::cast(function_identifier())->value()); | 5995 Smi::cast(function_identifier())->value()); |
5979 } | 5996 } |
5980 | 5997 |
5981 void SharedFunctionInfo::set_builtin_function_id(BuiltinFunctionId id) { | 5998 void SharedFunctionInfo::set_builtin_function_id(BuiltinFunctionId id) { |
5982 set_function_identifier(Smi::FromInt(id)); | 5999 set_function_identifier(Smi::FromInt(id)); |
5983 } | 6000 } |
5984 | 6001 |
5985 bool SharedFunctionInfo::HasInferredName() { | 6002 bool SharedFunctionInfo::HasInferredName() { |
5986 return function_identifier()->IsString(); | 6003 return function_identifier()->IsString(); |
5987 } | 6004 } |
5988 | 6005 |
5989 String* SharedFunctionInfo::inferred_name() { | 6006 String* SharedFunctionInfo::inferred_name() { |
5990 if (HasInferredName()) { | 6007 if (HasInferredName()) { |
5991 return String::cast(function_identifier()); | 6008 return String::cast(function_identifier()); |
5992 } | 6009 } |
5993 DCHECK(function_identifier()->IsUndefined() || HasBuiltinFunctionId()); | 6010 Isolate* isolate = GetIsolate(); |
5994 return GetIsolate()->heap()->empty_string(); | 6011 DCHECK(function_identifier()->IsUndefined(isolate) || HasBuiltinFunctionId()); |
6012 return isolate->heap()->empty_string(); | |
5995 } | 6013 } |
5996 | 6014 |
5997 void SharedFunctionInfo::set_inferred_name(String* inferred_name) { | 6015 void SharedFunctionInfo::set_inferred_name(String* inferred_name) { |
5998 DCHECK(function_identifier()->IsUndefined() || HasInferredName()); | 6016 DCHECK(function_identifier()->IsUndefined(GetIsolate()) || HasInferredName()); |
5999 set_function_identifier(inferred_name); | 6017 set_function_identifier(inferred_name); |
6000 } | 6018 } |
6001 | 6019 |
6002 int SharedFunctionInfo::ic_age() { | 6020 int SharedFunctionInfo::ic_age() { |
6003 return ICAgeBits::decode(counters()); | 6021 return ICAgeBits::decode(counters()); |
6004 } | 6022 } |
6005 | 6023 |
6006 | 6024 |
6007 void SharedFunctionInfo::set_ic_age(int ic_age) { | 6025 void SharedFunctionInfo::set_ic_age(int ic_age) { |
6008 set_counters(ICAgeBits::update(counters(), ic_age)); | 6026 set_counters(ICAgeBits::update(counters(), ic_age)); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6074 | 6092 |
6075 | 6093 |
6076 void SharedFunctionInfo::set_disable_optimization_reason(BailoutReason reason) { | 6094 void SharedFunctionInfo::set_disable_optimization_reason(BailoutReason reason) { |
6077 set_opt_count_and_bailout_reason(DisabledOptimizationReasonBits::update( | 6095 set_opt_count_and_bailout_reason(DisabledOptimizationReasonBits::update( |
6078 opt_count_and_bailout_reason(), reason)); | 6096 opt_count_and_bailout_reason(), reason)); |
6079 } | 6097 } |
6080 | 6098 |
6081 | 6099 |
6082 bool SharedFunctionInfo::IsBuiltin() { | 6100 bool SharedFunctionInfo::IsBuiltin() { |
6083 Object* script_obj = script(); | 6101 Object* script_obj = script(); |
6084 if (script_obj->IsUndefined()) return true; | 6102 if (script_obj->IsUndefined(GetIsolate())) return true; |
6085 Script* script = Script::cast(script_obj); | 6103 Script* script = Script::cast(script_obj); |
6086 Script::Type type = static_cast<Script::Type>(script->type()); | 6104 Script::Type type = static_cast<Script::Type>(script->type()); |
6087 return type != Script::TYPE_NORMAL; | 6105 return type != Script::TYPE_NORMAL; |
6088 } | 6106 } |
6089 | 6107 |
6090 | 6108 |
6091 bool SharedFunctionInfo::IsSubjectToDebugging() { return !IsBuiltin(); } | 6109 bool SharedFunctionInfo::IsSubjectToDebugging() { return !IsBuiltin(); } |
6092 | 6110 |
6093 | 6111 |
6094 bool SharedFunctionInfo::OptimizedCodeMapIsCleared() const { | 6112 bool SharedFunctionInfo::OptimizedCodeMapIsCleared() const { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6207 | 6225 |
6208 JSObject* JSFunction::global_proxy() { | 6226 JSObject* JSFunction::global_proxy() { |
6209 return context()->global_proxy(); | 6227 return context()->global_proxy(); |
6210 } | 6228 } |
6211 | 6229 |
6212 | 6230 |
6213 Context* JSFunction::native_context() { return context()->native_context(); } | 6231 Context* JSFunction::native_context() { return context()->native_context(); } |
6214 | 6232 |
6215 | 6233 |
6216 void JSFunction::set_context(Object* value) { | 6234 void JSFunction::set_context(Object* value) { |
6217 DCHECK(value->IsUndefined() || value->IsContext()); | 6235 DCHECK(value->IsUndefined(GetIsolate()) || value->IsContext()); |
6218 WRITE_FIELD(this, kContextOffset, value); | 6236 WRITE_FIELD(this, kContextOffset, value); |
6219 WRITE_BARRIER(GetHeap(), this, kContextOffset, value); | 6237 WRITE_BARRIER(GetHeap(), this, kContextOffset, value); |
6220 } | 6238 } |
6221 | 6239 |
6222 ACCESSORS(JSFunction, prototype_or_initial_map, Object, | 6240 ACCESSORS(JSFunction, prototype_or_initial_map, Object, |
6223 kPrototypeOrInitialMapOffset) | 6241 kPrototypeOrInitialMapOffset) |
6224 | 6242 |
6225 | 6243 |
6226 Map* JSFunction::initial_map() { | 6244 Map* JSFunction::initial_map() { |
6227 return Map::cast(prototype_or_initial_map()); | 6245 return Map::cast(prototype_or_initial_map()); |
6228 } | 6246 } |
6229 | 6247 |
6230 | 6248 |
6231 bool JSFunction::has_initial_map() { | 6249 bool JSFunction::has_initial_map() { |
6232 return prototype_or_initial_map()->IsMap(); | 6250 return prototype_or_initial_map()->IsMap(); |
6233 } | 6251 } |
6234 | 6252 |
6235 | 6253 |
6236 bool JSFunction::has_instance_prototype() { | 6254 bool JSFunction::has_instance_prototype() { |
6237 return has_initial_map() || !prototype_or_initial_map()->IsTheHole(); | 6255 return has_initial_map() || |
6256 !prototype_or_initial_map()->IsTheHole(GetIsolate()); | |
6238 } | 6257 } |
6239 | 6258 |
6240 | 6259 |
6241 bool JSFunction::has_prototype() { | 6260 bool JSFunction::has_prototype() { |
6242 return map()->has_non_instance_prototype() || has_instance_prototype(); | 6261 return map()->has_non_instance_prototype() || has_instance_prototype(); |
6243 } | 6262 } |
6244 | 6263 |
6245 | 6264 |
6246 Object* JSFunction::instance_prototype() { | 6265 Object* JSFunction::instance_prototype() { |
6247 DCHECK(has_instance_prototype()); | 6266 DCHECK(has_instance_prototype()); |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6623 #endif | 6642 #endif |
6624 | 6643 |
6625 | 6644 |
6626 ACCESSORS(JSRegExp, data, Object, kDataOffset) | 6645 ACCESSORS(JSRegExp, data, Object, kDataOffset) |
6627 ACCESSORS(JSRegExp, flags, Object, kFlagsOffset) | 6646 ACCESSORS(JSRegExp, flags, Object, kFlagsOffset) |
6628 ACCESSORS(JSRegExp, source, Object, kSourceOffset) | 6647 ACCESSORS(JSRegExp, source, Object, kSourceOffset) |
6629 | 6648 |
6630 | 6649 |
6631 JSRegExp::Type JSRegExp::TypeTag() { | 6650 JSRegExp::Type JSRegExp::TypeTag() { |
6632 Object* data = this->data(); | 6651 Object* data = this->data(); |
6633 if (data->IsUndefined()) return JSRegExp::NOT_COMPILED; | 6652 if (data->IsUndefined(GetIsolate())) return JSRegExp::NOT_COMPILED; |
6634 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex)); | 6653 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex)); |
6635 return static_cast<JSRegExp::Type>(smi->value()); | 6654 return static_cast<JSRegExp::Type>(smi->value()); |
6636 } | 6655 } |
6637 | 6656 |
6638 | 6657 |
6639 int JSRegExp::CaptureCount() { | 6658 int JSRegExp::CaptureCount() { |
6640 switch (TypeTag()) { | 6659 switch (TypeTag()) { |
6641 case ATOM: | 6660 case ATOM: |
6642 return 0; | 6661 return 0; |
6643 case IRREGEXP: | 6662 case IRREGEXP: |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7312 return (getter() == getter_value) && (setter() == setter_value); | 7331 return (getter() == getter_value) && (setter() == setter_value); |
7313 } | 7332 } |
7314 | 7333 |
7315 | 7334 |
7316 bool AccessorPair::ContainsAccessor() { | 7335 bool AccessorPair::ContainsAccessor() { |
7317 return IsJSAccessor(getter()) || IsJSAccessor(setter()); | 7336 return IsJSAccessor(getter()) || IsJSAccessor(setter()); |
7318 } | 7337 } |
7319 | 7338 |
7320 | 7339 |
7321 bool AccessorPair::IsJSAccessor(Object* obj) { | 7340 bool AccessorPair::IsJSAccessor(Object* obj) { |
7322 return obj->IsCallable() || obj->IsUndefined(); | 7341 return obj->IsCallable() || obj->IsUndefined(GetIsolate()); |
7323 } | 7342 } |
7324 | 7343 |
7325 | 7344 |
7326 template<typename Derived, typename Shape, typename Key> | 7345 template<typename Derived, typename Shape, typename Key> |
7327 void Dictionary<Derived, Shape, Key>::SetEntry(int entry, | 7346 void Dictionary<Derived, Shape, Key>::SetEntry(int entry, |
7328 Handle<Object> key, | 7347 Handle<Object> key, |
7329 Handle<Object> value) { | 7348 Handle<Object> value) { |
7330 this->SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0))); | 7349 this->SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0))); |
7331 } | 7350 } |
7332 | 7351 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7457 Object* raw_value = dict->ValueAt(entry); | 7476 Object* raw_value = dict->ValueAt(entry); |
7458 DCHECK(raw_value->IsPropertyCell()); | 7477 DCHECK(raw_value->IsPropertyCell()); |
7459 PropertyCell* cell = PropertyCell::cast(raw_value); | 7478 PropertyCell* cell = PropertyCell::cast(raw_value); |
7460 cell->set_property_details(value); | 7479 cell->set_property_details(value); |
7461 } | 7480 } |
7462 | 7481 |
7463 | 7482 |
7464 template <typename Dictionary> | 7483 template <typename Dictionary> |
7465 bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) { | 7484 bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) { |
7466 DCHECK(dict->ValueAt(entry)->IsPropertyCell()); | 7485 DCHECK(dict->ValueAt(entry)->IsPropertyCell()); |
7467 return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole(); | 7486 Isolate* isolate = dict->GetIsolate(); |
7487 return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole(isolate); | |
7468 } | 7488 } |
7469 | 7489 |
7470 | 7490 |
7471 bool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) { | 7491 bool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) { |
7472 return key->SameValue(other); | 7492 return key->SameValue(other); |
7473 } | 7493 } |
7474 | 7494 |
7475 | 7495 |
7476 uint32_t ObjectHashTableShape::Hash(Handle<Object> key) { | 7496 uint32_t ObjectHashTableShape::Hash(Handle<Object> key) { |
7477 return Smi::cast(key->GetHash())->value(); | 7497 return Smi::cast(key->GetHash())->value(); |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7731 DCHECK_EQ(isolate_->relocatable_top(), this); | 7751 DCHECK_EQ(isolate_->relocatable_top(), this); |
7732 isolate_->set_relocatable_top(prev_); | 7752 isolate_->set_relocatable_top(prev_); |
7733 } | 7753 } |
7734 | 7754 |
7735 | 7755 |
7736 template<class Derived, class TableType> | 7756 template<class Derived, class TableType> |
7737 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() { | 7757 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() { |
7738 TableType* table(TableType::cast(this->table())); | 7758 TableType* table(TableType::cast(this->table())); |
7739 int index = Smi::cast(this->index())->value(); | 7759 int index = Smi::cast(this->index())->value(); |
7740 Object* key = table->KeyAt(index); | 7760 Object* key = table->KeyAt(index); |
7741 DCHECK(!key->IsTheHole()); | 7761 DCHECK(!key->IsTheHole(table->GetIsolate())); |
7742 return key; | 7762 return key; |
7743 } | 7763 } |
7744 | 7764 |
7745 | 7765 |
7746 void JSSetIterator::PopulateValueArray(FixedArray* array) { | 7766 void JSSetIterator::PopulateValueArray(FixedArray* array) { |
7747 array->set(0, CurrentKey()); | 7767 array->set(0, CurrentKey()); |
7748 } | 7768 } |
7749 | 7769 |
7750 | 7770 |
7751 void JSMapIterator::PopulateValueArray(FixedArray* array) { | 7771 void JSMapIterator::PopulateValueArray(FixedArray* array) { |
7752 array->set(0, CurrentKey()); | 7772 array->set(0, CurrentKey()); |
7753 array->set(1, CurrentValue()); | 7773 array->set(1, CurrentValue()); |
7754 } | 7774 } |
7755 | 7775 |
7756 | 7776 |
7757 Object* JSMapIterator::CurrentValue() { | 7777 Object* JSMapIterator::CurrentValue() { |
7758 OrderedHashMap* table(OrderedHashMap::cast(this->table())); | 7778 OrderedHashMap* table(OrderedHashMap::cast(this->table())); |
7759 int index = Smi::cast(this->index())->value(); | 7779 int index = Smi::cast(this->index())->value(); |
7760 Object* value = table->ValueAt(index); | 7780 Object* value = table->ValueAt(index); |
7761 DCHECK(!value->IsTheHole()); | 7781 DCHECK(!value->IsTheHole(table->GetIsolate())); |
7762 return value; | 7782 return value; |
7763 } | 7783 } |
7764 | 7784 |
7765 | 7785 |
7766 String::SubStringRange::SubStringRange(String* string, int first, int length) | 7786 String::SubStringRange::SubStringRange(String* string, int first, int length) |
7767 : string_(string), | 7787 : string_(string), |
7768 first_(first), | 7788 first_(first), |
7769 length_(length == -1 ? string->length() : length) {} | 7789 length_(length == -1 ? string->length() : length) {} |
7770 | 7790 |
7771 | 7791 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7887 #undef WRITE_INT64_FIELD | 7907 #undef WRITE_INT64_FIELD |
7888 #undef READ_BYTE_FIELD | 7908 #undef READ_BYTE_FIELD |
7889 #undef WRITE_BYTE_FIELD | 7909 #undef WRITE_BYTE_FIELD |
7890 #undef NOBARRIER_READ_BYTE_FIELD | 7910 #undef NOBARRIER_READ_BYTE_FIELD |
7891 #undef NOBARRIER_WRITE_BYTE_FIELD | 7911 #undef NOBARRIER_WRITE_BYTE_FIELD |
7892 | 7912 |
7893 } // namespace internal | 7913 } // namespace internal |
7894 } // namespace v8 | 7914 } // namespace v8 |
7895 | 7915 |
7896 #endif // V8_OBJECTS_INL_H_ | 7916 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |