dvander@47: /* vim: set ts=4 sw=4 tw=99 et: dvander@47: * 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@59: namespace ke { dvander@0: dvander@0: class Module; dvander@0: class Type; dvander@0: dvander@13: // A code object contains the bytecode compiled from a function (or global dvander@13: // script), as well as all information needed to interpret or JIT-compile dvander@13: // the bytecode. dvander@12: class Code : public Object dvander@0: { dvander@34: Barriered module_; dvander@34: Barriered bytecode_; dvander@34: Barriered locals_; dvander@34: Barriered objects_; dvander@195: Barriered strings_; dvander@47: Barriered safepoints_; dvander@70: Barriered sourcemap_; dvander@13: unsigned maxStackDepth_; dvander@70: unsigned lineNumber_; dvander@0: dvander@0: public: dvander@47: static inline size_t BytesPerSafepoint(size_t stackDepth) { dvander@47: return (Align(stackDepth, 8) / 8) + sizeof(unsigned); dvander@47: } dvander@47: dvander@47: public: dvander@34: static Code *New(Zone *zone, Handle bytecode, Handle locals, dvander@195: Handle objects, Handle strings, unsigned maxStackDepth, dvander@195: Handle safepoints, Handle sourcemap); dvander@12: dvander@12: Module *module() { dvander@13: return module_; dvander@12: } dvander@12: bytecode *start() { dvander@13: return bytecode_->raw(); dvander@12: } dvander@12: unsigned length() { dvander@13: return bytecode_->length(); dvander@12: } dvander@12: Type *localType(size_t index) { dvander@13: return Type::cast(locals_->at(index)); dvander@12: } dvander@12: unsigned nlocals() { dvander@85: return locals_ ? locals_->length() : 0; dvander@12: } dvander@12: unsigned maxStackDepth() { dvander@13: return maxStackDepth_; dvander@12: } dvander@12: Map *map(size_t index) { dvander@21: return Map::cast(objects_->at(index)); dvander@21: } dvander@21: Object *object(size_t index) { dvander@21: return objects_->at(index); dvander@0: } dvander@47: ByteArray *safepoints() { dvander@47: return safepoints_; dvander@47: } dvander@195: FixedArray *strings() { dvander@195: return strings_; dvander@195: } dvander@47: uint8 *safepointAt(unsigned pcOffset); dvander@47: dvander@195: void setModule(Handle module) { dvander@195: module_ = module; dvander@195: } dvander@195: dvander@47: unsigned pcToOffset(bytecode *pc) { dvander@47: assert(pc >= start() && pc < start() + length()); dvander@86: return unsigned(pc - start()); dvander@47: } dvander@0: dvander@70: SourcePosition pcToSource(unsigned pc); dvander@70: unsigned lineNumber() { dvander@70: return lineNumber_; dvander@70: } dvander@70: dvander@44: // GC Descriptor. dvander@44: static inline size_t offsetOfModule() { danderson@91: return OFFSETOF(Code, module_); dvander@44: } dvander@44: static inline size_t offsetOfBytecode() { danderson@91: return OFFSETOF(Code, bytecode_); dvander@44: } dvander@44: static inline size_t offsetOfLocals() { danderson@91: return OFFSETOF(Code, locals_); dvander@44: } dvander@44: static inline size_t offsetOfObjects() { danderson@91: return OFFSETOF(Code, objects_); dvander@44: } dvander@195: static inline size_t offsetOfStrings() { dvander@195: return OFFSETOF(Code, strings_); dvander@195: } dvander@53: static inline size_t offsetOfSafepoints() { danderson@91: return OFFSETOF(Code, safepoints_); dvander@53: } dvander@70: static inline size_t offsetOfSourceMap() { danderson@91: return OFFSETOF(Code, sourcemap_); dvander@70: } dvander@44: // End GC Descriptor. dvander@44: dvander@12: static Code *cast(Object *obj) { dvander@14: assert(!obj || 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_