jitcraft/Heap-inl.h
author David Anderson <dvander@alliedmods.net>
Mon Jul 02 01:24:57 2012 -0700 (2012-07-02)
changeset 25 23e8b3d8e4e6
parent 13 627b6b94e774
child 27 28697d267222
permissions -rw-r--r--
Scanning, parsing, and static analysis now report errors properly.
dvander@11
     1
/*
dvander@11
     2
 * Copyright (C) 2012 David Anderson
dvander@11
     3
 *
dvander@11
     4
 * This file is part of JITCraft.
dvander@11
     5
 *
dvander@11
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@11
     7
 * the terms of the GNU General Public License as published by the Free
dvander@11
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@11
     9
 * any later version.
dvander@11
    10
 * 
dvander@11
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@11
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@11
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@11
    14
 *
dvander@11
    15
 * You should have received a copy of the GNU General Public License along with
dvander@11
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@11
    17
 */
dvander@11
    18
#ifndef _include_jitcraft_heap_inl_h_
dvander@11
    19
#define _include_jitcraft_heap_inl_h_
dvander@11
    20
dvander@11
    21
#include "Heap.h"
dvander@12
    22
#include "Spaces-inl.h"
dvander@11
    23
dvander@11
    24
namespace jc {
dvander@11
    25
dvander@11
    26
static inline Object *
dvander@11
    27
InitAddressIntoObject(Address address, Map *map)
dvander@11
    28
{
dvander@11
    29
    uintptr_t untagged = reinterpret_cast<uintptr_t>(address);
dvander@11
    30
    assert(IsAligned(untagged, kObjectAlignment));
dvander@11
    31
dvander@12
    32
    Object *obj = reinterpret_cast<Object *>(address);
dvander@11
    33
    obj->init(map);
dvander@11
    34
    return obj;
dvander@11
    35
}
dvander@11
    36
dvander@12
    37
inline Address
dvander@11
    38
Heap::newObject(size_t bytes, Tenure age)
dvander@11
    39
{
dvander@11
    40
#if 0
dvander@11
    41
    if (bytes >= kLargeObjectThreshold)
dvander@11
    42
        return newLargeObject(bytes);
dvander@11
    43
#endif
dvander@11
    44
dvander@12
    45
    if (age == Tenure_Stack) {
dvander@12
    46
        if (Address addr = newStackObject(bytes))
dvander@12
    47
            return addr;
dvander@12
    48
    }
dvander@12
    49
dvander@11
    50
#if 0
dvander@11
    51
    if (age == Tenure_Default) {
dvander@11
    52
        if (Address addr = newSpace_.allocate(bytes))
dvander@11
    53
            return addr;
dvander@11
    54
dvander@11
    55
        scavenge();
dvander@11
    56
        if (Address addr = newSpace_.allocate(bytes))
dvander@11
    57
            return addr;
dvander@11
    58
    }
dvander@11
    59
#endif
dvander@11
    60
dvander@11
    61
    // Try an old-space allocation.
dvander@11
    62
    if (Address addr = newOldObject(bytes))
dvander@11
    63
        return addr;
dvander@11
    64
dvander@11
    65
    // Uh-oh - perform a collection.
dvander@11
    66
    assert(false);
dvander@11
    67
dvander@11
    68
#if 0
dvander@11
    69
    return newOldObject(bytes);
dvander@11
    70
#endif
dvander@11
    71
    return NULL;
dvander@11
    72
}
dvander@11
    73
dvander@12
    74
inline Object *
dvander@11
    75
Heap::allocate(Map *map, size_t bytes, Tenure age)
dvander@11
    76
{
dvander@11
    77
    size_t actualBytes = Align(bytes, kObjectAlignment);
dvander@11
    78
    Address address = newObject(actualBytes, age);
dvander@11
    79
    if (!address) {
dvander@11
    80
        assert(false);
dvander@11
    81
        return NULL;
dvander@11
    82
    }
dvander@11
    83
    return InitAddressIntoObject(address, map);
dvander@11
    84
}
dvander@11
    85
dvander@12
    86
inline Address
dvander@12
    87
Heap::newStackObject(size_t bytes)
dvander@12
    88
{
dvander@12
    89
    return lifoSpace_.allocate(bytes);
dvander@12
    90
}
dvander@12
    91
dvander@11
    92
dvander@12
    93
inline void
dvander@12
    94
Object::write(Zone *zone, Object **ptr, Object *obj)
dvander@11
    95
{
dvander@13
    96
    *ptr = obj;
dvander@11
    97
}
dvander@11
    98
dvander@11
    99
}
dvander@11
   100
dvander@11
   101
#endif // _include_jitcraft_heap_inl_h_
dvander@11
   102