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