dvander@11: /* dvander@11: * Copyright (C) 2012 David Anderson dvander@11: * dvander@11: * This file is part of JITCraft. dvander@11: * dvander@11: * JITCraft is free software: you can redistribute it and/or modify it under dvander@11: * the terms of the GNU General Public License as published by the Free dvander@11: * Software Foundation, either version 3 of the License, or (at your option) dvander@11: * any later version. dvander@11: * dvander@11: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@11: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@11: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@11: * dvander@11: * You should have received a copy of the GNU General Public License along with dvander@11: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@11: */ dvander@11: #ifndef _include_jitcraft_heap_inl_h_ dvander@11: #define _include_jitcraft_heap_inl_h_ dvander@11: dvander@11: #include "Heap.h" dvander@12: #include "Spaces-inl.h" dvander@11: dvander@11: namespace jc { dvander@11: dvander@11: static inline Object * dvander@11: InitAddressIntoObject(Address address, Map *map) dvander@11: { dvander@11: uintptr_t untagged = reinterpret_cast(address); dvander@11: assert(IsAligned(untagged, kObjectAlignment)); dvander@11: dvander@12: Object *obj = reinterpret_cast(address); dvander@11: obj->init(map); dvander@11: return obj; dvander@11: } dvander@11: dvander@12: inline Address dvander@11: Heap::newObject(size_t bytes, Tenure age) dvander@11: { dvander@11: #if 0 dvander@11: if (bytes >= kLargeObjectThreshold) dvander@11: return newLargeObject(bytes); dvander@11: #endif 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@11: // Uh-oh - perform a collection. dvander@11: assert(false); dvander@11: dvander@11: #if 0 dvander@11: return newOldObject(bytes); dvander@11: #endif dvander@11: return NULL; dvander@11: } dvander@11: dvander@12: inline Object * dvander@11: Heap::allocate(Map *map, size_t bytes, Tenure age) dvander@11: { dvander@11: size_t actualBytes = Align(bytes, kObjectAlignment); dvander@11: Address address = newObject(actualBytes, age); dvander@11: if (!address) { dvander@11: assert(false); dvander@11: return NULL; dvander@11: } dvander@11: return InitAddressIntoObject(address, map); dvander@11: } dvander@11: dvander@27: inline Object * dvander@27: Heap::allocate(Handle map, size_t bytes, Tenure age) dvander@27: { dvander@27: size_t actualBytes = Align(bytes, kObjectAlignment); dvander@27: Address address = newObject(actualBytes, age); dvander@27: if (!address) { dvander@27: assert(false); dvander@27: return NULL; dvander@27: } dvander@27: return InitAddressIntoObject(address, map); dvander@27: } dvander@27: dvander@12: inline Address dvander@12: Heap::newStackObject(size_t bytes) dvander@12: { dvander@12: return lifoSpace_.allocate(bytes); dvander@12: } dvander@12: 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@11: dvander@11: } dvander@11: dvander@11: #endif // _include_jitcraft_heap_inl_h_ dvander@11: