jitcraft/Zone.cpp
author David Anderson <dvander@alliedmods.net>
Sat Jul 07 20:28:29 2012 -0700 (2012-07-07)
changeset 54 8e22792a3921
parent 53 13bd3a8df334
child 59 b7d61ddb3c8d
permissions -rw-r--r--
Convert Name and StringPool to a GC-safe symbol table.
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@54
    22
#include "AllocatorPolicies.h"
dvander@0
    23
dvander@0
    24
using namespace jc;
dvander@0
    25
dvander@0
    26
Zone jc::SingleThreadedZone;
dvander@0
    27
dvander@11
    28
Zone::Zone()
dvander@11
    29
  : heap_(this),
dvander@51
    30
    types_(NULL),
dvander@51
    31
    lastLocalRoot_(NULL)
dvander@11
    32
{
dvander@11
    33
}
dvander@11
    34
dvander@54
    35
Zone::~Zone()
dvander@54
    36
{
dvander@54
    37
    delete symbols_;
dvander@54
    38
    delete types_;
dvander@54
    39
}
dvander@54
    40
dvander@0
    41
bool
dvander@0
    42
Zone::initialize()
dvander@0
    43
{
dvander@0
    44
    if (!stack_.initialize())
dvander@0
    45
        return false;
dvander@11
    46
    if (!heap_.initialize())
dvander@11
    47
        return false;
dvander@11
    48
dvander@54
    49
    symbols_ = new StringPool(this);
dvander@54
    50
    if (!symbols_ || !symbols_->initialize())
dvander@54
    51
        return false;
dvander@54
    52
dvander@11
    53
    maps_[MapKind_Meta] = heap_.metaMap();
dvander@12
    54
    if ((maps_[MapKind_Type] = allocateMap(MapKind_Type, sizeof(Map))) == NULL)
dvander@12
    55
        return false;
dvander@12
    56
    if ((maps_[MapKind_FixedArray] = allocateMap(MapKind_FixedArray, sizeof(Map))) == NULL)
dvander@12
    57
        return false;
dvander@12
    58
    if ((maps_[MapKind_ByteArray] = allocateMap(MapKind_ByteArray, sizeof(Map))) == NULL)
dvander@12
    59
        return false;
dvander@12
    60
    if ((maps_[MapKind_Code] = allocateMap(MapKind_Code, sizeof(Map))) == NULL)
dvander@12
    61
        return false;
dvander@14
    62
    if ((maps_[MapKind_Reference] = allocateMap(MapKind_Reference, sizeof(Map))) == NULL)
dvander@14
    63
        return false;
dvander@12
    64
    if ((maps_[MapKind_MetaArray] = allocateMap(MapKind_MetaArray, sizeof(Map))) == NULL)
dvander@11
    65
        return false;
dvander@14
    66
    if ((maps_[MapKind_Module] = allocateMap(MapKind_Module, sizeof(Map))) == NULL)
dvander@14
    67
        return false;
dvander@26
    68
    if ((maps_[MapKind_Function] = allocateMap(MapKind_Function, sizeof(Map))) == NULL)
dvander@26
    69
        return false;
dvander@54
    70
    if ((maps_[MapKind_String] = allocateMap(MapKind_String, sizeof(Map))) == NULL)
dvander@54
    71
        return false;
dvander@53
    72
    if ((maps_[MapKind_FreeRegion] = allocateMap(MapKind_FreeRegion, sizeof(Map))) == NULL)
dvander@53
    73
        return false;
dvander@11
    74
dvander@11
    75
    types_ = new TypeManager(this);
dvander@11
    76
    if (!types_ || !types_->initialize())
dvander@11
    77
        return false;
dvander@11
    78
dvander@0
    79
    return true;
dvander@0
    80
}
dvander@12
    81
dvander@12
    82
Map *
dvander@12
    83
Zone::allocateMap(MapKind kind, size_t bytes, MapKind parent)
dvander@12
    84
{
dvander@12
    85
    assert(maps_[parent]);
dvander@12
    86
    Map *map = heap_.allocateMap(kind, bytes);
dvander@12
    87
    if (!map)
dvander@12
    88
        return NULL;
dvander@12
    89
    map->init(maps_[parent]);
dvander@12
    90
    return map;
dvander@12
    91
}
dvander@45
    92
dvander@45
    93
void
dvander@45
    94
Zone::accept(VirtualObjectVisitor *visitor)
dvander@45
    95
{
dvander@45
    96
    for (unsigned i = 0; i < MapKinds_Total; i++)
dvander@45
    97
        visitor->visit(maps_[i].address());
dvander@45
    98
    types()->accept(visitor);
dvander@45
    99
dvander@45
   100
    Local<Object> *local = lastLocalRoot_;
dvander@45
   101
    while (local) {
dvander@45
   102
        visitor->visit(local->address());
dvander@45
   103
        local = local->prev();
dvander@45
   104
    }
dvander@45
   105
dvander@45
   106
    rootScopes_.accept(visitor);
dvander@51
   107
dvander@51
   108
    stack_.accept(visitor);
dvander@45
   109
}
dvander@45
   110
dvander@54
   111
String *
dvander@54
   112
Zone::makeSymbol(const char *str, size_t length)
dvander@54
   113
{
dvander@54
   114
    return symbols_->add(str, length);
dvander@54
   115
}
dvander@54
   116
dvander@54
   117
String *
dvander@54
   118
Zone::makeSymbol(const char *str)
dvander@54
   119
{
dvander@54
   120
    return makeSymbol(str, strlen(str));
dvander@54
   121
}
dvander@54
   122
dvander@54
   123
void
dvander@54
   124
ZoneAllocatorPolicy::reportOutOfMemory()
dvander@54
   125
{
dvander@54
   126
    // :TODO: report
dvander@54
   127
    assert(false);
dvander@54
   128
}
dvander@54
   129
dvander@54
   130
void
dvander@54
   131
ZoneAllocatorPolicy::reportAllocationOverflow()
dvander@54
   132
{
dvander@54
   133
    // :TODO: report
dvander@54
   134
    assert(false);
dvander@54
   135
}