diff -r a350c2cc736a -r 75e385f68b7e jitcraft/Opcodes.cpp --- a/jitcraft/Opcodes.cpp Fri Jun 29 19:35:17 2012 -0700 +++ b/jitcraft/Opcodes.cpp Sat Jun 30 19:38:53 2012 -0700 @@ -18,6 +18,9 @@ #include "Opcodes.h" #include "Utility.h" #include "Code.h" +#include "Zone.h" +#include "Array.h" +#include "Heap-inl.h" using namespace jc; @@ -29,6 +32,31 @@ #undef OPDEF }; +void +Code::init(ByteArray *bytecode, FixedArray *locals, FixedArray *args, + FixedArray *maps, unsigned maxStackDepth, Module *module) +{ + WRITE_FIELD_OBJ_NO_BARRIER(bytecode, bytecode); + WRITE_FIELD_OBJ_NO_BARRIER(locals, locals); + WRITE_FIELD_OBJ_NO_BARRIER(args, args); + WRITE_FIELD_OBJ_NO_BARRIER(maps, maps); + WRITE_FIELD(maxStackDepth, maxStackDepth); + WRITE_FIELD(module, VoidPtr(module)); +} + +Code * +Code::New(Zone *zone, ByteArray *bytecode, FixedArray *locals, FixedArray *args, + FixedArray *maps, unsigned maxStackDepth, Module *module) +{ + Object *obj = zone->allocate(MapKind_Code, sizeof(Code), Heap::Tenure_Old); + if (!obj) + return NULL; + + Code *code = Code::cast(obj); + code->init(bytecode, locals, args, maps, maxStackDepth, module); + return code; +} + // All jumps must be the same length. STATIC_ASSERT(OP_JL_LENGTH == OP_JUMP_LENGTH); STATIC_ASSERT(OP_JLE_LENGTH == OP_JUMP_LENGTH); @@ -99,26 +127,26 @@ fprintf(fp, "%u (%+d)", unsigned((pc + READ_INT32(pc)) - code->start()), READ_INT32(pc)); break; - case OP_STACKARRAY: + case OP_LIFOARRAY: { - unsigned width = pc[1]; - unsigned dims = pc[2]; - - for (unsigned i = 0; i < dims; i++) - fprintf(fp, "[%u]", READ_UINT32(pc + 2 + (i * sizeof(unsigned)))); - fprintf(fp, " ; (width = %s)\n", (width == 1 ? "char" : "cell")); - pc += 3 + dims * sizeof(unsigned); - continue; + // :TODO: use Local + ArrayMap *map = ArrayMap::cast(code->map(READ_UINT32(pc))); + fprintf(fp, "%s:", map->type()->innermost()->tag() + ? map->type()->innermost()->tag() + : "_"); + for (; map; map = map->contained()) { + Type *type = map->type(); + fprintf(fp, "[%d]", type->elements()); + } + break; } case OP_GETLOCAL: case OP_SETLOCAL: case OP_GETARG: case OP_SETARG: - case OP_UNWIND: - fprintf(fp, "%u", READ_UINT32(pc)); - break; - + case OP_SAVELIFO: + case OP_UNWINDLIFO: case OP_CALLGLOBAL: fprintf(fp, "%u", READ_UINT32(pc)); break; @@ -131,5 +159,6 @@ fprintf(fp, "\n"); pc += OpcodeInfo[op].length; + assert(pc < code->start() + code->length()); } }