blob: 59701989e780c3c5f9080852d20d1983d7ded668 [file] [log] [blame]
//===---------------- VMObject.h - VM object definition -------------------===//
//
// N3
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef N3_VM_OBJECT_H
#define N3_VM_OBJECT_H
#include <vector>
#include "N3MetaType.h"
#include "llvm/Constants.h"
#include "llvm/Type.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include "mvm/Object.h"
#include "mvm/Threads/Locks.h"
#include "mvm/GC/GC.h"
#include "types.h"
namespace n3 {
class VMCommonClass;
class VMField;
class VMObject;
class VMThread;
struct N3VirtualTable : VirtualTable {
uintptr_t print;
uintptr_t hashCode;
void *operator new(size_t size, mvm::BumpPtrAllocator &allocator, size_t totalVtSize);
N3VirtualTable();
N3VirtualTable(N3VirtualTable *vmobjVt, uint32 baseVtSize, uint32 totalVtSize=-1);
N3VirtualTable(uintptr_t d, uintptr_t o, uintptr_t t, uintptr_t p, uintptr_t h);
static uint32 baseVtSize();
};
class LockObj : public mvm::Object {
public:
static N3VirtualTable _VT;
mvm::LockRecursive *lock;
std::vector<VMThread*> *threads;
static LockObj* allocate();
static void _destroy(LockObj *);
static void _print(const LockObj *, mvm::PrintBuffer *);
static void notify(LockObj*);
static void notifyAll(LockObj*);
static void wait(LockObj*, VMThread* th);
static void remove(LockObj*, VMThread* th);
static void aquire(LockObj*);
static void release(LockObj*);
static bool owner(LockObj*);
};
#define VALUE_OFFSET 3
class VMObject : public mvm::Object {
public:
VMCommonClass* classOf;
LockObj* lockObj;
static mvm::Lock* globalLock;
static const llvm::Type* llvmType;
static void _print(const VMObject *, mvm::PrintBuffer *);
static void _trace(VMObject *);
static void aquire(VMObject *self);
static void unlock(VMObject *self);
static void waitIntern(VMObject *self, struct timeval *info, bool timed);
static void wait(VMObject *self);
static void timedWait(VMObject *self, struct timeval &info);
static void notify(VMObject *self);
static void notifyAll(VMObject *self);
static void initialise(VMObject *self, VMCommonClass* cl);
static llvm::Constant* classOffset();
static bool instanceOf(VMObject *self, VMCommonClass* cl);
static N3VirtualTable *getN3VirtualTable(VMObject *self) { llvm_gcroot(self, 0); return *((N3VirtualTable**)self); }
#ifdef SIGSEGV_THROW_NULL
#define verifyNull(obj) {}
#else
#define verifyNull(obj) \
if (obj == 0) VMThread::get()->getVM()->nullPointerException("");
#endif
};
} // end namespace n3
#endif