dvander@0: /* dvander@0: * Copyright (C) 2012 David Anderson dvander@0: * dvander@0: * This file is part of JITCraft. dvander@0: * dvander@0: * JITCraft is free software: you can redistribute it and/or modify it under dvander@0: * the terms of the GNU General Public License as published by the Free dvander@0: * Software Foundation, either version 3 of the License, or (at your option) dvander@0: * any later version. dvander@0: * dvander@0: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@0: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@0: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@0: * dvander@0: * You should have received a copy of the GNU General Public License along with dvander@0: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@0: */ dvander@0: #ifndef _include_jc_code_h_ dvander@0: #define _include_jc_code_h_ dvander@0: dvander@0: #include "Opcodes.h" dvander@12: #include "Barriers.h" dvander@12: #include "Heap.h" dvander@12: #include "Types.h" dvander@12: #include "FixedArray.h" dvander@0: dvander@0: namespace jc { dvander@0: dvander@0: class Module; dvander@0: class Type; dvander@0: dvander@12: class Code : public Object dvander@0: { dvander@12: OBJECT_FIELD(ByteArray *, bytecode); dvander@12: OBJECT_FIELD(FixedArray *, locals); dvander@12: OBJECT_FIELD(FixedArray *, args); dvander@12: OBJECT_FIELD(uint32, maxStackDepth); dvander@12: OBJECT_FIELD(VoidPtr, module); dvander@12: OBJECT_FIELD(FixedArray *, maps); dvander@12: dvander@12: private: dvander@12: void init(ByteArray *bytecode, FixedArray *locals, FixedArray *args, dvander@12: FixedArray *maps, unsigned maxStackDepth, Module *module); dvander@12: dvander@12: ByteArray *code() { dvander@12: return ByteArray::cast(READ_FIELD_OBJ(bytecode)); dvander@12: } dvander@12: FixedArray *locals() { dvander@12: return FixedArray::cast(READ_FIELD_OBJ(locals)); dvander@12: } dvander@12: FixedArray *args() { dvander@12: return FixedArray::cast(READ_FIELD_OBJ(args)); dvander@12: } dvander@12: FixedArray *maps() { dvander@12: return FixedArray::cast(READ_FIELD_OBJ(maps)); dvander@12: } dvander@0: dvander@0: public: dvander@12: // :TODO: use handles dvander@12: static Code *New(Zone *zone, ByteArray *bytecode, FixedArray *locals, FixedArray *args, dvander@12: FixedArray *maps, unsigned maxStackDepth, Module *module); dvander@12: dvander@12: Module *module() { dvander@12: return (Module *)READ_FIELD(module); dvander@12: } dvander@12: bytecode *start() { dvander@12: return code()->raw(); dvander@12: } dvander@12: unsigned length() { dvander@12: return code()->length(); dvander@12: } dvander@12: Type *localType(size_t index) { dvander@12: assert(index < nlocals()); dvander@12: return Type::cast(locals()->at(index)); dvander@12: } dvander@12: Type *argType(size_t index) { dvander@12: assert(index < nlocals()); dvander@12: return Type::cast(args()->at(index)); dvander@12: } dvander@12: unsigned nlocals() { dvander@12: return locals()->length(); dvander@12: } dvander@12: unsigned nargs() { dvander@12: return args()->length(); dvander@12: } dvander@12: unsigned maxStackDepth() { dvander@12: return READ_FIELD(maxStackDepth); dvander@12: } dvander@12: Map *map(size_t index) { dvander@12: return Map::cast(maps()->at(index)); dvander@0: } dvander@0: dvander@12: static Code *cast(Object *obj) { dvander@12: assert(obj->is(MapKind_Code)); dvander@12: return reinterpret_cast(obj); dvander@0: } dvander@0: }; dvander@0: dvander@0: } dvander@0: dvander@0: #endif // _include_jc_code_h_