mirror of
https://github.com/corda/corda.git
synced 2024-12-29 09:18:58 +00:00
snapshot
This commit is contained in:
parent
35de3dc128
commit
45f5417827
@ -1,7 +1,13 @@
|
|||||||
#ifndef COMMON_H
|
#ifndef COMMON_H
|
||||||
#define COMMON_H
|
#define COMMON_H
|
||||||
|
|
||||||
|
#include "stdint.h"
|
||||||
|
|
||||||
#define NO_RETURN __attribute__((noreturn))
|
#define NO_RETURN __attribute__((noreturn))
|
||||||
#define UNLIKELY(v) __builtin_expect(v, 0)
|
#define UNLIKELY(v) __builtin_expect(v, 0)
|
||||||
|
|
||||||
|
#define MACRO_XY(X, Y) X##Y
|
||||||
|
#define MACRO_MakeNameXY(FX, LINE) MACRO_XY(FX, LINE)
|
||||||
|
#define MAKE_NAME(FX) MACRO_MakeNameXY(FX, __LINE__)
|
||||||
|
|
||||||
#endif//COMMON_H
|
#endif//COMMON_H
|
||||||
|
145
src/opcodes.h
Normal file
145
src/opcodes.h
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
#ifndef OPCODES_H
|
||||||
|
#define OPCODES_H
|
||||||
|
|
||||||
|
enum OpCode {
|
||||||
|
aaload,
|
||||||
|
aastore,
|
||||||
|
aconst,
|
||||||
|
anewarray,
|
||||||
|
areturn,
|
||||||
|
arraylength,
|
||||||
|
athrow,
|
||||||
|
baload,
|
||||||
|
bastore,
|
||||||
|
bipush,
|
||||||
|
breakpoint,
|
||||||
|
caload,
|
||||||
|
castore,
|
||||||
|
checkcast,
|
||||||
|
d2f,
|
||||||
|
d2i,
|
||||||
|
d2l,
|
||||||
|
dadd,
|
||||||
|
daload,
|
||||||
|
dastore,
|
||||||
|
dcmpg,
|
||||||
|
dcmpl,
|
||||||
|
dconst,
|
||||||
|
ddiv,
|
||||||
|
dload,
|
||||||
|
dmul,
|
||||||
|
dneg,
|
||||||
|
drem,
|
||||||
|
dreturn,
|
||||||
|
dstore,
|
||||||
|
dsub,
|
||||||
|
dup,
|
||||||
|
dup2,
|
||||||
|
f2d,
|
||||||
|
f2i,
|
||||||
|
f2l,
|
||||||
|
fadd,
|
||||||
|
faload,
|
||||||
|
fastore,
|
||||||
|
fcmpg,
|
||||||
|
fcmpl,
|
||||||
|
fconst,
|
||||||
|
fdiv,
|
||||||
|
fload,
|
||||||
|
fmul,
|
||||||
|
fneg,
|
||||||
|
frem,
|
||||||
|
freturn,
|
||||||
|
fstore,
|
||||||
|
fsub,
|
||||||
|
getfield,
|
||||||
|
getstatic,
|
||||||
|
goto_,
|
||||||
|
i2b,
|
||||||
|
i2c,
|
||||||
|
i2d,
|
||||||
|
i2f,
|
||||||
|
i2l,
|
||||||
|
i2s,
|
||||||
|
iadd,
|
||||||
|
iaload,
|
||||||
|
iand,
|
||||||
|
iastore,
|
||||||
|
iconst,
|
||||||
|
idiv,
|
||||||
|
if_,
|
||||||
|
ifeq,
|
||||||
|
ifge,
|
||||||
|
ifgt,
|
||||||
|
ifle,
|
||||||
|
iflt,
|
||||||
|
ifne,
|
||||||
|
ifnonnull,
|
||||||
|
ifnull,
|
||||||
|
iinc,
|
||||||
|
iload,
|
||||||
|
impdep1,
|
||||||
|
impdep2,
|
||||||
|
imul,
|
||||||
|
ineg,
|
||||||
|
instanceof,
|
||||||
|
invokeinterface,
|
||||||
|
invokespecial,
|
||||||
|
invokestatic,
|
||||||
|
invokevirtual,
|
||||||
|
ior,
|
||||||
|
irem,
|
||||||
|
ireturn,
|
||||||
|
ishl,
|
||||||
|
ishr,
|
||||||
|
istore,
|
||||||
|
isub,
|
||||||
|
iushr,
|
||||||
|
ixor,
|
||||||
|
jsr,
|
||||||
|
l2d,
|
||||||
|
l2f,
|
||||||
|
l2i,
|
||||||
|
ladd,
|
||||||
|
laload,
|
||||||
|
land,
|
||||||
|
lastore,
|
||||||
|
lcmp,
|
||||||
|
lconst,
|
||||||
|
ldc,
|
||||||
|
ldc2,
|
||||||
|
ldiv,
|
||||||
|
lload,
|
||||||
|
lmul,
|
||||||
|
lneg,
|
||||||
|
lookupswitch,
|
||||||
|
lor,
|
||||||
|
lrem,
|
||||||
|
lreturn,
|
||||||
|
lshl,
|
||||||
|
lshr,
|
||||||
|
lstore,
|
||||||
|
lsub,
|
||||||
|
lushr,
|
||||||
|
lxor,
|
||||||
|
monitorenter,
|
||||||
|
monitorexit,
|
||||||
|
multianewarray,
|
||||||
|
new_,
|
||||||
|
newarray,
|
||||||
|
nop,
|
||||||
|
pop_,
|
||||||
|
pop2,
|
||||||
|
putfield,
|
||||||
|
putstatic,
|
||||||
|
ret,
|
||||||
|
return_,
|
||||||
|
saload,
|
||||||
|
sastore,
|
||||||
|
sipush,
|
||||||
|
swap,
|
||||||
|
tableswitch,
|
||||||
|
wide
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif//OPCODES_H
|
11
src/system.h
11
src/system.h
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
#define ACQUIRE(x) System::MonitorResource MAKE_NAME(monitorResource_) (x)
|
||||||
|
|
||||||
class System {
|
class System {
|
||||||
public:
|
public:
|
||||||
typedef int Status;
|
typedef int Status;
|
||||||
@ -24,6 +26,15 @@ class System {
|
|||||||
virtual void dispose() = 0;
|
virtual void dispose() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MonitorResource {
|
||||||
|
public:
|
||||||
|
MonitorResource(Monitor* m): m(m) { m->acquire(); }
|
||||||
|
~MonitorResource() { m->release(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Monitor* m;
|
||||||
|
};
|
||||||
|
|
||||||
class File {
|
class File {
|
||||||
public:
|
public:
|
||||||
virtual ~File() { }
|
virtual ~File() { }
|
||||||
|
@ -1006,12 +1006,12 @@ writeAccessor(Output* out, Object* member, Object* offset, bool unsafe = false)
|
|||||||
out->write(member->type == Object::Scalar ? "&" : "*");
|
out->write(member->type == Object::Scalar ? "&" : "*");
|
||||||
out->write("\n");
|
out->write("\n");
|
||||||
writeAccessorName(out, member, true, unsafe);
|
writeAccessorName(out, member, true, unsafe);
|
||||||
out->write("(Thread* t, ");
|
|
||||||
if (memberOwner(member)->type == Object::Pod) {
|
if (memberOwner(member)->type == Object::Pod) {
|
||||||
|
out->write("(");
|
||||||
out->write(capitalize(::typeName(memberOwner(member))));
|
out->write(capitalize(::typeName(memberOwner(member))));
|
||||||
out->write("*");
|
out->write("*");
|
||||||
} else {
|
} else {
|
||||||
out->write("object");
|
out->write("(Thread* t, object");
|
||||||
}
|
}
|
||||||
out->write(" o");
|
out->write(" o");
|
||||||
if (member->type != Object::Scalar) {
|
if (member->type != Object::Scalar) {
|
||||||
|
383
src/vm.cpp
383
src/vm.cpp
@ -5,9 +5,28 @@
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
typedef void* object;
|
typedef void* object;
|
||||||
|
typedef unsigned Type;
|
||||||
|
|
||||||
|
#include "opcodes.h"
|
||||||
|
|
||||||
|
enum ObjectType {
|
||||||
|
NullType,
|
||||||
|
CollectedType,
|
||||||
|
|
||||||
|
#include "type-enums.h"
|
||||||
|
|
||||||
|
OtherType
|
||||||
|
};
|
||||||
|
|
||||||
class Thread;
|
class Thread;
|
||||||
|
|
||||||
|
Type typeOf(object);
|
||||||
|
|
||||||
|
object& objectClass(object);
|
||||||
|
void assert(Thread* t, bool v);
|
||||||
|
|
||||||
|
#include "type-header.h"
|
||||||
|
|
||||||
class Machine {
|
class Machine {
|
||||||
public:
|
public:
|
||||||
System* sys;
|
System* sys;
|
||||||
@ -105,12 +124,12 @@ iterate(Thread* t, Heap::Visitor* v)
|
|||||||
void
|
void
|
||||||
collect(Machine* m, Heap::CollectionType type)
|
collect(Machine* m, Heap::CollectionType type)
|
||||||
{
|
{
|
||||||
class Iterator: Heap::Iterator {
|
class Iterator: public Heap::Iterator {
|
||||||
public:
|
public:
|
||||||
Iterator(Machine* m): machine(m) { }
|
Iterator(Machine* m): machine(m) { }
|
||||||
|
|
||||||
void iterate(Heap::Visitor* v) {
|
void iterate(Heap::Visitor* v) {
|
||||||
for (Thread* t = m->rootThread; t; t = t->next) {
|
for (Thread* t = machine->rootThread; t; t = t->next) {
|
||||||
::iterate(t, v);
|
::iterate(t, v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,13 +144,13 @@ collect(Machine* m, Heap::CollectionType type)
|
|||||||
void
|
void
|
||||||
enter(Thread* t, Thread::State s)
|
enter(Thread* t, Thread::State s)
|
||||||
{
|
{
|
||||||
if (s == state) return;
|
if (s == t->state) return;
|
||||||
|
|
||||||
ACQUIRE(t->vm->stateLock);
|
ACQUIRE(t->vm->stateLock);
|
||||||
|
|
||||||
switch (s) {
|
switch (s) {
|
||||||
case ExclusiveState: {
|
case Thread::ExclusiveState: {
|
||||||
assert(t, state == ActiveState);
|
assert(t, t->state == Thread::ActiveState);
|
||||||
|
|
||||||
while (t->vm->exclusive) {
|
while (t->vm->exclusive) {
|
||||||
// another thread got here first.
|
// another thread got here first.
|
||||||
@ -139,7 +158,7 @@ enter(Thread* t, Thread::State s)
|
|||||||
enter(t, Thread::ActiveState);
|
enter(t, Thread::ActiveState);
|
||||||
}
|
}
|
||||||
|
|
||||||
t->state = ExclusiveState;
|
t->state = Thread::ExclusiveState;
|
||||||
t->vm->exclusive = t;
|
t->vm->exclusive = t;
|
||||||
|
|
||||||
while (t->vm->activeCount > 1) {
|
while (t->vm->activeCount > 1) {
|
||||||
@ -147,21 +166,21 @@ enter(Thread* t, Thread::State s)
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case IdleState:
|
case Thread::IdleState:
|
||||||
case ZombieState: {
|
case Thread::ZombieState: {
|
||||||
switch (state) {
|
switch (t->state) {
|
||||||
case ExclusiveState: {
|
case Thread::ExclusiveState: {
|
||||||
assert(t, t->vm->exclusive == t);
|
assert(t, t->vm->exclusive == t);
|
||||||
t->vm->exclusive = 0;
|
t->vm->exclusive = 0;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ActiveState: break;
|
case Thread::ActiveState: break;
|
||||||
|
|
||||||
default: abort(t);
|
default: abort(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
-- t->vm->activeCount;
|
-- t->vm->activeCount;
|
||||||
if (s == ZombieState) {
|
if (s == Thread::ZombieState) {
|
||||||
-- t->vm->liveCount;
|
-- t->vm->liveCount;
|
||||||
}
|
}
|
||||||
t->state = s;
|
t->state = s;
|
||||||
@ -169,9 +188,9 @@ enter(Thread* t, Thread::State s)
|
|||||||
t->vm->stateLock->notifyAll();
|
t->vm->stateLock->notifyAll();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ActiveState: {
|
case Thread::ActiveState: {
|
||||||
switch (state) {
|
switch (t->state) {
|
||||||
case ExclusiveState: {
|
case Thread::ExclusiveState: {
|
||||||
assert(t, t->vm->exclusive == t);
|
assert(t, t->vm->exclusive == t);
|
||||||
|
|
||||||
t->state = s;
|
t->state = s;
|
||||||
@ -180,14 +199,14 @@ enter(Thread* t, Thread::State s)
|
|||||||
t->vm->stateLock->notifyAll();
|
t->vm->stateLock->notifyAll();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case NoState:
|
case Thread::NoState:
|
||||||
case IdleState: {
|
case Thread::IdleState: {
|
||||||
while (t->vm->exclusive) {
|
while (t->vm->exclusive) {
|
||||||
t->vm->stateLock->wait();
|
t->vm->stateLock->wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
++ t->vm->activeCount;
|
++ t->vm->activeCount;
|
||||||
if (state == NoState) {
|
if (t->state == Thread::NoState) {
|
||||||
++ t->vm->liveCount;
|
++ t->vm->liveCount;
|
||||||
}
|
}
|
||||||
t->state = s;
|
t->state = s;
|
||||||
@ -197,14 +216,14 @@ enter(Thread* t, Thread::State s)
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ExitState: {
|
case Thread::ExitState: {
|
||||||
switch (state) {
|
switch (t->state) {
|
||||||
case ExclusiveState: {
|
case Thread::ExclusiveState: {
|
||||||
assert(t, t->vm->exclusive == t);
|
assert(t, t->vm->exclusive == t);
|
||||||
t->vm->exclusive = 0;
|
t->vm->exclusive = 0;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ActiveState: break;
|
case Thread::ActiveState: break;
|
||||||
|
|
||||||
default: abort(t);
|
default: abort(t);
|
||||||
}
|
}
|
||||||
@ -278,18 +297,18 @@ run(Thread* t)
|
|||||||
unsigned parameterCount = 0;
|
unsigned parameterCount = 0;
|
||||||
|
|
||||||
loop:
|
loop:
|
||||||
switch (codeBody(t->code)[ip++]) {
|
switch (codeBody(t, t->code)[ip++]) {
|
||||||
case aaload: {
|
case aaload: {
|
||||||
object index = pop(t);
|
object index = pop(t);
|
||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
if (i >= 0 and i < objectArrayLength(array)) {
|
if (i >= 0 and i < objectArrayLength(t, array)) {
|
||||||
push(t, objectArrayBody(array)[i]);
|
push(t, objectArrayBody(t, array)[i]);
|
||||||
} else {
|
} else {
|
||||||
object message = makeString(t, "%d not in [0,%d]", i,
|
object message = makeString(t, "%d not in [0,%d]", i,
|
||||||
objectArrayLength(array));
|
objectArrayLength(t, array));
|
||||||
t->exception = makeArrayIndexOutOfBoundsException(t, message);
|
t->exception = makeArrayIndexOutOfBoundsException(t, message);
|
||||||
goto throw_;
|
goto throw_;
|
||||||
}
|
}
|
||||||
@ -303,14 +322,14 @@ run(Thread* t)
|
|||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
object index = pop(t);
|
object index = pop(t);
|
||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
if (i >= 0 and i < objectArrayLength(array)) {
|
if (i >= 0 and i < objectArrayLength(t, array)) {
|
||||||
set(t, objectArrayBody(array)[i], value);
|
set(t, objectArrayBody(array)[i], value);
|
||||||
} else {
|
} else {
|
||||||
object message = makeString(t, "%d not in [0,%d]", i,
|
object message = makeString(t, "%d not in [0,%d]", i,
|
||||||
objectArrayLength(array));
|
objectArrayLength(t, array));
|
||||||
t->exception = makeArrayIndexOutOfBoundsException(t, message);
|
t->exception = makeArrayIndexOutOfBoundsException(t, message);
|
||||||
goto throw_;
|
goto throw_;
|
||||||
}
|
}
|
||||||
@ -327,40 +346,40 @@ run(Thread* t)
|
|||||||
case aload:
|
case aload:
|
||||||
case iload:
|
case iload:
|
||||||
case lload: {
|
case lload: {
|
||||||
push(t, frameBody(t->frame)[codeBody(t->code)[ip++]]);
|
push(t, frameBody(t, t->frame)[codeBody(t, t->code)[ip++]]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case aload_0:
|
case aload_0:
|
||||||
case iload_0:
|
case iload_0:
|
||||||
case lload_0: {
|
case lload_0: {
|
||||||
push(t, frameBody(t->frame)[0]);
|
push(t, frameBody(t, t->frame)[0]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case aload_1:
|
case aload_1:
|
||||||
case iload_1:
|
case iload_1:
|
||||||
case lload_1: {
|
case lload_1: {
|
||||||
push(t, frameBody(t->frame)[1]);
|
push(t, frameBody(t, t->frame)[1]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case aload_2:
|
case aload_2:
|
||||||
case iload_2:
|
case iload_2:
|
||||||
case lload_2: {
|
case lload_2: {
|
||||||
push(t, frameBody(t->frame)[2]);
|
push(t, frameBody(t, t->frame)[2]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case aload_3:
|
case aload_3:
|
||||||
case iload_3:
|
case iload_3:
|
||||||
case lload_3: {
|
case lload_3: {
|
||||||
push(t, frameBody(t->frame)[3]);
|
push(t, frameBody(t, t->frame)[3]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case anewarray: {
|
case anewarray: {
|
||||||
object count = pop(t);
|
object count = pop(t);
|
||||||
int32_t c = intValue(count);
|
int32_t c = intValue(t, count);
|
||||||
|
|
||||||
if (c >= 0) {
|
if (c >= 0) {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object class_ = resolveClass(t, codePool(t->code), index);
|
object class_ = resolveClass(t, codePool(t->code), index);
|
||||||
@ -406,35 +425,35 @@ run(Thread* t)
|
|||||||
case istore:
|
case istore:
|
||||||
case lstore: {
|
case lstore: {
|
||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
set(t, frameBody(t->frame)[codeBody(t->code)[ip++]], value);
|
set(t, frameBody(t, t->frame)[codeBody(t, t->code)[ip++]], value);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case astore_0:
|
case astore_0:
|
||||||
case istore_0:
|
case istore_0:
|
||||||
case lstore_0: {
|
case lstore_0: {
|
||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
set(t, frameBody(t->frame)[0], value);
|
set(t, frameBody(t, t->frame)[0], value);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case astore_1:
|
case astore_1:
|
||||||
case istore_1:
|
case istore_1:
|
||||||
case lstore_1: {
|
case lstore_1: {
|
||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
set(t, frameBody(t->frame)[1], value);
|
set(t, frameBody(t, t->frame)[1], value);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case astore_2:
|
case astore_2:
|
||||||
case istore_2:
|
case istore_2:
|
||||||
case lstore_2: {
|
case lstore_2: {
|
||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
set(t, frameBody(t->frame)[2], value);
|
set(t, frameBody(t, t->frame)[2], value);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case astore_3:
|
case astore_3:
|
||||||
case istore_3:
|
case istore_3:
|
||||||
case lstore_3: {
|
case lstore_3: {
|
||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
set(t, frameBody(t->frame)[3], value);
|
set(t, frameBody(t, t->frame)[3], value);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case athrow: {
|
case athrow: {
|
||||||
@ -450,7 +469,7 @@ run(Thread* t)
|
|||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
if (i >= 0 and i < byteArrayLength(array)) {
|
if (i >= 0 and i < byteArrayLength(array)) {
|
||||||
push(t, makeByte(t, byteArrayBody(array)[i]));
|
push(t, makeByte(t, byteArrayBody(array)[i]));
|
||||||
} else {
|
} else {
|
||||||
@ -469,11 +488,11 @@ run(Thread* t)
|
|||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
object index = pop(t);
|
object index = pop(t);
|
||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
if (i >= 0 and i < byteArrayLength(array)) {
|
if (i >= 0 and i < byteArrayLength(array)) {
|
||||||
byteArrayBody(array)[i] = intValue(value);
|
byteArrayBody(array)[i] = intValue(t, value);
|
||||||
} else {
|
} else {
|
||||||
object message = makeString(t, "%d not in [0,%d]", i,
|
object message = makeString(t, "%d not in [0,%d]", i,
|
||||||
byteArrayLength(array));
|
byteArrayLength(array));
|
||||||
@ -487,7 +506,7 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case bipush: {
|
case bipush: {
|
||||||
push(t, makeInt(t, codeBody(t->code)[ip++]));
|
push(t, makeInt(t, codeBody(t, t->code)[ip++]));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case caload: {
|
case caload: {
|
||||||
@ -495,7 +514,7 @@ run(Thread* t)
|
|||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
if (i >= 0 and i < charArrayLength(array)) {
|
if (i >= 0 and i < charArrayLength(array)) {
|
||||||
push(t, makeInt(t, charArrayBody(array)[i]));
|
push(t, makeInt(t, charArrayBody(array)[i]));
|
||||||
} else {
|
} else {
|
||||||
@ -514,11 +533,11 @@ run(Thread* t)
|
|||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
object index = pop(t);
|
object index = pop(t);
|
||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
if (i >= 0 and i < charArrayLength(array)) {
|
if (i >= 0 and i < charArrayLength(array)) {
|
||||||
charArrayBody(array)[i] = intValue(value);
|
charArrayBody(array)[i] = intValue(t, value);
|
||||||
} else {
|
} else {
|
||||||
object message = makeString(t, "%d not in [0,%d]", i,
|
object message = makeString(t, "%d not in [0,%d]", i,
|
||||||
charArrayLength(array));
|
charArrayLength(array));
|
||||||
@ -532,8 +551,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case checkcast: {
|
case checkcast: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
if (t->stack[t->sp - 1]) {
|
if (t->stack[t->sp - 1]) {
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
@ -641,8 +660,8 @@ run(Thread* t)
|
|||||||
case getfield: {
|
case getfield: {
|
||||||
object instance = pop(t);
|
object instance = pop(t);
|
||||||
if (instance) {
|
if (instance) {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object field = resolveField(t, codePool(t->code), index);
|
object field = resolveField(t, codePool(t->code), index);
|
||||||
@ -656,8 +675,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case getstatic: {
|
case getstatic: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object field = resolveField(t, codePool(t->code), index);
|
object field = resolveField(t, codePool(t->code), index);
|
||||||
@ -674,17 +693,17 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case goto_: {
|
case goto_: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case goto_w: {
|
case goto_w: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset3 = codeBody(t->code)[ip++];
|
uint8_t offset3 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset4 = codeBody(t->code)[ip++];
|
uint8_t offset4 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
ip = (ip - 1)
|
ip = (ip - 1)
|
||||||
+ ((offset1 << 24) | (offset2 << 16) | (offset3 << 8) | offset4);
|
+ ((offset1 << 24) | (offset2 << 16) | (offset3 << 8) | offset4);
|
||||||
@ -693,32 +712,32 @@ run(Thread* t)
|
|||||||
case i2b: {
|
case i2b: {
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, static_cast<int8_t>(intValue(v))));
|
push(t, makeInt(t, static_cast<int8_t>(intValue(t, v))));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case i2c: {
|
case i2c: {
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, static_cast<uint16_t>(intValue(v))));
|
push(t, makeInt(t, static_cast<uint16_t>(intValue(t, v))));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case i2l: {
|
case i2l: {
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
push(t, makeLong(t, intValue(v)));
|
push(t, makeLong(t, intValue(t, v)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case i2s: {
|
case i2s: {
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, static_cast<int16_t>(intValue(v))));
|
push(t, makeInt(t, static_cast<int16_t>(intValue(t, v))));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case iadd: {
|
case iadd: {
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) + intValue(b)));
|
push(t, makeInt(t, intValue(t, a) + intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case iaload: {
|
case iaload: {
|
||||||
@ -726,7 +745,7 @@ run(Thread* t)
|
|||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
if (i >= 0 and i < intArrayLength(array)) {
|
if (i >= 0 and i < intArrayLength(array)) {
|
||||||
push(t, makeInt(t, intArrayBody(array)[i]));
|
push(t, makeInt(t, intArrayBody(array)[i]));
|
||||||
} else {
|
} else {
|
||||||
@ -745,18 +764,18 @@ run(Thread* t)
|
|||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) & intValue(b)));
|
push(t, makeInt(t, intValue(t, a) & intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case iastore: {
|
case iastore: {
|
||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
object index = pop(t);
|
object index = pop(t);
|
||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
if (i >= 0 and i < intArrayLength(array)) {
|
if (i >= 0 and i < intArrayLength(array)) {
|
||||||
intArrayBody(array)[i] = intValue(value);
|
intArrayBody(array)[i] = intValue(t, value);
|
||||||
} else {
|
} else {
|
||||||
object message = makeString(t, "%d not in [0,%d]", i,
|
object message = makeString(t, "%d not in [0,%d]", i,
|
||||||
intArrayLength(array));
|
intArrayLength(array));
|
||||||
@ -797,12 +816,12 @@ run(Thread* t)
|
|||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) / intValue(b)));
|
push(t, makeInt(t, intValue(t, a) / intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case if_acmpeq: {
|
case if_acmpeq: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
@ -813,8 +832,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case if_acmpne: {
|
case if_acmpne: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
@ -825,146 +844,146 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case if_icmpeq: {
|
case if_icmpeq: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
if (intValue(a) == intValue(b)) {
|
if (intValue(t, a) == intValue(t, b)) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case if_icmpne: {
|
case if_icmpne: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
if (intValue(a) != intValue(b)) {
|
if (intValue(t, a) != intValue(t, b)) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case if_icmpgt: {
|
case if_icmpgt: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
if (intValue(a) > intValue(b)) {
|
if (intValue(t, a) > intValue(t, b)) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case if_icmpge: {
|
case if_icmpge: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
if (intValue(a) >= intValue(b)) {
|
if (intValue(t, a) >= intValue(t, b)) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case if_icmplt: {
|
case if_icmplt: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
if (intValue(a) < intValue(b)) {
|
if (intValue(t, a) < intValue(t, b)) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case if_icmple: {
|
case if_icmple: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
if (intValue(a) < intValue(b)) {
|
if (intValue(t, a) < intValue(t, b)) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ifeq: {
|
case ifeq: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
if (intValue(v) == 0) {
|
if (intValue(t, v) == 0) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ifne: {
|
case ifne: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
if (intValue(v)) {
|
if (intValue(t, v)) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ifgt: {
|
case ifgt: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
if (intValue(v) > 0) {
|
if (intValue(t, v) > 0) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ifge: {
|
case ifge: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
if (intValue(v) >= 0) {
|
if (intValue(t, v) >= 0) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case iflt: {
|
case iflt: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
if (intValue(v) < 0) {
|
if (intValue(t, v) < 0) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ifle: {
|
case ifle: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
if (intValue(v) <= 0) {
|
if (intValue(t, v) <= 0) {
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
}
|
}
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ifnonnull: {
|
case ifnonnull: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
@ -974,8 +993,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ifnull: {
|
case ifnull: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
@ -985,29 +1004,29 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case iinc: {
|
case iinc: {
|
||||||
uint8_t index = codeBody(t->code)[ip++];
|
uint8_t index = codeBody(t, t->code)[ip++];
|
||||||
int8_t c = codeBody(t->code)[ip++];
|
int8_t c = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
int32_t v = intValue(frameBody(t->frame)[index]);
|
int32_t v = intValue(t, frameBody(t, t->frame)[index]);
|
||||||
frameBody(t->frame)[index] = makeInt(t, v + c);
|
frameBody(t, t->frame)[index] = makeInt(t, v + c);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case imul: {
|
case imul: {
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) * intValue(b)));
|
push(t, makeInt(t, intValue(t, a) * intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ineg: {
|
case ineg: {
|
||||||
object v = pop(t);
|
object v = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, - intValue(v)));
|
push(t, makeInt(t, - intValue(t, v)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case instanceof: {
|
case instanceof: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
if (t->stack[t->sp - 1]) {
|
if (t->stack[t->sp - 1]) {
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
@ -1026,8 +1045,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case invokeinterface: {
|
case invokeinterface: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
ip += 2;
|
ip += 2;
|
||||||
@ -1049,8 +1068,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case invokespecial: {
|
case invokespecial: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object method = resolveMethod(t, codePool(t->code), index);
|
object method = resolveMethod(t, codePool(t->code), index);
|
||||||
@ -1074,8 +1093,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case invokestatic: {
|
case invokestatic: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object method = resolveMethod(t, codePool(t->code), index);
|
object method = resolveMethod(t, codePool(t->code), index);
|
||||||
@ -1093,8 +1112,8 @@ run(Thread* t)
|
|||||||
} goto invoke;
|
} goto invoke;
|
||||||
|
|
||||||
case invokevirtual: {
|
case invokevirtual: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object method = resolveMethod(t, codePool(t->code), index);
|
object method = resolveMethod(t, codePool(t->code), index);
|
||||||
@ -1117,64 +1136,64 @@ run(Thread* t)
|
|||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) | intValue(b)));
|
push(t, makeInt(t, intValue(t, a) | intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case irem: {
|
case irem: {
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) % intValue(b)));
|
push(t, makeInt(t, intValue(t, a) % intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ishl: {
|
case ishl: {
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) << intValue(b)));
|
push(t, makeInt(t, intValue(t, a) << intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ishr: {
|
case ishr: {
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) >> intValue(b)));
|
push(t, makeInt(t, intValue(t, a) >> intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case isub: {
|
case isub: {
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) - intValue(b)));
|
push(t, makeInt(t, intValue(t, a) - intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case iushr: {
|
case iushr: {
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, static_cast<uint32_t>(intValue(a)) >> intValue(b)));
|
push(t, makeInt(t, static_cast<uint32_t>(intValue(t, a)) >> intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ixor: {
|
case ixor: {
|
||||||
object b = pop(t);
|
object b = pop(t);
|
||||||
object a = pop(t);
|
object a = pop(t);
|
||||||
|
|
||||||
push(t, makeInt(t, intValue(a) ^ intValue(b)));
|
push(t, makeInt(t, intValue(t, a) ^ intValue(t, b)));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case jsr: {
|
case jsr: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
push(t, makeInt(ip));
|
push(t, makeInt(ip));
|
||||||
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
ip = (ip - 1) + ((offset1 << 8) | offset2);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case jsr_w: {
|
case jsr_w: {
|
||||||
uint8_t offset1 = codeBody(t->code)[ip++];
|
uint8_t offset1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset2 = codeBody(t->code)[ip++];
|
uint8_t offset2 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset3 = codeBody(t->code)[ip++];
|
uint8_t offset3 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t offset4 = codeBody(t->code)[ip++];
|
uint8_t offset4 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
push(t, makeInt(ip));
|
push(t, makeInt(ip));
|
||||||
ip = (ip - 1)
|
ip = (ip - 1)
|
||||||
@ -1199,7 +1218,7 @@ run(Thread* t)
|
|||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
if (i >= 0 and i < longArrayLength(array)) {
|
if (i >= 0 and i < longArrayLength(array)) {
|
||||||
push(t, makeLong(t, longArrayBody(array)[i]));
|
push(t, makeLong(t, longArrayBody(array)[i]));
|
||||||
} else {
|
} else {
|
||||||
@ -1225,7 +1244,7 @@ run(Thread* t)
|
|||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
object index = pop(t);
|
object index = pop(t);
|
||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
if (i >= 0 and i < longArrayLength(array)) {
|
if (i >= 0 and i < longArrayLength(array)) {
|
||||||
@ -1259,15 +1278,15 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ldc: {
|
case ldc: {
|
||||||
push(t, codePool(t->code)[codeBody(t->code)[ip++]]);
|
push(t, codePool(t->code)[codeBody(t, t->code)[ip++]]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ldc_w:
|
case ldc_w:
|
||||||
case ldc2_w: {
|
case ldc2_w: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
push(t, codePool(t->code)[codeBody(t->code)[(offset1 << 8) | offset2]]);
|
push(t, codePool(t->code)[codeBody(t, t->code)[(offset1 << 8) | offset2]]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ldiv: {
|
case ldiv: {
|
||||||
@ -1340,8 +1359,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case new_: {
|
case new_: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object class_ = resolveClass(t, codePool(t->code), index);
|
object class_ = resolveClass(t, codePool(t->code), index);
|
||||||
@ -1365,10 +1384,10 @@ run(Thread* t)
|
|||||||
|
|
||||||
case newarray: {
|
case newarray: {
|
||||||
object count = pop(t);
|
object count = pop(t);
|
||||||
int32_t c = intValue(count);
|
int32_t c = intValue(t, count);
|
||||||
|
|
||||||
if (c >= 0) {
|
if (c >= 0) {
|
||||||
uint8_t type = codeBody(t->code)[ip++];
|
uint8_t type = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object array;
|
object array;
|
||||||
unsigned factor;
|
unsigned factor;
|
||||||
@ -1430,7 +1449,7 @@ run(Thread* t)
|
|||||||
|
|
||||||
case nop: goto loop;
|
case nop: goto loop;
|
||||||
|
|
||||||
case pop: {
|
case pop_: {
|
||||||
-- (t->sp);
|
-- (t->sp);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
@ -1446,8 +1465,8 @@ run(Thread* t)
|
|||||||
case putfield: {
|
case putfield: {
|
||||||
object instance = pop(t);
|
object instance = pop(t);
|
||||||
if (instance) {
|
if (instance) {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object field = resolveField(t, codePool(t->code), index);
|
object field = resolveField(t, codePool(t->code), index);
|
||||||
@ -1462,8 +1481,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case putstatic: {
|
case putstatic: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
object field = resolveField(t, codePool(t->code), index);
|
object field = resolveField(t, codePool(t->code), index);
|
||||||
@ -1481,7 +1500,7 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ret: {
|
case ret: {
|
||||||
ip = intValue(frameBody(t->frame)[codeBody(t->code)[ip++]]);
|
ip = intValue(t, frameBody(t, t->frame)[codeBody(t, t->code)[ip++]]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case return_: {
|
case return_: {
|
||||||
@ -1501,7 +1520,7 @@ run(Thread* t)
|
|||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
if (i >= 0 and i < shortArrayLength(array)) {
|
if (i >= 0 and i < shortArrayLength(array)) {
|
||||||
push(t, makeShort(t, shortArrayBody(array)[i]));
|
push(t, makeShort(t, shortArrayBody(array)[i]));
|
||||||
} else {
|
} else {
|
||||||
@ -1520,11 +1539,11 @@ run(Thread* t)
|
|||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
object index = pop(t);
|
object index = pop(t);
|
||||||
object array = pop(t);
|
object array = pop(t);
|
||||||
int32_t i = intValue(index);
|
int32_t i = intValue(t, index);
|
||||||
|
|
||||||
if (array) {
|
if (array) {
|
||||||
if (i >= 0 and i < shortArrayLength(array)) {
|
if (i >= 0 and i < shortArrayLength(array)) {
|
||||||
shortArrayBody(array)[i] = intValue(value);
|
shortArrayBody(array)[i] = intValue(t, value);
|
||||||
} else {
|
} else {
|
||||||
object message = makeString(t, "%d not in [0,%d]", i,
|
object message = makeString(t, "%d not in [0,%d]", i,
|
||||||
shortArrayLength(array));
|
shortArrayLength(array));
|
||||||
@ -1538,8 +1557,8 @@ run(Thread* t)
|
|||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case sipush: {
|
case sipush: {
|
||||||
uint8_t byte1 = codeBody(t->code)[ip++];
|
uint8_t byte1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t byte2 = codeBody(t->code)[ip++];
|
uint8_t byte2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
push(t, makeInt(t, (byte1 << 8) | byte2));
|
push(t, makeInt(t, (byte1 << 8) | byte2));
|
||||||
} goto loop;
|
} goto loop;
|
||||||
@ -1556,44 +1575,44 @@ run(Thread* t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
wide:
|
wide:
|
||||||
switch (codeBody(t->code)[ip++]) {
|
switch (codeBody(t, t->code)[ip++]) {
|
||||||
case aload:
|
case aload:
|
||||||
case iload:
|
case iload:
|
||||||
case lload: {
|
case lload: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
push(t, frameBody(t->frame)[(index1 << 8) | index2]);
|
push(t, frameBody(t, t->frame)[(index1 << 8) | index2]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case astore:
|
case astore:
|
||||||
case istore:
|
case istore:
|
||||||
case lstore: {
|
case lstore: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
object value = pop(t);
|
object value = pop(t);
|
||||||
set(t, frameBody(t->frame)[(index1 << 8) | index2], value);
|
set(t, frameBody(t, t->frame)[(index1 << 8) | index2], value);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case iinc: {
|
case iinc: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t index = (index1 << 8) | index2;
|
uint16_t index = (index1 << 8) | index2;
|
||||||
|
|
||||||
uint8_t count1 = codeBody(t->code)[ip++];
|
uint8_t count1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t count2 = codeBody(t->code)[ip++];
|
uint8_t count2 = codeBody(t, t->code)[ip++];
|
||||||
uint16_t count = (count1 << 8) | count2;
|
uint16_t count = (count1 << 8) | count2;
|
||||||
|
|
||||||
int32_t v = intValue(frameBody(t->frame)[index]);
|
int32_t v = intValue(t, frameBody(t, t->frame)[index]);
|
||||||
frameBody(t->frame)[index] = makeInt(t, v + count);
|
frameBody(t, t->frame)[index] = makeInt(t, v + count);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
case ret: {
|
case ret: {
|
||||||
uint8_t index1 = codeBody(t->code)[ip++];
|
uint8_t index1 = codeBody(t, t->code)[ip++];
|
||||||
uint8_t index2 = codeBody(t->code)[ip++];
|
uint8_t index2 = codeBody(t, t->code)[ip++];
|
||||||
|
|
||||||
ip = intValue(frameBody(t->frame)[(index1 << 8) | index2]);
|
ip = intValue(t, frameBody(t, t->frame)[(index1 << 8) | index2]);
|
||||||
} goto loop;
|
} goto loop;
|
||||||
|
|
||||||
default: abort(t);
|
default: abort(t);
|
||||||
|
Loading…
Reference in New Issue
Block a user