jitcraft/Heap-inl.h
author David Anderson <dvander@alliedmods.net>
Sat Jul 07 21:30:23 2012 -0700 (2012-07-07)
changeset 59 b7d61ddb3c8d
parent 52 22b67b4cf067
child 69 dfce0539a77d
permissions -rw-r--r--
Rename jc:: to ke::
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
{
dvander@11
    30
    uintptr_t untagged = reinterpret_cast<uintptr_t>(address);
dvander@11
    31
    assert(IsAligned(untagged, kObjectAlignment));
dvander@11
    32
dvander@12
    33
    Object *obj = reinterpret_cast<Object *>(address);
dvander@11
    34
    obj->init(map);
dvander@11
    35
    return obj;
dvander@28
    36
}
dvander@28
    37
dvander@12
    38
inline Address
dvander@11
    39
Heap::newObject(size_t bytes, Tenure age)
dvander@11
    40
{
dvander@49
    41
    if (bytes >= HeapChunk::kLargeObjectThreshold)
dvander@11
    42
        return newLargeObject(bytes);
dvander@11
    43
dvander@12
    44
    if (age == Tenure_Stack) {
dvander@12
    45
        if (Address addr = newStackObject(bytes))
dvander@12
    46
            return addr;
dvander@12
    47
    }
dvander@12
    48
dvander@11
    49
#if 0
dvander@11
    50
    if (age == Tenure_Default) {
dvander@11
    51
        if (Address addr = newSpace_.allocate(bytes))
dvander@11
    52
            return addr;
dvander@11
    53
dvander@11
    54
        scavenge();
dvander@11
    55
        if (Address addr = newSpace_.allocate(bytes))
dvander@11
    56
            return addr;
dvander@11
    57
    }
dvander@11
    58
#endif
dvander@11
    59
dvander@11
    60
    // Try an old-space allocation.
dvander@11
    61
    if (Address addr = newOldObject(bytes))
dvander@11
    62
        return addr;
dvander@11
    63
dvander@49
    64
    // Uh-oh - perform a last-ditch collection.
dvander@49
    65
    reclaim();
dvander@11
    66
dvander@11
    67
    return newOldObject(bytes);
dvander@11
    68
}
dvander@11
    69
dvander@12
    70
inline Object *
dvander@27
    71
Heap::allocate(Handle<Map> map, size_t bytes, Tenure age)
dvander@27
    72
{
dvander@27
    73
    size_t actualBytes = Align(bytes, kObjectAlignment);
dvander@52
    74
dvander@52
    75
    // All objects must be at least two words.
dvander@52
    76
    assert(actualBytes >= sizeof(Object *) * 2);
dvander@52
    77
dvander@27
    78
    Address address = newObject(actualBytes, age);
dvander@27
    79
    if (!address) {
dvander@27
    80
        assert(false);
dvander@27
    81
        return NULL;
dvander@27
    82
    }
dvander@27
    83
    return InitAddressIntoObject(address, map);
dvander@28
    84
}
dvander@28
    85
dvander@28
    86
inline Address
dvander@28
    87
Heap::newStackObject(size_t bytes)
dvander@28
    88
{
dvander@28
    89
    return lifoSpace_.allocate(bytes);
dvander@28
    90
}
dvander@28
    91
dvander@49
    92
inline Address
dvander@49
    93
Heap::newOldObject(size_t bytes)
dvander@49
    94
{
dvander@49
    95
    return oldSpace_.allocate(bytes);
dvander@49
    96
}
dvander@49
    97
dvander@49
    98
inline Address
dvander@49
    99
Heap::newLargeObject(size_t bytes)
dvander@49
   100
{
dvander@50
   101
    if (Address address = largeSpace_.allocate(bytes))
dvander@50
   102
        return address;
dvander@50
   103
dvander@50
   104
    reclaim();
dvander@50
   105
dvander@49
   106
    return largeSpace_.allocate(bytes);
dvander@49
   107
}
dvander@11
   108
dvander@12
   109
inline void
dvander@12
   110
Object::write(Zone *zone, Object **ptr, Object *obj)
dvander@11
   111
{
dvander@13
   112
    *ptr = obj;
dvander@11
   113
}
dvander@28
   114
dvander@28
   115
}
dvander@28
   116
dvander@28
   117
#endif // _include_jitcraft_heap_inl_h_
dvander@28
   118