Commit 17db4a30 authored by Georg Neis's avatar Georg Neis Committed by Commit Bot

[turbofan] Rearrange heap broker classes.

Bug: v8:7790
Change-Id: I0508596370470068ee07bfd7e441a4e393266c11
Reviewed-on: https://chromium-review.googlesource.com/1099238Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
Commit-Queue: Georg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53735}
parent 87fe4013
...@@ -42,9 +42,7 @@ HeapReferenceType JSHeapBroker::HeapReferenceTypeFromMap(Map* map) const { ...@@ -42,9 +42,7 @@ HeapReferenceType JSHeapBroker::HeapReferenceTypeFromMap(Map* map) const {
HeapReference JSHeapBroker::HeapReferenceForObject( HeapReference JSHeapBroker::HeapReferenceForObject(
Handle<Object> object) const { Handle<Object> object) const {
AllowHandleDereference allow_handle_dereference; AllowHandleDereference allow_handle_dereference;
Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object); return HeapReference(Handle<HeapObject>::cast(object));
HeapReferenceType type = HeapReferenceTypeFromMap(heap_object->map());
return HeapReference(heap_object, type);
} }
// static // static
...@@ -62,24 +60,33 @@ base::Optional<int> JSHeapBroker::TryGetSmi(Handle<Object> object) { ...@@ -62,24 +60,33 @@ base::Optional<int> JSHeapBroker::TryGetSmi(Handle<Object> object) {
HEAP_BROKER_KIND_LIST(HEAP_KIND_FUNCTIONS_DEF) HEAP_BROKER_KIND_LIST(HEAP_KIND_FUNCTIONS_DEF)
#undef HEAP_KIND_FUNCTIONS_DEF #undef HEAP_KIND_FUNCTIONS_DEF
NumberHeapData HeapReference::AsNumber() const { #define HEAP_DATA_FUNCTIONS_DEF(Name) \
Name##HeapReference HeapReference::As##Name() const { \
AllowHandleDereference allow_handle_dereference; \
SLOW_DCHECK(object_->Is##Name()); \
return Name##HeapReference(object_); \
}
HEAP_BROKER_DATA_LIST(HEAP_DATA_FUNCTIONS_DEF)
#undef HEAP_DATA_FUNCTIONS_DEF
HeapReferenceType HeapReference::type(const JSHeapBroker* broker) const {
AllowHandleDereference allow_handle_dereference; AllowHandleDereference allow_handle_dereference;
return NumberHeapData(object_->Number()); return broker->HeapReferenceTypeFromMap(object_->map());
} }
JSFunctionHeapData HeapReference::AsJSFunction() const { double NumberHeapReference::value() const {
AllowHandleDereference allow_handle_dereference; AllowHandleDereference allow_handle_dereference;
return JSFunctionHeapData(Handle<JSFunction>::cast(object_)); return object()->Number();
} }
bool JSFunctionHeapData::HasBuiltinFunctionId() const { bool JSFunctionHeapReference::HasBuiltinFunctionId() const {
AllowHandleDereference allow_handle_dereference; AllowHandleDereference allow_handle_dereference;
return function_->shared()->HasBuiltinFunctionId(); return JSFunction::cast(*object())->shared()->HasBuiltinFunctionId();
} }
BuiltinFunctionId JSFunctionHeapData::GetBuiltinFunctionId() const { BuiltinFunctionId JSFunctionHeapReference::GetBuiltinFunctionId() const {
AllowHandleDereference allow_handle_dereference; AllowHandleDereference allow_handle_dereference;
return function_->shared()->builtin_function_id(); return JSFunction::cast(*object())->shared()->builtin_function_id();
} }
} // namespace compiler } // namespace compiler
......
...@@ -14,32 +14,6 @@ namespace v8 { ...@@ -14,32 +14,6 @@ namespace v8 {
namespace internal { namespace internal {
namespace compiler { namespace compiler {
class JSFunctionHeapData {
public:
bool HasBuiltinFunctionId() const;
BuiltinFunctionId GetBuiltinFunctionId() const;
private:
friend class HeapReference;
explicit JSFunctionHeapData(Handle<JSFunction> function)
: function_(function) {}
Handle<JSFunction> const function_;
};
class NumberHeapData {
public:
double value() const { return value_; }
private:
friend class HeapReference;
explicit NumberHeapData(double value) : value_(value) {}
double const value_;
};
class HeapReferenceType { class HeapReferenceType {
public: public:
enum OddballType : uint8_t { kUnknown, kBoolean, kUndefined, kNull, kHole }; enum OddballType : uint8_t { kUnknown, kBoolean, kUndefined, kNull, kHole };
...@@ -72,30 +46,33 @@ class HeapReferenceType { ...@@ -72,30 +46,33 @@ class HeapReferenceType {
#define HEAP_BROKER_KIND_LIST(V) \ #define HEAP_BROKER_KIND_LIST(V) \
HEAP_BROKER_DATA_LIST(V) \ HEAP_BROKER_DATA_LIST(V) \
V(String) \ V(InternalizedString) \
V(InternalizedString) V(String)
#define FORWARD_DECL(Name) class Name##HeapReference;
HEAP_BROKER_DATA_LIST(FORWARD_DECL)
#undef FORWARD_DECL
class JSHeapBroker;
class HeapReference { class HeapReference {
public: public:
explicit HeapReference(Handle<HeapObject> object) : object_(object) {}
#define HEAP_IS_METHOD_DECL(Name) bool Is##Name() const; #define HEAP_IS_METHOD_DECL(Name) bool Is##Name() const;
HEAP_BROKER_KIND_LIST(HEAP_IS_METHOD_DECL) HEAP_BROKER_KIND_LIST(HEAP_IS_METHOD_DECL)
#undef HEAP_IS_METHOD_DECL #undef HEAP_IS_METHOD_DECL
#define HEAP_AS_METHOD_DECL(Name) Name##HeapData As##Name() const; #define HEAP_AS_METHOD_DECL(Name) Name##HeapReference As##Name() const;
HEAP_BROKER_DATA_LIST(HEAP_AS_METHOD_DECL) HEAP_BROKER_DATA_LIST(HEAP_AS_METHOD_DECL)
#undef HEAP_AS_METHOD_DECL #undef HEAP_AS_METHOD_DECL
const HeapReferenceType& type() const { return type_; } HeapReferenceType type(const JSHeapBroker* broker) const;
Handle<HeapObject> value() const { return object_; } Handle<HeapObject> object() const { return object_; }
private: private:
friend class JSHeapBroker; friend class JSHeapBroker;
HeapReference(Handle<HeapObject> object, const HeapReferenceType& type)
: object_(object), type_(type) {}
Handle<HeapObject> const object_; Handle<HeapObject> const object_;
HeapReferenceType const type_;
}; };
class V8_EXPORT_PRIVATE JSHeapBroker : public NON_EXPORTED_BASE(ZoneObject) { class V8_EXPORT_PRIVATE JSHeapBroker : public NON_EXPORTED_BASE(ZoneObject) {
...@@ -111,9 +88,26 @@ class V8_EXPORT_PRIVATE JSHeapBroker : public NON_EXPORTED_BASE(ZoneObject) { ...@@ -111,9 +88,26 @@ class V8_EXPORT_PRIVATE JSHeapBroker : public NON_EXPORTED_BASE(ZoneObject) {
static base::Optional<int> TryGetSmi(Handle<Object> object); static base::Optional<int> TryGetSmi(Handle<Object> object);
private: private:
friend class HeapReference;
HeapReferenceType HeapReferenceTypeFromMap(Map* map) const; HeapReferenceType HeapReferenceTypeFromMap(Map* map) const;
Isolate* const isolate_; Isolate* const isolate_;
Isolate* isolate() const { return isolate_; }
};
class JSFunctionHeapReference : public HeapReference {
public:
explicit JSFunctionHeapReference(Handle<HeapObject> object)
: HeapReference(object) {}
bool HasBuiltinFunctionId() const;
BuiltinFunctionId GetBuiltinFunctionId() const;
};
class NumberHeapReference : public HeapReference {
public:
explicit NumberHeapReference(Handle<HeapObject> object)
: HeapReference(object) {}
double value() const;
}; };
} // namespace compiler } // namespace compiler
......
...@@ -1405,7 +1405,7 @@ Type Typer::Visitor::JSCallTyper(Type fun, Typer* t) { ...@@ -1405,7 +1405,7 @@ Type Typer::Visitor::JSCallTyper(Type fun, Typer* t) {
if (!fun.IsHeapConstant() || !fun.AsHeapConstant()->Ref().IsJSFunction()) { if (!fun.IsHeapConstant() || !fun.AsHeapConstant()->Ref().IsJSFunction()) {
return Type::NonInternal(); return Type::NonInternal();
} }
JSFunctionHeapData function = fun.AsHeapConstant()->Ref().AsJSFunction(); JSFunctionHeapReference function = fun.AsHeapConstant()->Ref().AsJSFunction();
if (!function.HasBuiltinFunctionId()) { if (!function.HasBuiltinFunctionId()) {
return Type::NonInternal(); return Type::NonInternal();
} }
......
...@@ -1045,7 +1045,7 @@ Type Type::OtherNumberConstant(double value, Zone* zone) { ...@@ -1045,7 +1045,7 @@ Type Type::OtherNumberConstant(double value, Zone* zone) {
Type Type::HeapConstant(const JSHeapBroker* js_heap_broker, Type Type::HeapConstant(const JSHeapBroker* js_heap_broker,
Handle<i::Object> value, Zone* zone) { Handle<i::Object> value, Zone* zone) {
return FromTypeBase(HeapConstantType::New( return FromTypeBase(HeapConstantType::New(
js_heap_broker->HeapReferenceForObject(value), zone)); js_heap_broker, js_heap_broker->HeapReferenceForObject(value), zone));
} }
// static // static
......
...@@ -534,17 +534,18 @@ class OtherNumberConstantType : public TypeBase { ...@@ -534,17 +534,18 @@ class OtherNumberConstantType : public TypeBase {
class V8_EXPORT_PRIVATE HeapConstantType : public NON_EXPORTED_BASE(TypeBase) { class V8_EXPORT_PRIVATE HeapConstantType : public NON_EXPORTED_BASE(TypeBase) {
public: public:
Handle<HeapObject> Value() const { return heap_ref_.value(); } Handle<HeapObject> Value() const { return heap_ref_.object(); }
const HeapReference& Ref() const { return heap_ref_; } const HeapReference& Ref() const { return heap_ref_; }
private: private:
friend class Type; friend class Type;
friend class BitsetType; friend class BitsetType;
static HeapConstantType* New(const HeapReference& heap_ref, Zone* zone) { static HeapConstantType* New(const JSHeapBroker* broker,
const HeapReference& heap_ref, Zone* zone) {
DCHECK(!heap_ref.IsNumber()); DCHECK(!heap_ref.IsNumber());
DCHECK_IMPLIES(heap_ref.IsString(), heap_ref.IsInternalizedString()); DCHECK_IMPLIES(heap_ref.IsString(), heap_ref.IsInternalizedString());
BitsetType::bitset bitset = BitsetType::Lub(heap_ref.type()); BitsetType::bitset bitset = BitsetType::Lub(heap_ref.type(broker));
return new (zone->New(sizeof(HeapConstantType))) return new (zone->New(sizeof(HeapConstantType)))
HeapConstantType(bitset, heap_ref); HeapConstantType(bitset, heap_ref);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment