src/Spaces-inl.h
author David Anderson <dvander@alliedmods.net>
Sat Nov 17 20:03:57 2012 -0800 (2012-11-17)
changeset 204 ff89b2640fba
parent 91 5f4402180204
permissions -rw-r--r--
Added missing tests.
dvander@49
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@49
     2
 *
dvander@49
     3
 * Copyright (C) 2012 David Anderson
dvander@49
     4
 *
dvander@49
     5
 * This file is part of JITCraft.
dvander@49
     6
 *
dvander@49
     7
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@49
     8
 * the terms of the GNU General Public License as published by the Free
dvander@49
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@49
    10
 * any later version.
dvander@49
    11
 * 
dvander@49
    12
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@49
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@49
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@49
    15
 *
dvander@49
    16
 * You should have received a copy of the GNU General Public License along with
dvander@49
    17
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@49
    18
 */
dvander@49
    19
#ifndef _include_jitcraft_spaces_inl_h_
dvander@49
    20
#define _include_jitcraft_spaces_inl_h_
dvander@49
    21
danderson@91
    22
#include "Objects.h"
danderson@91
    23
dvander@59
    24
namespace ke {
dvander@49
    25
dvander@49
    26
inline Address
dvander@49
    27
HeapStack::allocate(size_t nbytes)
dvander@49
    28
{
dvander@49
    29
    nbytes = Align(nbytes, kObjectAlignment);
dvander@49
    30
dvander@51
    31
    if (cursor_ + nbytes > chunk_->end())
dvander@49
    32
        return NULL;
dvander@49
    33
dvander@51
    34
    Address ptr = cursor_;
dvander@51
    35
    cursor_ += nbytes;
dvander@49
    36
    return ptr;
dvander@49
    37
}
dvander@49
    38
dvander@49
    39
inline void
dvander@49
    40
HeapStack::unwind(Address to)
dvander@49
    41
{
dvander@51
    42
    assert(to <= cursor_ && to >= chunk_->first());
dvander@51
    43
    cursor_ = to;
dvander@11
    44
}
dvander@11
    45
dvander@12
    46
inline Address
dvander@11
    47
OldSpace::allocate(size_t nbytes)
dvander@11
    48
{
dvander@11
    49
    assert(IsAligned(nbytes, kObjectAlignment));
dvander@11
    50
dvander@51
    51
    if (cursor_ + nbytes > last_->end())
dvander@51
    52
        return allocateSlow(nbytes);
dvander@11
    53
dvander@53
    54
    Address addr = cursor_;
dvander@51
    55
    cursor_ += nbytes;
dvander@51
    56
    return addr;
dvander@49
    57
}
dvander@49
    58
danderson@91
    59
template <typename SizeEvaluator> inline Object *
danderson@91
    60
ChunkObjectIteratorBase<SizeEvaluator>::next()
danderson@91
    61
{
danderson@91
    62
    while (current_ && current_ != top_) {
danderson@91
    63
        Object *obj = reinterpret_cast<Object *>(current_);
danderson@91
    64
        size_t size = evaluator_(obj, obj->map());
danderson@91
    65
        current_ += size;
danderson@91
    66
        if (current_ == chunk_->end()) {
danderson@91
    67
            chunk_ = chunk_->next();
danderson@91
    68
            current_ = chunk_ ? chunk_->first() : NULL;
danderson@91
    69
        }
danderson@91
    70
        if (obj->is(MapKind_FreeRegion))
danderson@91
    71
            continue;
danderson@91
    72
    }
danderson@91
    73
    return NULL;
danderson@91
    74
}
danderson@91
    75
dvander@49
    76
}
dvander@49
    77
dvander@49
    78
#endif // _include_jitcraft_spaces_inl_h_