src/Heap-inl.h
author David Anderson <dvander@alliedmods.net>
Sun Sep 16 21:59:26 2012 -0700 (2012-09-16)
changeset 190 dd04fce774cd
parent 93 23189d937087
child 256 3c184218462d
permissions -rw-r--r--
Enable dynamic array declarations.
dvander@49
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@49
     2
 *
dvander@28
     3
 * Copyright (C) 2012 David Anderson
dvander@28
     4
 *
dvander@28
     5
 * This file is part of JITCraft.
dvander@28
     6
 *
dvander@28
     7
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@28
     8
 * the terms of the GNU General Public License as published by the Free
dvander@28
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@28
    10
 * any later version.
dvander@28
    11
 * 
dvander@28
    12
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@28
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@28
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@28
    15
 *
dvander@28
    16
 * You should have received a copy of the GNU General Public License along with
dvander@28
    17
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@28
    18
 */
dvander@28
    19
#ifndef _include_jitcraft_heap_inl_h_
dvander@28
    20
#define _include_jitcraft_heap_inl_h_
dvander@28
    21
dvander@28
    22
#include "Heap.h"
dvander@28
    23
#include "Spaces-inl.h"
dvander@28
    24
dvander@59
    25
namespace ke {
dvander@28
    26
dvander@11
    27
static inline Object *
dvander@11
    28
InitAddressIntoObject(Address address, Map *map)
dvander@11
    29
{
danderson@93
    30
#ifndef NDEBUG
dvander@11
    31
    uintptr_t untagged = reinterpret_cast<uintptr_t>(address);
dvander@11
    32
    assert(IsAligned(untagged, kObjectAlignment));
danderson@93
    33
#endif
dvander@11
    34
dvander@12
    35
    Object *obj = reinterpret_cast<Object *>(address);
dvander@11
    36
    obj->init(map);
dvander@11
    37
    return obj;
dvander@28
    38
}
dvander@28
    39
dvander@12
    40
inline Address
dvander@11
    41
Heap::newObject(size_t bytes, Tenure age)
dvander@11
    42
{
dvander@49
    43
    if (bytes >= HeapChunk::kLargeObjectThreshold)
dvander@11
    44
        return newLargeObject(bytes);
dvander@11
    45
dvander@12
    46
    if (age == Tenure_Stack) {
dvander@12
    47
        if (Address addr = newStackObject(bytes))
dvander@12
    48
            return addr;
dvander@12
    49
    }
dvander@12
    50
dvander@11
    51
#if 0
dvander@11
    52
    if (age == Tenure_Default) {
dvander@11
    53
        if (Address addr = newSpace_.allocate(bytes))
dvander@11
    54
            return addr;
dvander@11
    55
dvander@11
    56
        scavenge();
dvander@11
    57
        if (Address addr = newSpace_.allocate(bytes))
dvander@11
    58
            return addr;
dvander@11
    59
    }
dvander@11
    60
#endif
dvander@11
    61
dvander@11
    62
    // Try an old-space allocation.
dvander@11
    63
    if (Address addr = newOldObject(bytes))
dvander@11
    64
        return addr;
dvander@11
    65
dvander@49
    66
    // Uh-oh - perform a last-ditch collection.
dvander@49
    67
    reclaim();
dvander@11
    68
dvander@11
    69
    return newOldObject(bytes);
dvander@11
    70
}
dvander@11
    71
dvander@12
    72
inline Object *
dvander@27
    73
Heap::allocate(Handle<Map> map, size_t bytes, Tenure age)
dvander@27
    74
{
dvander@27
    75
    size_t actualBytes = Align(bytes, kObjectAlignment);
dvander@52
    76
dvander@52
    77
    // All objects must be at least two words.
dvander@52
    78
    assert(actualBytes >= sizeof(Object *) * 2);
dvander@52
    79
dvander@27
    80
    Address address = newObject(actualBytes, age);
dvander@27
    81
    if (!address) {
dvander@69
    82
        reportOutOfMemory();
dvander@27
    83
        return NULL;
dvander@27
    84
    }
dvander@27
    85
    return InitAddressIntoObject(address, map);
dvander@28
    86
}
dvander@28
    87
dvander@28
    88
inline Address
dvander@28
    89
Heap::newStackObject(size_t bytes)
dvander@28
    90
{
dvander@28
    91
    return lifoSpace_.allocate(bytes);
dvander@28
    92
}
dvander@28
    93
dvander@49
    94
inline Address
dvander@49
    95
Heap::newOldObject(size_t bytes)
dvander@49
    96
{
dvander@49
    97
    return oldSpace_.allocate(bytes);
dvander@49
    98
}
dvander@49
    99
dvander@49
   100
inline Address
dvander@49
   101
Heap::newLargeObject(size_t bytes)
dvander@49
   102
{
dvander@50
   103
    if (Address address = largeSpace_.allocate(bytes))
dvander@50
   104
        return address;
dvander@50
   105
dvander@50
   106
    reclaim();
dvander@50
   107
dvander@49
   108
    return largeSpace_.allocate(bytes);
dvander@49
   109
}
dvander@11
   110
dvander@12
   111
inline void
dvander@12
   112
Object::write(Zone *zone, Object **ptr, Object *obj)
dvander@11
   113
{
dvander@13
   114
    *ptr = obj;
dvander@11
   115
}
dvander@28
   116
dvander@28
   117
}
dvander@28
   118
dvander@28
   119
#endif // _include_jitcraft_heap_inl_h_
dvander@28
   120