blob: be552d5b062042db4d4661abbea9158027e3ae84 [file] [log] [blame]
//===---------- MethodInfo.h - Meta information for methods ---------------===//
//
// The VMKit project
//
// This file is distributed under the University of Pierre et Marie Curie
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MVM_METHODINFO_H
#define MVM_METHODINFO_H
#include "mvm/Allocator.h"
#include "mvm/GC/GC.h"
namespace mvm {
class MethodInfo : public PermanentObject {
public:
virtual void print(void* ip, void* addr) = 0;
virtual void scan(void* TL, void* ip, void* addr) = 0;
static void* isStub(void* ip, void* addr) {
bool isStub = ((unsigned char*)ip)[0] == 0xCE;
if (isStub) ip = ((void**)addr)[2];
return ip;
}
virtual void* getMetaInfo() {
abort();
return NULL;
}
unsigned MethodType;
void* InstructionPointer;
};
class CamlFrame {
public:
void* ReturnAddress;
uint16_t FrameSize;
uint16_t NumLiveOffsets;
int16_t LiveOffsets[1];
};
class CamlMethodInfo : public MethodInfo {
CamlFrame* CF;
public:
virtual void scan(void* TL, void* ip, void* addr);
CamlMethodInfo(CamlFrame* C, void* ip);
};
class StaticCamlMethodInfo : public CamlMethodInfo {
const char* name;
public:
virtual void print(void* ip, void* addr);
StaticCamlMethodInfo(CamlFrame* CF, void* ip, const char* n) :
CamlMethodInfo(CF, ip) {
name = n;
MethodType = 0;
}
};
class DefaultMethodInfo : public MethodInfo {
public:
virtual void print(void* ip, void* addr);
virtual void scan(void* TL, void* ip, void* addr);
static DefaultMethodInfo DM;
DefaultMethodInfo() {
MethodType = -1;
}
};
} // end namespace mvm
#endif // MVM_METHODINFO_H