dvander@49: /* vim: set ts=4 sw=4 tw=99 et: dvander@49: * dvander@28: * Copyright (C) 2012 David Anderson dvander@28: * dvander@28: * This file is part of JITCraft. dvander@28: * dvander@28: * JITCraft is free software: you can redistribute it and/or modify it under dvander@28: * the terms of the GNU General Public License as published by the Free dvander@28: * Software Foundation, either version 3 of the License, or (at your option) dvander@28: * any later version. dvander@28: * dvander@28: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@28: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@28: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@28: * dvander@28: * You should have received a copy of the GNU General Public License along with dvander@28: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@28: */ dvander@28: #ifndef _include_jitcraft_heap_inl_h_ dvander@28: #define _include_jitcraft_heap_inl_h_ dvander@28: dvander@28: #include "Heap.h" dvander@28: #include "Spaces-inl.h" dvander@28: dvander@59: namespace ke { dvander@28: dvander@11: static inline Object * dvander@11: InitAddressIntoObject(Address address, Map *map) dvander@11: { danderson@93: #ifndef NDEBUG dvander@11: uintptr_t untagged = reinterpret_cast(address); dvander@11: assert(IsAligned(untagged, kObjectAlignment)); danderson@93: #endif dvander@11: dvander@12: Object *obj = reinterpret_cast(address); dvander@11: obj->init(map); dvander@11: return obj; dvander@28: } dvander@28: dvander@12: inline Address dvander@11: Heap::newObject(size_t bytes, Tenure age) dvander@11: { dvander@49: if (bytes >= HeapChunk::kLargeObjectThreshold) dvander@11: return newLargeObject(bytes); dvander@11: dvander@12: if (age == Tenure_Stack) { dvander@12: if (Address addr = newStackObject(bytes)) dvander@12: return addr; dvander@12: } dvander@12: dvander@11: #if 0 dvander@11: if (age == Tenure_Default) { dvander@11: if (Address addr = newSpace_.allocate(bytes)) dvander@11: return addr; dvander@11: dvander@11: scavenge(); dvander@11: if (Address addr = newSpace_.allocate(bytes)) dvander@11: return addr; dvander@11: } dvander@11: #endif dvander@11: dvander@11: // Try an old-space allocation. dvander@11: if (Address addr = newOldObject(bytes)) dvander@11: return addr; dvander@11: dvander@49: // Uh-oh - perform a last-ditch collection. dvander@49: reclaim(); dvander@11: dvander@11: return newOldObject(bytes); dvander@11: } dvander@11: dvander@12: inline Object * dvander@27: Heap::allocate(Handle map, size_t bytes, Tenure age) dvander@27: { dvander@27: size_t actualBytes = Align(bytes, kObjectAlignment); dvander@52: dvander@52: // All objects must be at least two words. dvander@256: assert(actualBytes >= kMinObjectSize); dvander@52: dvander@27: Address address = newObject(actualBytes, age); dvander@27: if (!address) { dvander@69: reportOutOfMemory(); dvander@27: return NULL; dvander@27: } dvander@27: return InitAddressIntoObject(address, map); dvander@28: } dvander@28: dvander@28: inline Address dvander@28: Heap::newStackObject(size_t bytes) dvander@28: { dvander@28: return lifoSpace_.allocate(bytes); dvander@28: } dvander@28: dvander@49: inline Address dvander@49: Heap::newOldObject(size_t bytes) dvander@49: { dvander@49: return oldSpace_.allocate(bytes); dvander@49: } dvander@49: dvander@49: inline Address dvander@49: Heap::newLargeObject(size_t bytes) dvander@49: { dvander@50: if (Address address = largeSpace_.allocate(bytes)) dvander@50: return address; dvander@50: dvander@50: reclaim(); dvander@50: dvander@49: return largeSpace_.allocate(bytes); dvander@49: } dvander@11: dvander@12: inline void dvander@12: Object::write(Zone *zone, Object **ptr, Object *obj) dvander@11: { dvander@13: *ptr = obj; dvander@11: } dvander@28: dvander@28: } dvander@28: dvander@28: #endif // _include_jitcraft_heap_inl_h_ dvander@28: