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

Unified 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: reducing old cmpare patterns Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index 364376c722776fcc01303b035e798130db116054..c5c7f6538db5311f359606ead503ec74d6113bf7 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -162,6 +162,22 @@ HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF)
ODDBALL_LIST(IS_TYPE_FUNCTION_DEF)
#undef IS_TYPE_FUNCTION_DEF
+bool HeapObject::IsTheHole(Isolate* isolate) const {
+ return this == isolate->heap()->the_hole_value();
+}
+
+bool HeapObject::IsUndefined(Isolate* isolate) const {
+ return this == isolate->heap()->undefined_value();
+}
+
+bool Object::IsTheHole(Isolate* isolate) const {
+ return this == isolate->heap()->the_hole_value();
+}
+
+bool Object::IsUndefined(Isolate* isolate) const {
+ return this == isolate->heap()->undefined_value();
+}
+
bool HeapObject::IsString() const {
return map()->instance_type() < FIRST_NONSTRING_TYPE;
}
@@ -244,7 +260,6 @@ bool HeapObject::IsExternalTwoByteString() const {
String::cast(this)->IsTwoByteRepresentation();
}
-
bool Object::HasValidElements() {
// Dictionary is covered under FixedArray.
return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase();
@@ -1523,11 +1538,11 @@ Object** FixedArray::GetFirstElementAddress() {
bool FixedArray::ContainsOnlySmisOrHoles() {
- Object* the_hole = GetHeap()->the_hole_value();
+ Isolate* isolate = GetIsolate();
Object** current = GetFirstElementAddress();
for (int i = 0; i < length(); ++i) {
Object* candidate = *current++;
- if (!candidate->IsSmi() && candidate != the_hole) return false;
+ if (!candidate->IsSmi() && !candidate->IsTheHole(isolate)) return false;
}
return true;
}
@@ -1801,11 +1816,10 @@ void JSObject::EnsureCanContainElements(Handle<JSObject> object,
DCHECK(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
bool is_holey = IsFastHoleyElementsKind(current_kind);
if (current_kind == FAST_HOLEY_ELEMENTS) return;
- Heap* heap = object->GetHeap();
- Object* the_hole = heap->the_hole_value();
+ Isolate* isolate = object->GetIsolate();
for (uint32_t i = 0; i < count; ++i) {
Object* current = *objects++;
- if (current == the_hole) {
+ if (current->IsTheHole(isolate)) {
is_holey = true;
target_kind = GetHoleyElementsKind(target_kind);
} else if (!current->IsSmi()) {
@@ -2008,9 +2022,7 @@ void WeakCell::clear_next(Object* the_hole_value) {
set_next(the_hole_value, SKIP_WRITE_BARRIER);
}
-
-bool WeakCell::next_cleared() { return next()->IsTheHole(); }
-
+bool WeakCell::next_cleared() { return next()->IsTheHole(GetIsolate()); }
int JSObject::GetHeaderSize() { return GetHeaderSize(map()->instance_type()); }
@@ -2280,9 +2292,12 @@ bool Object::ToArrayIndex(uint32_t* index) {
void Object::VerifyApiCallResultType() {
#if DEBUG
- if (!(IsSmi() || IsString() || IsSymbol() || IsJSReceiver() ||
- IsHeapNumber() || IsSimd128Value() || IsUndefined() || IsTrue() ||
- IsFalse() || IsNull())) {
+ if (IsSmi()) return;
+ DCHECK(IsHeapObject());
+ Isolate* isolate = HeapObject::cast(this)->GetIsolate();
+ if (!(IsString() || IsSymbol() || IsJSReceiver() || IsHeapNumber() ||
+ IsSimd128Value() || IsUndefined(isolate) || IsTrue() || IsFalse() ||
+ IsNull())) {
FATAL("API call returned invalid object");
}
#endif // DEBUG
@@ -2465,7 +2480,7 @@ void ArrayList::Set(int index, Object* obj) {
void ArrayList::Clear(int index, Object* undefined) {
- DCHECK(undefined->IsUndefined());
+ DCHECK(undefined->IsUndefined(GetIsolate()));
FixedArray::cast(this)
->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER);
}
@@ -3021,7 +3036,8 @@ bool HashTableBase::IsKey(Heap* heap, Object* k) {
}
bool HashTableBase::IsKey(Object* k) {
- return !k->IsTheHole() && !k->IsUndefined();
+ Isolate* isolate = this->GetIsolate();
+ return !k->IsTheHole(isolate) && !k->IsUndefined(isolate);
}
@@ -3055,14 +3071,14 @@ int HashTable<Derived, Shape, Key>::FindEntry(Isolate* isolate, Key key,
uint32_t entry = FirstProbe(hash, capacity);
uint32_t count = 1;
// EnsureCapacity will guarantee the hash table is never full.
- Object* undefined = isolate->heap()->undefined_value();
- Object* the_hole = isolate->heap()->the_hole_value();
while (true) {
Object* element = KeyAt(entry);
// Empty entry. Uses raw unchecked accessors because it is called by the
// string table during bootstrapping.
- if (element == undefined) break;
- if (element != the_hole && Shape::IsMatch(key, element)) return entry;
+ if (element->IsUndefined(isolate)) break;
ulan 2016/06/01 19:01:44 Isn't this performance critical? Before it was on
+ if (!element->IsTheHole(isolate) && Shape::IsMatch(key, element)) {
+ return entry;
+ }
entry = NextProbe(entry, count++, capacity);
}
return kNotFound;
@@ -4221,7 +4237,7 @@ void FixedTypedArray<Traits>::SetValue(uint32_t index, Object* value) {
} else {
// Clamp undefined to the default value. All other types have been
// converted to a number type further up in the call chain.
- DCHECK(value->IsUndefined());
+ DCHECK(value->IsUndefined(GetIsolate()));
}
set(index, cast_value);
}
@@ -5405,7 +5421,8 @@ void Map::set_prototype_info(Object* value, WriteBarrierMode mode) {
void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
DCHECK(instance_type() >= FIRST_JS_RECEIVER_TYPE);
- DCHECK((value->IsMap() && GetBackPointer()->IsUndefined()));
+ DCHECK(value->IsMap());
+ DCHECK(GetBackPointer()->IsUndefined(GetIsolate()));
DCHECK(!value->IsMap() ||
Map::cast(value)->GetConstructor() == constructor_or_backpointer());
set_constructor_or_backpointer(value, mode);
@@ -5945,7 +5962,7 @@ FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
}
void SharedFunctionInfo::set_api_func_data(FunctionTemplateInfo* data) {
- DCHECK(function_data()->IsUndefined());
+ DCHECK(function_data()->IsUndefined(GetIsolate()));
set_function_data(data);
}
@@ -5959,12 +5976,12 @@ BytecodeArray* SharedFunctionInfo::bytecode_array() {
}
void SharedFunctionInfo::set_bytecode_array(BytecodeArray* bytecode) {
- DCHECK(function_data()->IsUndefined());
+ DCHECK(function_data()->IsUndefined(GetIsolate()));
set_function_data(bytecode);
}
void SharedFunctionInfo::ClearBytecodeArray() {
- DCHECK(function_data()->IsUndefined() || HasBytecodeArray());
+ DCHECK(function_data()->IsUndefined(GetIsolate()) || HasBytecodeArray());
set_function_data(GetHeap()->undefined_value());
}
@@ -5990,12 +6007,13 @@ String* SharedFunctionInfo::inferred_name() {
if (HasInferredName()) {
return String::cast(function_identifier());
}
- DCHECK(function_identifier()->IsUndefined() || HasBuiltinFunctionId());
- return GetIsolate()->heap()->empty_string();
+ Isolate* isolate = GetIsolate();
+ DCHECK(function_identifier()->IsUndefined(isolate) || HasBuiltinFunctionId());
+ return isolate->heap()->empty_string();
}
void SharedFunctionInfo::set_inferred_name(String* inferred_name) {
- DCHECK(function_identifier()->IsUndefined() || HasInferredName());
+ DCHECK(function_identifier()->IsUndefined(GetIsolate()) || HasInferredName());
set_function_identifier(inferred_name);
}
@@ -6081,7 +6099,7 @@ void SharedFunctionInfo::set_disable_optimization_reason(BailoutReason reason) {
bool SharedFunctionInfo::IsBuiltin() {
Object* script_obj = script();
- if (script_obj->IsUndefined()) return true;
+ if (script_obj->IsUndefined(GetIsolate())) return true;
Script* script = Script::cast(script_obj);
Script::Type type = static_cast<Script::Type>(script->type());
return type != Script::TYPE_NORMAL;
@@ -6214,7 +6232,7 @@ Context* JSFunction::native_context() { return context()->native_context(); }
void JSFunction::set_context(Object* value) {
- DCHECK(value->IsUndefined() || value->IsContext());
+ DCHECK(value->IsUndefined(GetIsolate()) || value->IsContext());
WRITE_FIELD(this, kContextOffset, value);
WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
}
@@ -6234,7 +6252,8 @@ bool JSFunction::has_initial_map() {
bool JSFunction::has_instance_prototype() {
- return has_initial_map() || !prototype_or_initial_map()->IsTheHole();
+ return has_initial_map() ||
+ !prototype_or_initial_map()->IsTheHole(GetIsolate());
}
@@ -6630,7 +6649,7 @@ ACCESSORS(JSRegExp, source, Object, kSourceOffset)
JSRegExp::Type JSRegExp::TypeTag() {
Object* data = this->data();
- if (data->IsUndefined()) return JSRegExp::NOT_COMPILED;
+ if (data->IsUndefined(GetIsolate())) return JSRegExp::NOT_COMPILED;
Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
return static_cast<JSRegExp::Type>(smi->value());
}
@@ -7319,7 +7338,7 @@ bool AccessorPair::ContainsAccessor() {
bool AccessorPair::IsJSAccessor(Object* obj) {
- return obj->IsCallable() || obj->IsUndefined();
+ return obj->IsCallable() || obj->IsUndefined(GetIsolate());
}
@@ -7464,7 +7483,8 @@ void GlobalDictionaryShape::DetailsAtPut(Dictionary* dict, int entry,
template <typename Dictionary>
bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) {
DCHECK(dict->ValueAt(entry)->IsPropertyCell());
- return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole();
+ Isolate* isolate = dict->GetIsolate();
+ return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole(isolate);
}
@@ -7738,7 +7758,7 @@ Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() {
TableType* table(TableType::cast(this->table()));
int index = Smi::cast(this->index())->value();
Object* key = table->KeyAt(index);
- DCHECK(!key->IsTheHole());
+ DCHECK(!key->IsTheHole(table->GetIsolate()));
return key;
}
@@ -7758,7 +7778,7 @@ Object* JSMapIterator::CurrentValue() {
OrderedHashMap* table(OrderedHashMap::cast(this->table()));
int index = Smi::cast(this->index())->value();
Object* value = table->ValueAt(index);
- DCHECK(!value->IsTheHole());
+ DCHECK(!value->IsTheHole(table->GetIsolate()));
return value;
}
« src/objects.h ('K') | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698