implement JNI methods needed by AWT

These include PushLocalFrame, PopLocalFrame, NewDirectByteBuffer,
GetDirectBufferAddress, and GetDirectBufferCapacity.
This commit is contained in:
Joel Dice
2012-08-11 06:56:19 -06:00
parent 2642a167e2
commit 01be4b23bb
12 changed files with 620 additions and 165 deletions

View File

@ -28,18 +28,31 @@ const unsigned FrameFootprint = 4;
class Thread: public vm::Thread {
public:
class ReferenceFrame {
public:
ReferenceFrame(ReferenceFrame* next, unsigned sp):
next(next),
sp(sp)
{ }
ReferenceFrame* next;
unsigned sp;
};
Thread(Machine* m, object javaThread, vm::Thread* parent):
vm::Thread(m, javaThread, parent),
ip(0),
sp(0),
frame(-1),
code(0)
code(0),
referenceFrame(0)
{ }
unsigned ip;
unsigned sp;
int frame;
object code;
ReferenceFrame* referenceFrame;
uintptr_t stack[0];
};
@ -3010,6 +3023,34 @@ class MyProcessor: public Processor {
}
}
virtual bool
pushLocalFrame(vm::Thread* vmt, unsigned capacity)
{
Thread* t = static_cast<Thread*>(vmt);
if (t->sp + capacity < stackSizeInWords(t) / 2) {
t->referenceFrame = new
(t->m->heap->allocate(sizeof(Thread::ReferenceFrame)))
Thread::ReferenceFrame(t->referenceFrame, t->sp);
return true;
} else {
return false;
}
}
virtual void
popLocalFrame(vm::Thread* vmt)
{
Thread* t = static_cast<Thread*>(vmt);
Thread::ReferenceFrame* f = t->referenceFrame;
t->referenceFrame = f->next;
t->sp = f->sp;
t->m->heap->free(f, sizeof(Thread::ReferenceFrame));
}
virtual object
invokeArray(vm::Thread* vmt, object method, object this_, object arguments)
{