blob: de7745e24d959f759ac715e712242aeee77b202a [file] [log] [blame]
//===---------- MethodInfo.h - Meta information for methods ---------------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef VMKIT_METHODINFO_H
#define VMKIT_METHODINFO_H
#include "vmkit/Allocator.h"
#include "vmkit/System.h"
#include "vmkit/GC.h"
namespace vmkit {
class FrameInfo {
public:
void* Metadata;
word_t ReturnAddress;
uint16_t SourceIndex;
uint16_t FrameSize;
uint16_t NumLiveOffsets;
int16_t LiveOffsets[1];
};
class MethodInfoHelper {
public:
static void print(word_t ip, word_t addr);
static void scan(word_t closure, FrameInfo* FI, word_t ip, word_t addr);
static uint32_t FrameInfoSize(uint32_t NumOffsets) {
uint32_t FrameInfoSize = sizeof(FrameInfo) + (NumOffsets - 1) * sizeof(int16_t);
FrameInfoSize = System::WordAlignUp(FrameInfoSize);
return FrameInfoSize;
}
};
class Frames {
public:
uint32_t NumDescriptors;
FrameInfo* frames() const {
return reinterpret_cast<FrameInfo*>(
reinterpret_cast<word_t>(this) + kWordSize);
}
void* operator new(size_t sz, vmkit::BumpPtrAllocator& allocator, uint32_t NumDescriptors, uint32_t NumOffsets) {
Frames* res = reinterpret_cast<Frames*>(
allocator.Allocate(kWordSize + NumDescriptors * MethodInfoHelper::FrameInfoSize(NumOffsets), "Frames"));
assert(System::IsWordAligned(reinterpret_cast<word_t>(res)));
return res;
}
};
class CompiledFrames {
public:
uint32_t NumCompiledFrames;
Frames* frames() const {
return reinterpret_cast<Frames*>(
reinterpret_cast<word_t>(this) + kWordSize);
}
};
class FrameIterator {
public:
const Frames& frames;
uint32 currentFrameNumber;
FrameInfo* currentFrame;
FrameIterator(const Frames& f)
: frames(f), currentFrameNumber(0) , currentFrame(f.frames()) {
}
bool hasNext() {
return currentFrameNumber < frames.NumDescriptors;
}
void advance(int NumLiveOffsets) {
++currentFrameNumber;
if (!hasNext()) return;
word_t ptr =
reinterpret_cast<word_t>(currentFrame) + MethodInfoHelper::FrameInfoSize(NumLiveOffsets);
currentFrame = reinterpret_cast<FrameInfo*>(ptr);
}
FrameInfo* next() {
assert(hasNext());
FrameInfo* result = currentFrame;
advance(currentFrame->NumLiveOffsets);
return result;
}
};
extern CompiledFrames* initialFrametables[];
} // end namespace vmkit
#endif // VMKIT_METHODINFO_H