#ifndef Object_hpp
#define Object_hpp
#include "Engine.hpp"
namespace Emojicode {
#ifndef heapSize
#define heapSize (512 * 1024 * 1024)
#endif
inline size_t alignSize(size_t size) {
return size + alignof(Object) - (size % alignof(Object));
}
void allocateHeap();
inline void performPauseForGC();
template <typename T>
inline void markByObjectVariableRecord(ObjectVariableRecord &record, Value *va, T &index) {
switch (record.type) {
case ObjectVariableType::Simple:
if (va[record.variableIndex].object) {
mark(&va[record.variableIndex].object);
}
break;
case ObjectVariableType::Condition:
if (va[record.condition].raw)
mark(&va[record.variableIndex].object);
break;
case ObjectVariableType::Box:
if (va[record.variableIndex].raw == T_OBJECT || (va[record.variableIndex].raw & REMOTE_MASK) != 0)
mark(&va[record.variableIndex + 1].object);
break;
case ObjectVariableType::ConditionalSkip:
if (!va[record.condition].raw)
index += record.variableIndex;
break;
}
}
void markValueReference(Value **valuePointer);
void markBox(Box *box);
void registerForDeinitialization(Object *object);
}
#endif