asherkin@263: /* vim: set ts=4 sw=4 tw=99 et: asherkin@263: * asherkin@263: * Copyright (C) 2012 David Anderson asherkin@263: * asherkin@263: * This file is part of SourcePawn. asherkin@263: * asherkin@263: * SourcePawn is free software: you can redistribute it and/or modify it under asherkin@263: * the terms of the GNU General Public License as published by the Free asherkin@263: * Software Foundation, either version 3 of the License, or (at your option) asherkin@263: * any later version. asherkin@263: * asherkin@263: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY asherkin@263: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS asherkin@263: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. asherkin@263: * asherkin@263: * You should have received a copy of the GNU General Public License along with asherkin@263: * SourcePawn. If not, see http://www.gnu.org/licenses/. asherkin@263: */ asherkin@263: #ifndef _include_jitcraft_fixedarray_h_ asherkin@263: #define _include_jitcraft_fixedarray_h_ asherkin@263: asherkin@263: #include "Heap.h" asherkin@263: asherkin@263: namespace ke { asherkin@263: asherkin@263: // A fixed-length array that contains Object * slots. asherkin@263: class FixedArray : public Object asherkin@263: { asherkin@263: uint32 length_; asherkin@263: asherkin@263: private: asherkin@263: Object **vec() { asherkin@263: return reinterpret_cast(this + 1); asherkin@263: } asherkin@263: asherkin@263: public: asherkin@263: static FixedArray *New(Zone *zone, unsigned length, Heap::Tenure tenure); asherkin@263: asherkin@263: unsigned length() { asherkin@263: return length_; asherkin@263: } asherkin@263: Object *at(size_t i) { asherkin@263: assert(i < length()); asherkin@263: return vec()[i]; asherkin@263: } asherkin@263: void set(Zone *zone, size_t i, Object *obj) { asherkin@263: assert(i < length()); asherkin@263: write(zone, &vec()[i], obj); asherkin@263: } asherkin@263: size_t objSize() { asherkin@263: return SizeFor(length()); asherkin@263: } asherkin@263: asherkin@263: static inline size_t SizeFor(unsigned length) { asherkin@263: return sizeof(FixedArray) + sizeof(Object *) * length; asherkin@263: } asherkin@263: asherkin@263: static inline FixedArray *cast(Object *obj) { asherkin@263: assert(!obj || obj->is(MapKind_FixedArray)); asherkin@263: return reinterpret_cast(obj); asherkin@263: } asherkin@263: }; asherkin@263: asherkin@263: // A fixed-length array containing raw bytes. asherkin@263: class ByteArray : public Object asherkin@263: { asherkin@263: uint32 length_; asherkin@263: asherkin@263: public: asherkin@263: static ByteArray *New(Zone *zone, unsigned length, Heap::Tenure tenure = Heap::Tenure_Default); asherkin@263: static ByteArray *New(Zone *zone, Handle map, unsigned length, Heap::Tenure tenure = Heap::Tenure_Default); asherkin@263: asherkin@263: unsigned length() { asherkin@263: return length_; asherkin@263: } asherkin@263: Address raw() { asherkin@263: return Address(this) + offsetToElements(); asherkin@263: } asherkin@263: size_t objSize() { asherkin@263: return SizeFor(length()); asherkin@263: } asherkin@263: asherkin@263: static inline size_t offsetToElements() { asherkin@263: return sizeof(ByteArray); asherkin@263: } asherkin@263: asherkin@263: static inline size_t SizeFor(unsigned length) { asherkin@263: return sizeof(ByteArray) + sizeof(uint8) * length; asherkin@263: } asherkin@263: asherkin@263: static inline ByteArray *cast(Object *obj) { asherkin@263: assert(!obj || obj->is(MapKind_ByteArray)); asherkin@263: return reinterpret_cast(obj); asherkin@263: } asherkin@263: }; asherkin@263: asherkin@263: } asherkin@263: asherkin@263: #endif // _include_jitcraft_fixedarray_h_