dvander@12: /* dvander@12: * Copyright (C) 2012 David Anderson dvander@12: * dvander@12: * This file is part of JITCraft. dvander@12: * dvander@12: * JITCraft is free software: you can redistribute it and/or modify it under dvander@12: * the terms of the GNU General Public License as published by the Free dvander@12: * Software Foundation, either version 3 of the License, or (at your option) dvander@12: * any later version. dvander@12: * dvander@12: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@12: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@12: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@12: * dvander@12: * You should have received a copy of the GNU General Public License along with dvander@12: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@12: */ dvander@12: #include "Array.h" dvander@12: #include "Heap.h" dvander@12: #include "Zone.h" dvander@12: #include "Heap-inl.h" dvander@12: dvander@59: using namespace ke; dvander@12: dvander@12: ArrayMap * dvander@27: ArrayMap::New(Zone *zone, Handle type, Handle contained) dvander@12: { dvander@31: Local obj(zone, zone->allocateMap(MapKind_Array, sizeof(ArrayMap), MapKind_MetaArray)); dvander@12: if (!obj) dvander@12: return NULL; dvander@12: dvander@31: Local map(zone, ArrayMap::cast(obj)); dvander@13: map->type_ = type; dvander@13: map->contained_ = contained; dvander@12: return map; dvander@12: } dvander@12: dvander@12: static inline size_t dvander@12: SizeFor(Type *type, unsigned elements) dvander@12: { dvander@12: if (type->levels() > 1) dvander@59: return sizeof(Array) + elements * sizeof(ke::Object *); dvander@20: if (type->contained()->isInt32()) dvander@12: return sizeof(Array) + elements * sizeof(int); dvander@21: if (type->contained()->primitive() == PrimitiveType_Char) dvander@21: return sizeof(Array) + elements * sizeof(char); dvander@12: assert(type->contained()->isFloat()); dvander@53: return elements * sizeof(float); dvander@12: } dvander@12: dvander@12: Array * dvander@27: Array::New(Zone *zone, Handle map, uint32 elements, Heap::Tenure tenure) dvander@12: { dvander@53: size_t elementBytes = SizeFor(map->type(), elements); dvander@53: size_t bytes = sizeof(Array) + elementBytes; dvander@31: Local array(zone, Array::cast(zone->allocate(map, bytes, tenure))); dvander@31: if (!array) dvander@12: return NULL; dvander@12: dvander@13: array->nelements_ = elements; dvander@66: array->elements_ = (Array *)array + 1; dvander@53: memset(array->elements_, 0, elementBytes); dvander@31: return array; dvander@12: } dvander@31: dvander@65: Array * dvander@65: Array::NewExternal(Zone *zone, Handle map, uint32 nelements, void *buffer, dvander@65: Heap::Tenure tenure) dvander@65: { dvander@65: Local array(zone, Array::cast(zone->allocate(map, sizeof(Array), tenure))); dvander@65: if (!array) dvander@65: return NULL; dvander@65: dvander@65: array->nelements_ = nelements; dvander@65: array->elements_ = buffer; dvander@65: return array; dvander@65: }