#ifndef V8_OBJECTS_ALLOCATION_SITE_SCOPES_H_
#define V8_OBJECTS_ALLOCATION_SITE_SCOPES_H_
#include "src/handles/handles.h"
#include "src/objects/allocation-site.h"
#include "src/objects/map.h"
#include "src/objects/objects.h"
namespace v8 {
namespace internal {
class AllocationSiteContext {
public:
explicit AllocationSiteContext(Isolate* isolate) { isolate_ = isolate; }
DirectHandle<AllocationSite> top() { return top_; }
DirectHandle<AllocationSite> current() { return current_; }
bool ShouldCreateMemento(DirectHandle<JSObject> object) { return false; }
Isolate* isolate() { return isolate_; }
protected:
void update_current_site(Tagged<AllocationSite> site) {
current_.PatchValue(site);
}
inline void InitializeTraversal(Handle<AllocationSite> site);
private:
Isolate* isolate_;
Handle<AllocationSite> top_;
Handle<AllocationSite> current_;
};
class AllocationSiteUsageContext : public AllocationSiteContext {
public:
AllocationSiteUsageContext(Isolate* isolate, Handle<AllocationSite> site,
bool activated)
: AllocationSiteContext(isolate),
top_site_(site),
activated_(activated) {}
inline Handle<AllocationSite> EnterNewScope();
inline void ExitScope(DirectHandle<AllocationSite> scope_site,
DirectHandle<JSObject> object);
inline bool ShouldCreateMemento(DirectHandle<JSObject> object);
static const bool kCopying = true;
private:
Handle<AllocationSite> top_site_;
bool activated_;
};
}
}
#endif