Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: src/objects-inl.h

Issue 2028983002: Introduce IsUndefined(Isolate*) and IsTheHole(Isolate*) (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase master Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) 148 TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE)
149 TYPE_CHECKER(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE) 149 TYPE_CHECKER(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE)
150 TYPE_CHECKER(Symbol, SYMBOL_TYPE) 150 TYPE_CHECKER(Symbol, SYMBOL_TYPE)
151 TYPE_CHECKER(Simd128Value, SIMD128_VALUE_TYPE) 151 TYPE_CHECKER(Simd128Value, SIMD128_VALUE_TYPE)
152 152
153 #define SIMD128_TYPE_CHECKER(TYPE, Type, type, lane_count, lane_type) \ 153 #define SIMD128_TYPE_CHECKER(TYPE, Type, type, lane_count, lane_type) \
154 bool HeapObject::Is##Type() const { return map() == GetHeap()->type##_map(); } 154 bool HeapObject::Is##Type() const { return map() == GetHeap()->type##_map(); }
155 SIMD128_TYPES(SIMD128_TYPE_CHECKER) 155 SIMD128_TYPES(SIMD128_TYPE_CHECKER)
156 #undef SIMD128_TYPE_CHECKER 156 #undef SIMD128_TYPE_CHECKER
157 157
158 // TODO(cbruni): remove once all the isolate-based versions are in place.
158 #define IS_TYPE_FUNCTION_DEF(type_) \ 159 #define IS_TYPE_FUNCTION_DEF(type_) \
159 bool Object::Is##type_() const { \ 160 bool Object::Is##type_() const { \
160 return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \ 161 return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \
161 } 162 }
162 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF) 163 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF)
163 ODDBALL_LIST(IS_TYPE_FUNCTION_DEF) 164 ODDBALL_LIST(IS_TYPE_FUNCTION_DEF)
164 #undef IS_TYPE_FUNCTION_DEF 165 #undef IS_TYPE_FUNCTION_DEF
165 166
167 bool HeapObject::IsTheHole(Isolate* isolate) const {
168 return this == isolate->heap()->the_hole_value();
169 }
170
171 bool HeapObject::IsUndefined(Isolate* isolate) const {
172 return this == isolate->heap()->undefined_value();
173 }
174
175 bool Object::IsTheHole(Isolate* isolate) const {
176 return this == isolate->heap()->the_hole_value();
177 }
178
179 bool Object::IsUndefined(Isolate* isolate) const {
180 return this == isolate->heap()->undefined_value();
181 }
182
166 bool HeapObject::IsString() const { 183 bool HeapObject::IsString() const {
167 return map()->instance_type() < FIRST_NONSTRING_TYPE; 184 return map()->instance_type() < FIRST_NONSTRING_TYPE;
168 } 185 }
169 186
170 bool HeapObject::IsName() const { 187 bool HeapObject::IsName() const {
171 return map()->instance_type() <= LAST_NAME_TYPE; 188 return map()->instance_type() <= LAST_NAME_TYPE;
172 } 189 }
173 190
174 bool HeapObject::IsUniqueName() const { 191 bool HeapObject::IsUniqueName() const {
175 return IsInternalizedString() || IsSymbol(); 192 return IsInternalizedString() || IsSymbol();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 return StringShape(String::cast(this)).IsExternal() && 255 return StringShape(String::cast(this)).IsExternal() &&
239 String::cast(this)->IsOneByteRepresentation(); 256 String::cast(this)->IsOneByteRepresentation();
240 } 257 }
241 258
242 bool HeapObject::IsExternalTwoByteString() const { 259 bool HeapObject::IsExternalTwoByteString() const {
243 if (!IsString()) return false; 260 if (!IsString()) return false;
244 return StringShape(String::cast(this)).IsExternal() && 261 return StringShape(String::cast(this)).IsExternal() &&
245 String::cast(this)->IsTwoByteRepresentation(); 262 String::cast(this)->IsTwoByteRepresentation();
246 } 263 }
247 264
248
249 bool Object::HasValidElements() { 265 bool Object::HasValidElements() {
250 // Dictionary is covered under FixedArray. 266 // Dictionary is covered under FixedArray.
251 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); 267 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase();
252 } 268 }
253 269
254 270
255 bool Object::KeyEquals(Object* second) { 271 bool Object::KeyEquals(Object* second) {
256 Object* first = this; 272 Object* first = this;
257 if (second->IsNumber()) { 273 if (second->IsNumber()) {
258 if (first->IsNumber()) return first->Number() == second->Number(); 274 if (first->IsNumber()) return first->Number() == second->Number();
(...skipping 1536 matching lines...) Expand 10 before | Expand all | Expand 10 after
1795 Object** objects, 1811 Object** objects,
1796 uint32_t count, 1812 uint32_t count,
1797 EnsureElementsMode mode) { 1813 EnsureElementsMode mode) {
1798 ElementsKind current_kind = object->GetElementsKind(); 1814 ElementsKind current_kind = object->GetElementsKind();
1799 ElementsKind target_kind = current_kind; 1815 ElementsKind target_kind = current_kind;
1800 { 1816 {
1801 DisallowHeapAllocation no_allocation; 1817 DisallowHeapAllocation no_allocation;
1802 DCHECK(mode != ALLOW_COPIED_DOUBLE_ELEMENTS); 1818 DCHECK(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
1803 bool is_holey = IsFastHoleyElementsKind(current_kind); 1819 bool is_holey = IsFastHoleyElementsKind(current_kind);
1804 if (current_kind == FAST_HOLEY_ELEMENTS) return; 1820 if (current_kind == FAST_HOLEY_ELEMENTS) return;
1805 Heap* heap = object->GetHeap(); 1821 Object* the_hole = object->GetHeap()->the_hole_value();
1806 Object* the_hole = heap->the_hole_value();
1807 for (uint32_t i = 0; i < count; ++i) { 1822 for (uint32_t i = 0; i < count; ++i) {
1808 Object* current = *objects++; 1823 Object* current = *objects++;
1809 if (current == the_hole) { 1824 if (current == the_hole) {
1810 is_holey = true; 1825 is_holey = true;
1811 target_kind = GetHoleyElementsKind(target_kind); 1826 target_kind = GetHoleyElementsKind(target_kind);
1812 } else if (!current->IsSmi()) { 1827 } else if (!current->IsSmi()) {
1813 if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && current->IsNumber()) { 1828 if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && current->IsNumber()) {
1814 if (IsFastSmiElementsKind(target_kind)) { 1829 if (IsFastSmiElementsKind(target_kind)) {
1815 if (is_holey) { 1830 if (is_holey) {
1816 target_kind = FAST_HOLEY_DOUBLE_ELEMENTS; 1831 target_kind = FAST_HOLEY_DOUBLE_ELEMENTS;
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
2002 WRITE_BARRIER(GetHeap(), this, kNextOffset, val); 2017 WRITE_BARRIER(GetHeap(), this, kNextOffset, val);
2003 } 2018 }
2004 } 2019 }
2005 2020
2006 2021
2007 void WeakCell::clear_next(Object* the_hole_value) { 2022 void WeakCell::clear_next(Object* the_hole_value) {
2008 DCHECK_EQ(GetHeap()->the_hole_value(), the_hole_value); 2023 DCHECK_EQ(GetHeap()->the_hole_value(), the_hole_value);
2009 set_next(the_hole_value, SKIP_WRITE_BARRIER); 2024 set_next(the_hole_value, SKIP_WRITE_BARRIER);
2010 } 2025 }
2011 2026
2012 2027 bool WeakCell::next_cleared() { return next()->IsTheHole(GetIsolate()); }
2013 bool WeakCell::next_cleared() { return next()->IsTheHole(); }
2014
2015 2028
2016 int JSObject::GetHeaderSize() { return GetHeaderSize(map()->instance_type()); } 2029 int JSObject::GetHeaderSize() { return GetHeaderSize(map()->instance_type()); }
2017 2030
2018 2031
2019 int JSObject::GetHeaderSize(InstanceType type) { 2032 int JSObject::GetHeaderSize(InstanceType type) {
2020 // Check for the most common kind of JavaScript object before 2033 // Check for the most common kind of JavaScript object before
2021 // falling into the generic switch. This speeds up the internal 2034 // falling into the generic switch. This speeds up the internal
2022 // field operations considerably on average. 2035 // field operations considerably on average.
2023 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; 2036 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize;
2024 switch (type) { 2037 switch (type) {
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
2274 bool Object::ToArrayLength(uint32_t* index) { return Object::ToUint32(index); } 2287 bool Object::ToArrayLength(uint32_t* index) { return Object::ToUint32(index); }
2275 2288
2276 2289
2277 bool Object::ToArrayIndex(uint32_t* index) { 2290 bool Object::ToArrayIndex(uint32_t* index) {
2278 return Object::ToUint32(index) && *index != kMaxUInt32; 2291 return Object::ToUint32(index) && *index != kMaxUInt32;
2279 } 2292 }
2280 2293
2281 2294
2282 void Object::VerifyApiCallResultType() { 2295 void Object::VerifyApiCallResultType() {
2283 #if DEBUG 2296 #if DEBUG
2284 if (!(IsSmi() || IsString() || IsSymbol() || IsJSReceiver() || 2297 if (IsSmi()) return;
2285 IsHeapNumber() || IsSimd128Value() || IsUndefined() || IsTrue() || 2298 DCHECK(IsHeapObject());
2286 IsFalse() || IsNull())) { 2299 Isolate* isolate = HeapObject::cast(this)->GetIsolate();
2300 if (!(IsString() || IsSymbol() || IsJSReceiver() || IsHeapNumber() ||
2301 IsSimd128Value() || IsUndefined(isolate) || IsTrue() || IsFalse() ||
2302 IsNull())) {
2287 FATAL("API call returned invalid object"); 2303 FATAL("API call returned invalid object");
2288 } 2304 }
2289 #endif // DEBUG 2305 #endif // DEBUG
2290 } 2306 }
2291 2307
2292 2308
2293 Object* FixedArray::get(int index) const { 2309 Object* FixedArray::get(int index) const {
2294 SLOW_DCHECK(index >= 0 && index < this->length()); 2310 SLOW_DCHECK(index >= 0 && index < this->length());
2295 return READ_FIELD(this, kHeaderSize + index * kPointerSize); 2311 return READ_FIELD(this, kHeaderSize + index * kPointerSize);
2296 } 2312 }
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
2459 return data_start() + kFirstIndex + index; 2475 return data_start() + kFirstIndex + index;
2460 } 2476 }
2461 2477
2462 2478
2463 void ArrayList::Set(int index, Object* obj) { 2479 void ArrayList::Set(int index, Object* obj) {
2464 FixedArray::cast(this)->set(kFirstIndex + index, obj); 2480 FixedArray::cast(this)->set(kFirstIndex + index, obj);
2465 } 2481 }
2466 2482
2467 2483
2468 void ArrayList::Clear(int index, Object* undefined) { 2484 void ArrayList::Clear(int index, Object* undefined) {
2469 DCHECK(undefined->IsUndefined()); 2485 DCHECK(undefined->IsUndefined(GetIsolate()));
2470 FixedArray::cast(this) 2486 FixedArray::cast(this)
2471 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER); 2487 ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER);
2472 } 2488 }
2473 2489
2474 2490
2475 WriteBarrierMode HeapObject::GetWriteBarrierMode( 2491 WriteBarrierMode HeapObject::GetWriteBarrierMode(
2476 const DisallowHeapAllocation& promise) { 2492 const DisallowHeapAllocation& promise) {
2477 Heap* heap = GetHeap(); 2493 Heap* heap = GetHeap();
2478 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; 2494 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
2479 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; 2495 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
3034 const int kMinCapacity = 4; 3050 const int kMinCapacity = 4;
3035 int capacity = base::bits::RoundUpToPowerOfTwo32(at_least_space_for * 2); 3051 int capacity = base::bits::RoundUpToPowerOfTwo32(at_least_space_for * 2);
3036 return Max(capacity, kMinCapacity); 3052 return Max(capacity, kMinCapacity);
3037 } 3053 }
3038 3054
3039 bool HashTableBase::IsKey(Heap* heap, Object* k) { 3055 bool HashTableBase::IsKey(Heap* heap, Object* k) {
3040 return k != heap->the_hole_value() && k != heap->undefined_value(); 3056 return k != heap->the_hole_value() && k != heap->undefined_value();
3041 } 3057 }
3042 3058
3043 bool HashTableBase::IsKey(Object* k) { 3059 bool HashTableBase::IsKey(Object* k) {
3044 return !k->IsTheHole() && !k->IsUndefined(); 3060 Isolate* isolate = this->GetIsolate();
3061 return !k->IsTheHole(isolate) && !k->IsUndefined(isolate);
3045 } 3062 }
3046 3063
3047 3064
3048 void HashTableBase::SetNumberOfElements(int nof) { 3065 void HashTableBase::SetNumberOfElements(int nof) {
3049 set(kNumberOfElementsIndex, Smi::FromInt(nof)); 3066 set(kNumberOfElementsIndex, Smi::FromInt(nof));
3050 } 3067 }
3051 3068
3052 3069
3053 void HashTableBase::SetNumberOfDeletedElements(int nod) { 3070 void HashTableBase::SetNumberOfDeletedElements(int nod) {
3054 set(kNumberOfDeletedElementsIndex, Smi::FromInt(nod)); 3071 set(kNumberOfDeletedElementsIndex, Smi::FromInt(nod));
(...skipping 1179 matching lines...) Expand 10 before | Expand all | Expand 10 after
4234 ElementType cast_value = Traits::defaultValue(); 4251 ElementType cast_value = Traits::defaultValue();
4235 if (value->IsSmi()) { 4252 if (value->IsSmi()) {
4236 int int_value = Smi::cast(value)->value(); 4253 int int_value = Smi::cast(value)->value();
4237 cast_value = from_int(int_value); 4254 cast_value = from_int(int_value);
4238 } else if (value->IsHeapNumber()) { 4255 } else if (value->IsHeapNumber()) {
4239 double double_value = HeapNumber::cast(value)->value(); 4256 double double_value = HeapNumber::cast(value)->value();
4240 cast_value = from_double(double_value); 4257 cast_value = from_double(double_value);
4241 } else { 4258 } else {
4242 // Clamp undefined to the default value. All other types have been 4259 // Clamp undefined to the default value. All other types have been
4243 // converted to a number type further up in the call chain. 4260 // converted to a number type further up in the call chain.
4244 DCHECK(value->IsUndefined()); 4261 DCHECK(value->IsUndefined(GetIsolate()));
4245 } 4262 }
4246 set(index, cast_value); 4263 set(index, cast_value);
4247 } 4264 }
4248 4265
4249 4266
4250 Handle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) { 4267 Handle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) {
4251 return handle(Smi::FromInt(scalar), isolate); 4268 return handle(Smi::FromInt(scalar), isolate);
4252 } 4269 }
4253 4270
4254 4271
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after
5418 void Map::set_prototype_info(Object* value, WriteBarrierMode mode) { 5435 void Map::set_prototype_info(Object* value, WriteBarrierMode mode) {
5419 DCHECK(is_prototype_map()); 5436 DCHECK(is_prototype_map());
5420 WRITE_FIELD(this, Map::kTransitionsOrPrototypeInfoOffset, value); 5437 WRITE_FIELD(this, Map::kTransitionsOrPrototypeInfoOffset, value);
5421 CONDITIONAL_WRITE_BARRIER( 5438 CONDITIONAL_WRITE_BARRIER(
5422 GetHeap(), this, Map::kTransitionsOrPrototypeInfoOffset, value, mode); 5439 GetHeap(), this, Map::kTransitionsOrPrototypeInfoOffset, value, mode);
5423 } 5440 }
5424 5441
5425 5442
5426 void Map::SetBackPointer(Object* value, WriteBarrierMode mode) { 5443 void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
5427 DCHECK(instance_type() >= FIRST_JS_RECEIVER_TYPE); 5444 DCHECK(instance_type() >= FIRST_JS_RECEIVER_TYPE);
5428 DCHECK((value->IsMap() && GetBackPointer()->IsUndefined())); 5445 DCHECK(value->IsMap());
5446 DCHECK(GetBackPointer()->IsUndefined(GetIsolate()));
5429 DCHECK(!value->IsMap() || 5447 DCHECK(!value->IsMap() ||
5430 Map::cast(value)->GetConstructor() == constructor_or_backpointer()); 5448 Map::cast(value)->GetConstructor() == constructor_or_backpointer());
5431 set_constructor_or_backpointer(value, mode); 5449 set_constructor_or_backpointer(value, mode);
5432 } 5450 }
5433 5451
5434 ACCESSORS(Map, code_cache, FixedArray, kCodeCacheOffset) 5452 ACCESSORS(Map, code_cache, FixedArray, kCodeCacheOffset)
5435 ACCESSORS(Map, dependent_code, DependentCode, kDependentCodeOffset) 5453 ACCESSORS(Map, dependent_code, DependentCode, kDependentCodeOffset)
5436 ACCESSORS(Map, weak_cell_cache, Object, kWeakCellCacheOffset) 5454 ACCESSORS(Map, weak_cell_cache, Object, kWeakCellCacheOffset)
5437 ACCESSORS(Map, constructor_or_backpointer, Object, 5455 ACCESSORS(Map, constructor_or_backpointer, Object,
5438 kConstructorOrBackPointerOffset) 5456 kConstructorOrBackPointerOffset)
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
5957 return function_data()->IsFunctionTemplateInfo(); 5975 return function_data()->IsFunctionTemplateInfo();
5958 } 5976 }
5959 5977
5960 5978
5961 FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() { 5979 FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
5962 DCHECK(IsApiFunction()); 5980 DCHECK(IsApiFunction());
5963 return FunctionTemplateInfo::cast(function_data()); 5981 return FunctionTemplateInfo::cast(function_data());
5964 } 5982 }
5965 5983
5966 void SharedFunctionInfo::set_api_func_data(FunctionTemplateInfo* data) { 5984 void SharedFunctionInfo::set_api_func_data(FunctionTemplateInfo* data) {
5967 DCHECK(function_data()->IsUndefined()); 5985 DCHECK(function_data()->IsUndefined(GetIsolate()));
5968 set_function_data(data); 5986 set_function_data(data);
5969 } 5987 }
5970 5988
5971 bool SharedFunctionInfo::HasBytecodeArray() { 5989 bool SharedFunctionInfo::HasBytecodeArray() {
5972 return function_data()->IsBytecodeArray(); 5990 return function_data()->IsBytecodeArray();
5973 } 5991 }
5974 5992
5975 BytecodeArray* SharedFunctionInfo::bytecode_array() { 5993 BytecodeArray* SharedFunctionInfo::bytecode_array() {
5976 DCHECK(HasBytecodeArray()); 5994 DCHECK(HasBytecodeArray());
5977 return BytecodeArray::cast(function_data()); 5995 return BytecodeArray::cast(function_data());
5978 } 5996 }
5979 5997
5980 void SharedFunctionInfo::set_bytecode_array(BytecodeArray* bytecode) { 5998 void SharedFunctionInfo::set_bytecode_array(BytecodeArray* bytecode) {
5981 DCHECK(function_data()->IsUndefined()); 5999 DCHECK(function_data()->IsUndefined(GetIsolate()));
5982 set_function_data(bytecode); 6000 set_function_data(bytecode);
5983 } 6001 }
5984 6002
5985 void SharedFunctionInfo::ClearBytecodeArray() { 6003 void SharedFunctionInfo::ClearBytecodeArray() {
5986 DCHECK(function_data()->IsUndefined() || HasBytecodeArray()); 6004 DCHECK(function_data()->IsUndefined(GetIsolate()) || HasBytecodeArray());
5987 set_function_data(GetHeap()->undefined_value()); 6005 set_function_data(GetHeap()->undefined_value());
5988 } 6006 }
5989 6007
5990 bool SharedFunctionInfo::HasBuiltinFunctionId() { 6008 bool SharedFunctionInfo::HasBuiltinFunctionId() {
5991 return function_identifier()->IsSmi(); 6009 return function_identifier()->IsSmi();
5992 } 6010 }
5993 6011
5994 BuiltinFunctionId SharedFunctionInfo::builtin_function_id() { 6012 BuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
5995 DCHECK(HasBuiltinFunctionId()); 6013 DCHECK(HasBuiltinFunctionId());
5996 return static_cast<BuiltinFunctionId>( 6014 return static_cast<BuiltinFunctionId>(
5997 Smi::cast(function_identifier())->value()); 6015 Smi::cast(function_identifier())->value());
5998 } 6016 }
5999 6017
6000 void SharedFunctionInfo::set_builtin_function_id(BuiltinFunctionId id) { 6018 void SharedFunctionInfo::set_builtin_function_id(BuiltinFunctionId id) {
6001 set_function_identifier(Smi::FromInt(id)); 6019 set_function_identifier(Smi::FromInt(id));
6002 } 6020 }
6003 6021
6004 bool SharedFunctionInfo::HasInferredName() { 6022 bool SharedFunctionInfo::HasInferredName() {
6005 return function_identifier()->IsString(); 6023 return function_identifier()->IsString();
6006 } 6024 }
6007 6025
6008 String* SharedFunctionInfo::inferred_name() { 6026 String* SharedFunctionInfo::inferred_name() {
6009 if (HasInferredName()) { 6027 if (HasInferredName()) {
6010 return String::cast(function_identifier()); 6028 return String::cast(function_identifier());
6011 } 6029 }
6012 DCHECK(function_identifier()->IsUndefined() || HasBuiltinFunctionId()); 6030 Isolate* isolate = GetIsolate();
6013 return GetIsolate()->heap()->empty_string(); 6031 DCHECK(function_identifier()->IsUndefined(isolate) || HasBuiltinFunctionId());
6032 return isolate->heap()->empty_string();
6014 } 6033 }
6015 6034
6016 void SharedFunctionInfo::set_inferred_name(String* inferred_name) { 6035 void SharedFunctionInfo::set_inferred_name(String* inferred_name) {
6017 DCHECK(function_identifier()->IsUndefined() || HasInferredName()); 6036 DCHECK(function_identifier()->IsUndefined(GetIsolate()) || HasInferredName());
6018 set_function_identifier(inferred_name); 6037 set_function_identifier(inferred_name);
6019 } 6038 }
6020 6039
6021 int SharedFunctionInfo::ic_age() { 6040 int SharedFunctionInfo::ic_age() {
6022 return ICAgeBits::decode(counters()); 6041 return ICAgeBits::decode(counters());
6023 } 6042 }
6024 6043
6025 6044
6026 void SharedFunctionInfo::set_ic_age(int ic_age) { 6045 void SharedFunctionInfo::set_ic_age(int ic_age) {
6027 set_counters(ICAgeBits::update(counters(), ic_age)); 6046 set_counters(ICAgeBits::update(counters(), ic_age));
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
6093 6112
6094 6113
6095 void SharedFunctionInfo::set_disable_optimization_reason(BailoutReason reason) { 6114 void SharedFunctionInfo::set_disable_optimization_reason(BailoutReason reason) {
6096 set_opt_count_and_bailout_reason(DisabledOptimizationReasonBits::update( 6115 set_opt_count_and_bailout_reason(DisabledOptimizationReasonBits::update(
6097 opt_count_and_bailout_reason(), reason)); 6116 opt_count_and_bailout_reason(), reason));
6098 } 6117 }
6099 6118
6100 6119
6101 bool SharedFunctionInfo::IsBuiltin() { 6120 bool SharedFunctionInfo::IsBuiltin() {
6102 Object* script_obj = script(); 6121 Object* script_obj = script();
6103 if (script_obj->IsUndefined()) return true; 6122 if (script_obj->IsUndefined(GetIsolate())) return true;
6104 Script* script = Script::cast(script_obj); 6123 Script* script = Script::cast(script_obj);
6105 Script::Type type = static_cast<Script::Type>(script->type()); 6124 Script::Type type = static_cast<Script::Type>(script->type());
6106 return type != Script::TYPE_NORMAL; 6125 return type != Script::TYPE_NORMAL;
6107 } 6126 }
6108 6127
6109 6128
6110 bool SharedFunctionInfo::IsSubjectToDebugging() { return !IsBuiltin(); } 6129 bool SharedFunctionInfo::IsSubjectToDebugging() { return !IsBuiltin(); }
6111 6130
6112 6131
6113 bool SharedFunctionInfo::OptimizedCodeMapIsCleared() const { 6132 bool SharedFunctionInfo::OptimizedCodeMapIsCleared() const {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
6226 6245
6227 JSObject* JSFunction::global_proxy() { 6246 JSObject* JSFunction::global_proxy() {
6228 return context()->global_proxy(); 6247 return context()->global_proxy();
6229 } 6248 }
6230 6249
6231 6250
6232 Context* JSFunction::native_context() { return context()->native_context(); } 6251 Context* JSFunction::native_context() { return context()->native_context(); }
6233 6252
6234 6253
6235 void JSFunction::set_context(Object* value) { 6254 void JSFunction::set_context(Object* value) {
6236 DCHECK(value->IsUndefined() || value->IsContext()); 6255 DCHECK(value->IsUndefined(GetIsolate()) || value->IsContext());
6237 WRITE_FIELD(this, kContextOffset, value); 6256 WRITE_FIELD(this, kContextOffset, value);
6238 WRITE_BARRIER(GetHeap(), this, kContextOffset, value); 6257 WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
6239 } 6258 }
6240 6259
6241 ACCESSORS(JSFunction, prototype_or_initial_map, Object, 6260 ACCESSORS(JSFunction, prototype_or_initial_map, Object,
6242 kPrototypeOrInitialMapOffset) 6261 kPrototypeOrInitialMapOffset)
6243 6262
6244 6263
6245 Map* JSFunction::initial_map() { 6264 Map* JSFunction::initial_map() {
6246 return Map::cast(prototype_or_initial_map()); 6265 return Map::cast(prototype_or_initial_map());
6247 } 6266 }
6248 6267
6249 6268
6250 bool JSFunction::has_initial_map() { 6269 bool JSFunction::has_initial_map() {
6251 return prototype_or_initial_map()->IsMap(); 6270 return prototype_or_initial_map()->IsMap();
6252 } 6271 }
6253 6272
6254 6273
6255 bool JSFunction::has_instance_prototype() { 6274 bool JSFunction::has_instance_prototype() {
6256 return has_initial_map() || !prototype_or_initial_map()->IsTheHole(); 6275 return has_initial_map() ||
6276 !prototype_or_initial_map()->IsTheHole(GetIsolate());
6257 } 6277 }
6258 6278
6259 6279
6260 bool JSFunction::has_prototype() { 6280 bool JSFunction::has_prototype() {
6261 return map()->has_non_instance_prototype() || has_instance_prototype(); 6281 return map()->has_non_instance_prototype() || has_instance_prototype();
6262 } 6282 }
6263 6283
6264 6284
6265 Object* JSFunction::instance_prototype() { 6285 Object* JSFunction::instance_prototype() {
6266 DCHECK(has_instance_prototype()); 6286 DCHECK(has_instance_prototype());
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
6642 #endif 6662 #endif
6643 6663
6644 6664
6645 ACCESSORS(JSRegExp, data, Object, kDataOffset) 6665 ACCESSORS(JSRegExp, data, Object, kDataOffset)
6646 ACCESSORS(JSRegExp, flags, Object, kFlagsOffset) 6666 ACCESSORS(JSRegExp, flags, Object, kFlagsOffset)
6647 ACCESSORS(JSRegExp, source, Object, kSourceOffset) 6667 ACCESSORS(JSRegExp, source, Object, kSourceOffset)
6648 6668
6649 6669
6650 JSRegExp::Type JSRegExp::TypeTag() { 6670 JSRegExp::Type JSRegExp::TypeTag() {
6651 Object* data = this->data(); 6671 Object* data = this->data();
6652 if (data->IsUndefined()) return JSRegExp::NOT_COMPILED; 6672 if (data->IsUndefined(GetIsolate())) return JSRegExp::NOT_COMPILED;
6653 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex)); 6673 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
6654 return static_cast<JSRegExp::Type>(smi->value()); 6674 return static_cast<JSRegExp::Type>(smi->value());
6655 } 6675 }
6656 6676
6657 6677
6658 int JSRegExp::CaptureCount() { 6678 int JSRegExp::CaptureCount() {
6659 switch (TypeTag()) { 6679 switch (TypeTag()) {
6660 case ATOM: 6680 case ATOM:
6661 return 0; 6681 return 0;
6662 case IRREGEXP: 6682 case IRREGEXP:
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
7331 return (getter() == getter_value) && (setter() == setter_value); 7351 return (getter() == getter_value) && (setter() == setter_value);
7332 } 7352 }
7333 7353
7334 7354
7335 bool AccessorPair::ContainsAccessor() { 7355 bool AccessorPair::ContainsAccessor() {
7336 return IsJSAccessor(getter()) || IsJSAccessor(setter()); 7356 return IsJSAccessor(getter()) || IsJSAccessor(setter());
7337 } 7357 }
7338 7358
7339 7359
7340 bool AccessorPair::IsJSAccessor(Object* obj) { 7360 bool AccessorPair::IsJSAccessor(Object* obj) {
7341 return obj->IsCallable() || obj->IsUndefined(); 7361 return obj->IsCallable() || obj->IsUndefined(GetIsolate());
7342 } 7362 }
7343 7363
7344 7364
7345 template<typename Derived, typename Shape, typename Key> 7365 template<typename Derived, typename Shape, typename Key>
7346 void Dictionary<Derived, Shape, Key>::SetEntry(int entry, 7366 void Dictionary<Derived, Shape, Key>::SetEntry(int entry,
7347 Handle<Object> key, 7367 Handle<Object> key,
7348 Handle<Object> value) { 7368 Handle<Object> value) {
7349 this->SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0))); 7369 this->SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
7350 } 7370 }
7351 7371
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
7476 Object* raw_value = dict->ValueAt(entry); 7496 Object* raw_value = dict->ValueAt(entry);
7477 DCHECK(raw_value->IsPropertyCell()); 7497 DCHECK(raw_value->IsPropertyCell());
7478 PropertyCell* cell = PropertyCell::cast(raw_value); 7498 PropertyCell* cell = PropertyCell::cast(raw_value);
7479 cell->set_property_details(value); 7499 cell->set_property_details(value);
7480 } 7500 }
7481 7501
7482 7502
7483 template <typename Dictionary> 7503 template <typename Dictionary>
7484 bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) { 7504 bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) {
7485 DCHECK(dict->ValueAt(entry)->IsPropertyCell()); 7505 DCHECK(dict->ValueAt(entry)->IsPropertyCell());
7486 return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole(); 7506 Isolate* isolate = dict->GetIsolate();
7507 return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole(isolate);
7487 } 7508 }
7488 7509
7489 7510
7490 bool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) { 7511 bool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) {
7491 return key->SameValue(other); 7512 return key->SameValue(other);
7492 } 7513 }
7493 7514
7494 7515
7495 uint32_t ObjectHashTableShape::Hash(Handle<Object> key) { 7516 uint32_t ObjectHashTableShape::Hash(Handle<Object> key) {
7496 return Smi::cast(key->GetHash())->value(); 7517 return Smi::cast(key->GetHash())->value();
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
7750 DCHECK_EQ(isolate_->relocatable_top(), this); 7771 DCHECK_EQ(isolate_->relocatable_top(), this);
7751 isolate_->set_relocatable_top(prev_); 7772 isolate_->set_relocatable_top(prev_);
7752 } 7773 }
7753 7774
7754 7775
7755 template<class Derived, class TableType> 7776 template<class Derived, class TableType>
7756 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() { 7777 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() {
7757 TableType* table(TableType::cast(this->table())); 7778 TableType* table(TableType::cast(this->table()));
7758 int index = Smi::cast(this->index())->value(); 7779 int index = Smi::cast(this->index())->value();
7759 Object* key = table->KeyAt(index); 7780 Object* key = table->KeyAt(index);
7760 DCHECK(!key->IsTheHole()); 7781 DCHECK(!key->IsTheHole(table->GetIsolate()));
7761 return key; 7782 return key;
7762 } 7783 }
7763 7784
7764 7785
7765 void JSSetIterator::PopulateValueArray(FixedArray* array) { 7786 void JSSetIterator::PopulateValueArray(FixedArray* array) {
7766 array->set(0, CurrentKey()); 7787 array->set(0, CurrentKey());
7767 } 7788 }
7768 7789
7769 7790
7770 void JSMapIterator::PopulateValueArray(FixedArray* array) { 7791 void JSMapIterator::PopulateValueArray(FixedArray* array) {
7771 array->set(0, CurrentKey()); 7792 array->set(0, CurrentKey());
7772 array->set(1, CurrentValue()); 7793 array->set(1, CurrentValue());
7773 } 7794 }
7774 7795
7775 7796
7776 Object* JSMapIterator::CurrentValue() { 7797 Object* JSMapIterator::CurrentValue() {
7777 OrderedHashMap* table(OrderedHashMap::cast(this->table())); 7798 OrderedHashMap* table(OrderedHashMap::cast(this->table()));
7778 int index = Smi::cast(this->index())->value(); 7799 int index = Smi::cast(this->index())->value();
7779 Object* value = table->ValueAt(index); 7800 Object* value = table->ValueAt(index);
7780 DCHECK(!value->IsTheHole()); 7801 DCHECK(!value->IsTheHole(table->GetIsolate()));
7781 return value; 7802 return value;
7782 } 7803 }
7783 7804
7784 7805
7785 String::SubStringRange::SubStringRange(String* string, int first, int length) 7806 String::SubStringRange::SubStringRange(String* string, int first, int length)
7786 : string_(string), 7807 : string_(string),
7787 first_(first), 7808 first_(first),
7788 length_(length == -1 ? string->length() : length) {} 7809 length_(length == -1 ? string->length() : length) {}
7789 7810
7790 7811
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
7906 #undef WRITE_INT64_FIELD 7927 #undef WRITE_INT64_FIELD
7907 #undef READ_BYTE_FIELD 7928 #undef READ_BYTE_FIELD
7908 #undef WRITE_BYTE_FIELD 7929 #undef WRITE_BYTE_FIELD
7909 #undef NOBARRIER_READ_BYTE_FIELD 7930 #undef NOBARRIER_READ_BYTE_FIELD
7910 #undef NOBARRIER_WRITE_BYTE_FIELD 7931 #undef NOBARRIER_WRITE_BYTE_FIELD
7911 7932
7912 } // namespace internal 7933 } // namespace internal
7913 } // namespace v8 7934 } // namespace v8
7914 7935
7915 #endif // V8_OBJECTS_INL_H_ 7936 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698