dvander@45: /* vim: set ts=4 sw=4 tw=99 et: dvander@45: * 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: #include "Zone.h" dvander@54: #include "StringPool.h" dvander@11: #include "TypeManager.h" dvander@54: #include "AllocatorPolicies.h" dvander@0: dvander@59: using namespace ke; dvander@0: dvander@60: Zone *ke::SingleThreadedZone; dvander@0: dvander@11: Zone::Zone() dvander@11: : heap_(this), dvander@51: types_(NULL), dvander@51: lastLocalRoot_(NULL) dvander@11: { dvander@11: } dvander@11: dvander@54: Zone::~Zone() dvander@54: { dvander@54: delete symbols_; dvander@54: delete types_; dvander@54: } dvander@54: dvander@0: bool dvander@0: Zone::initialize() dvander@0: { dvander@0: if (!stack_.initialize()) dvander@0: return false; dvander@11: if (!heap_.initialize()) dvander@11: return false; dvander@11: dvander@54: symbols_ = new StringPool(this); dvander@54: if (!symbols_ || !symbols_->initialize()) dvander@54: return false; dvander@54: dvander@11: maps_[MapKind_Meta] = heap_.metaMap(); dvander@12: if ((maps_[MapKind_Type] = allocateMap(MapKind_Type, sizeof(Map))) == NULL) dvander@12: return false; dvander@12: if ((maps_[MapKind_FixedArray] = allocateMap(MapKind_FixedArray, sizeof(Map))) == NULL) dvander@12: return false; dvander@12: if ((maps_[MapKind_ByteArray] = allocateMap(MapKind_ByteArray, sizeof(Map))) == NULL) dvander@12: return false; dvander@12: if ((maps_[MapKind_Code] = allocateMap(MapKind_Code, sizeof(Map))) == NULL) dvander@12: return false; dvander@14: if ((maps_[MapKind_Reference] = allocateMap(MapKind_Reference, sizeof(Map))) == NULL) dvander@14: return false; dvander@12: if ((maps_[MapKind_MetaArray] = allocateMap(MapKind_MetaArray, sizeof(Map))) == NULL) dvander@11: return false; dvander@14: if ((maps_[MapKind_Module] = allocateMap(MapKind_Module, sizeof(Map))) == NULL) dvander@14: return false; dvander@26: if ((maps_[MapKind_Function] = allocateMap(MapKind_Function, sizeof(Map))) == NULL) dvander@26: return false; dvander@54: if ((maps_[MapKind_String] = allocateMap(MapKind_String, sizeof(Map))) == NULL) dvander@54: return false; dvander@53: if ((maps_[MapKind_FreeRegion] = allocateMap(MapKind_FreeRegion, sizeof(Map))) == NULL) dvander@53: return false; dvander@11: dvander@11: types_ = new TypeManager(this); dvander@11: if (!types_ || !types_->initialize()) dvander@11: return false; dvander@11: dvander@0: return true; dvander@0: } dvander@12: dvander@12: Map * dvander@12: Zone::allocateMap(MapKind kind, size_t bytes, MapKind parent) dvander@12: { dvander@12: assert(maps_[parent]); dvander@12: Map *map = heap_.allocateMap(kind, bytes); dvander@12: if (!map) dvander@12: return NULL; dvander@12: map->init(maps_[parent]); dvander@12: return map; dvander@12: } dvander@45: dvander@45: void dvander@45: Zone::accept(VirtualObjectVisitor *visitor) dvander@45: { dvander@45: for (unsigned i = 0; i < MapKinds_Total; i++) dvander@45: visitor->visit(maps_[i].address()); dvander@45: types()->accept(visitor); dvander@45: dvander@45: Local *local = lastLocalRoot_; dvander@45: while (local) { dvander@45: visitor->visit(local->address()); dvander@45: local = local->prev(); dvander@45: } dvander@45: dvander@45: rootScopes_.accept(visitor); dvander@51: dvander@51: stack_.accept(visitor); dvander@45: } dvander@45: dvander@54: String * dvander@54: Zone::makeSymbol(const char *str, size_t length) dvander@54: { dvander@54: return symbols_->add(str, length); dvander@54: } dvander@54: dvander@54: String * dvander@54: Zone::makeSymbol(const char *str) dvander@54: { dvander@54: return makeSymbol(str, strlen(str)); dvander@54: } dvander@54: dvander@54: void dvander@54: ZoneAllocatorPolicy::reportOutOfMemory() dvander@54: { dvander@54: // :TODO: report dvander@54: assert(false); dvander@54: } dvander@54: dvander@54: void dvander@54: ZoneAllocatorPolicy::reportAllocationOverflow() dvander@54: { dvander@54: // :TODO: report dvander@54: assert(false); dvander@54: }