jitcraft/Zone.cpp
author David Anderson <dvander@alliedmods.net>
Sun Jul 08 11:33:12 2012 -0700 (2012-07-08)
changeset 61 864e4b02a4c1
parent 60 581a9c793062
child 65 7c942b5adebc
permissions -rw-r--r--
Added global root API.
dvander@45
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@45
     2
 *
dvander@0
     3
 * Copyright (C) 2012 David Anderson
dvander@0
     4
 *
dvander@0
     5
 * This file is part of JITCraft.
dvander@0
     6
 *
dvander@0
     7
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     8
 * the terms of the GNU General Public License as published by the Free
dvander@0
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
    10
 * any later version.
dvander@0
    11
 * 
dvander@0
    12
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    15
 *
dvander@0
    16
 * You should have received a copy of the GNU General Public License along with
dvander@0
    17
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    18
 */
dvander@0
    19
#include "Zone.h"
dvander@54
    20
#include "StringPool.h"
dvander@11
    21
#include "TypeManager.h"
dvander@61
    22
#include "GlobalRoots.h"
dvander@54
    23
#include "AllocatorPolicies.h"
dvander@0
    24
dvander@59
    25
using namespace ke;
dvander@0
    26
dvander@60
    27
Zone *ke::SingleThreadedZone;
dvander@0
    28
dvander@11
    29
Zone::Zone()
dvander@11
    30
  : heap_(this),
dvander@51
    31
    types_(NULL),
dvander@61
    32
    symbols_(NULL),
dvander@61
    33
    globalRoots_(NULL),
dvander@51
    34
    lastLocalRoot_(NULL)
dvander@11
    35
{
dvander@11
    36
}
dvander@11
    37
dvander@54
    38
Zone::~Zone()
dvander@54
    39
{
dvander@61
    40
    delete types_;
dvander@54
    41
    delete symbols_;
dvander@61
    42
    delete globalRoots_;
dvander@54
    43
}
dvander@54
    44
dvander@0
    45
bool
dvander@0
    46
Zone::initialize()
dvander@0
    47
{
dvander@0
    48
    if (!stack_.initialize())
dvander@0
    49
        return false;
dvander@11
    50
    if (!heap_.initialize())
dvander@11
    51
        return false;
dvander@11
    52
dvander@54
    53
    symbols_ = new StringPool(this);
dvander@54
    54
    if (!symbols_ || !symbols_->initialize())
dvander@54
    55
        return false;
dvander@54
    56
dvander@61
    57
    globalRoots_ = new GlobalRoots(this);
dvander@61
    58
    if (!globalRoots_ || !globalRoots_->initialize())
dvander@61
    59
        return false;
dvander@61
    60
dvander@11
    61
    maps_[MapKind_Meta] = heap_.metaMap();
dvander@12
    62
    if ((maps_[MapKind_Type] = allocateMap(MapKind_Type, sizeof(Map))) == NULL)
dvander@12
    63
        return false;
dvander@12
    64
    if ((maps_[MapKind_FixedArray] = allocateMap(MapKind_FixedArray, sizeof(Map))) == NULL)
dvander@12
    65
        return false;
dvander@12
    66
    if ((maps_[MapKind_ByteArray] = allocateMap(MapKind_ByteArray, sizeof(Map))) == NULL)
dvander@12
    67
        return false;
dvander@12
    68
    if ((maps_[MapKind_Code] = allocateMap(MapKind_Code, sizeof(Map))) == NULL)
dvander@12
    69
        return false;
dvander@14
    70
    if ((maps_[MapKind_Reference] = allocateMap(MapKind_Reference, sizeof(Map))) == NULL)
dvander@14
    71
        return false;
dvander@12
    72
    if ((maps_[MapKind_MetaArray] = allocateMap(MapKind_MetaArray, sizeof(Map))) == NULL)
dvander@11
    73
        return false;
dvander@14
    74
    if ((maps_[MapKind_Module] = allocateMap(MapKind_Module, sizeof(Map))) == NULL)
dvander@14
    75
        return false;
dvander@26
    76
    if ((maps_[MapKind_Function] = allocateMap(MapKind_Function, sizeof(Map))) == NULL)
dvander@26
    77
        return false;
dvander@54
    78
    if ((maps_[MapKind_String] = allocateMap(MapKind_String, sizeof(Map))) == NULL)
dvander@54
    79
        return false;
dvander@53
    80
    if ((maps_[MapKind_FreeRegion] = allocateMap(MapKind_FreeRegion, sizeof(Map))) == NULL)
dvander@53
    81
        return false;
dvander@11
    82
dvander@11
    83
    types_ = new TypeManager(this);
dvander@11
    84
    if (!types_ || !types_->initialize())
dvander@11
    85
        return false;
dvander@11
    86
dvander@0
    87
    return true;
dvander@0
    88
}
dvander@12
    89
dvander@12
    90
Map *
dvander@12
    91
Zone::allocateMap(MapKind kind, size_t bytes, MapKind parent)
dvander@12
    92
{
dvander@12
    93
    assert(maps_[parent]);
dvander@12
    94
    Map *map = heap_.allocateMap(kind, bytes);
dvander@12
    95
    if (!map)
dvander@12
    96
        return NULL;
dvander@12
    97
    map->init(maps_[parent]);
dvander@12
    98
    return map;
dvander@12
    99
}
dvander@45
   100
dvander@45
   101
void
dvander@45
   102
Zone::accept(VirtualObjectVisitor *visitor)
dvander@45
   103
{
dvander@45
   104
    for (unsigned i = 0; i < MapKinds_Total; i++)
dvander@45
   105
        visitor->visit(maps_[i].address());
dvander@45
   106
    types()->accept(visitor);
dvander@45
   107
dvander@45
   108
    Local<Object> *local = lastLocalRoot_;
dvander@45
   109
    while (local) {
dvander@45
   110
        visitor->visit(local->address());
dvander@45
   111
        local = local->prev();
dvander@45
   112
    }
dvander@45
   113
dvander@61
   114
    globalRoots_->accept(visitor);
dvander@45
   115
    rootScopes_.accept(visitor);
dvander@51
   116
dvander@51
   117
    stack_.accept(visitor);
dvander@45
   118
}
dvander@45
   119
dvander@54
   120
String *
dvander@54
   121
Zone::makeSymbol(const char *str, size_t length)
dvander@54
   122
{
dvander@54
   123
    return symbols_->add(str, length);
dvander@54
   124
}
dvander@54
   125
dvander@54
   126
String *
dvander@54
   127
Zone::makeSymbol(const char *str)
dvander@54
   128
{
dvander@54
   129
    return makeSymbol(str, strlen(str));
dvander@54
   130
}
dvander@54
   131
dvander@54
   132
void
dvander@54
   133
ZoneAllocatorPolicy::reportOutOfMemory()
dvander@54
   134
{
dvander@54
   135
    // :TODO: report
dvander@54
   136
    assert(false);
dvander@54
   137
}
dvander@54
   138
dvander@54
   139
void
dvander@54
   140
ZoneAllocatorPolicy::reportAllocationOverflow()
dvander@54
   141
{
dvander@54
   142
    // :TODO: report
dvander@54
   143
    assert(false);
dvander@54
   144
}