jitcraft/Spaces.cpp
author David Anderson <dvander@alliedmods.net>
Mon Jul 02 01:24:57 2012 -0700 (2012-07-02)
changeset 25 23e8b3d8e4e6
parent 12 75e385f68b7e
child 49 a92afa7484fd
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
#include "Spaces.h"
dvander@11
    19
#include "Platform.h"
dvander@11
    20
#include "Spaces-inl.h"
dvander@11
    21
dvander@11
    22
using namespace jc;
dvander@11
    23
dvander@12
    24
HeapStack::HeapStack()
dvander@12
    25
  : buffer_(NULL),
dvander@12
    26
    pos_(NULL),
dvander@12
    27
    end_(NULL)
dvander@12
    28
{
dvander@12
    29
}
dvander@12
    30
dvander@12
    31
HeapStack::~HeapStack()
dvander@12
    32
{
dvander@12
    33
    if (buffer_)
dvander@12
    34
        OS::UnmapAlignedMemory(map_.base(), map_.size());
dvander@12
    35
}
dvander@12
    36
dvander@12
    37
bool
dvander@12
    38
HeapStack::initialize()
dvander@12
    39
{
dvander@12
    40
    map_ = OS::MapAlignedMemory(kStackSize, kStackSize, OS::Map_Commit);
dvander@12
    41
    if (!map_.base())
dvander@12
    42
        return false;
dvander@12
    43
dvander@12
    44
    buffer_ = map_.aligned();
dvander@12
    45
    pos_ = buffer_;
dvander@12
    46
    end_ = buffer_ + kStackSize;
dvander@12
    47
    return true;
dvander@12
    48
}
dvander@12
    49
dvander@11
    50
HeapChunk *
dvander@11
    51
HeapChunk::New(HeapChunk *prev, size_t size)
dvander@11
    52
{
dvander@11
    53
    OS::AlignableMapping map = 
dvander@11
    54
        OS::MapAlignedMemory(size, HeapChunk::kAlignment, OS::Map_Commit);
dvander@11
    55
dvander@11
    56
    if (!map.base())
dvander@11
    57
        return NULL;
dvander@11
    58
dvander@11
    59
    HeapChunk *chunk = reinterpret_cast<HeapChunk *>(map.aligned());
dvander@11
    60
    chunk->base_ = map.base();
dvander@11
    61
    chunk->end_ = map.base() + map.size();
dvander@11
    62
    chunk->cursor_ = chunk->first();
dvander@11
    63
    if (prev)
dvander@11
    64
        prev->next_ = chunk;
dvander@11
    65
dvander@11
    66
    return chunk;
dvander@11
    67
}
dvander@11
    68
dvander@11
    69
void
dvander@11
    70
HeapChunk::Destroy(HeapChunk *chunk)
dvander@11
    71
{
dvander@11
    72
    OS::UnmapAlignedMemory(chunk->base(), chunk->size());
dvander@11
    73
}
dvander@11
    74
dvander@11
    75
OldSpace::OldSpace()
dvander@11
    76
  : first_(NULL),
dvander@11
    77
    last_(NULL)
dvander@11
    78
{
dvander@11
    79
}
dvander@11
    80
dvander@11
    81
bool
dvander@11
    82
OldSpace::initialize()
dvander@11
    83
{
dvander@11
    84
    first_ = HeapChunk::New(first_, HeapChunk::kDefaultSize);
dvander@11
    85
    last_ = first_;
dvander@11
    86
dvander@11
    87
    return !!first_;
dvander@11
    88
}
dvander@11
    89
dvander@11
    90
Address
dvander@11
    91
OldSpace::allocateSlow(size_t nbytes)
dvander@11
    92
{
dvander@11
    93
    HeapChunk *chunk = HeapChunk::New(last_, HeapChunk::kDefaultSize);
dvander@11
    94
    if (!chunk)
dvander@11
    95
        return NULL;
dvander@11
    96
dvander@11
    97
    return chunk->allocate(nbytes);
dvander@11
    98
}
dvander@11
    99
dvander@11
   100
OldSpace::~OldSpace()
dvander@11
   101
{
dvander@11
   102
    while (first_) {
dvander@11
   103
        HeapChunk *temp = first_->next();
dvander@11
   104
        HeapChunk::Destroy(first_);
dvander@11
   105
        first_ = temp;
dvander@11
   106
    }
dvander@11
   107
}
dvander@11
   108