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 dvander@12: #include "FixedArray.h" dvander@12: #include "Zone.h" dvander@28: #include "Heap-inl.h" dvander@12: dvander@59: using namespace ke; dvander@12: dvander@59: static const unsigned kMaxFixedArrayLength = ((INT_MAX - sizeof(FixedArray)) / sizeof(ke::Object *)); dvander@12: dvander@12: FixedArray * dvander@12: FixedArray::New(Zone *zone, unsigned length, Heap::Tenure tenure) dvander@12: { dvander@12: // :TODO: error... dvander@12: if (length >= kMaxFixedArrayLength) { dvander@12: assert(false); dvander@12: return NULL; dvander@12: } dvander@12: dvander@35: Local array(zone, FixedArray::cast(zone->allocate(MapKind_FixedArray, SizeFor(length), tenure))); dvander@35: if (!array) dvander@12: return NULL; dvander@12: dvander@13: array->length_ = length; dvander@53: memset(array->vec(), 0, length * sizeof(Object *)); dvander@12: return array; dvander@12: } dvander@12: dvander@12: ByteArray * dvander@12: ByteArray::New(Zone *zone, unsigned length, Heap::Tenure tenure) dvander@12: { dvander@12: // :TODO: error... dvander@12: if (length >= kMaxFixedArrayLength) { dvander@12: assert(false); dvander@12: return NULL; dvander@12: } dvander@12: dvander@35: Local array(zone, ByteArray::cast(zone->allocate(MapKind_ByteArray, SizeFor(length), tenure))); dvander@35: if (!array) dvander@12: return NULL; dvander@12: dvander@13: array->length_ = length; dvander@53: memset(array->raw(), 0, length); dvander@12: return array; dvander@12: } dvander@12: