jitcraft/Zone.cpp
author David Anderson <dvander@alliedmods.net>
Mon Jul 09 22:25:52 2012 -0700 (2012-07-09)
changeset 67 b765a6383849
parent 65 7c942b5adebc
child 68 b40b0e18a918
permissions -rw-r--r--
Implemented const for references and arrays.
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@65
    24
#include "Array.h"
dvander@0
    25
dvander@59
    26
using namespace ke;
dvander@0
    27
dvander@60
    28
Zone *ke::SingleThreadedZone;
dvander@0
    29
dvander@11
    30
Zone::Zone()
dvander@11
    31
  : heap_(this),
dvander@51
    32
    types_(NULL),
dvander@61
    33
    symbols_(NULL),
dvander@61
    34
    globalRoots_(NULL),
dvander@51
    35
    lastLocalRoot_(NULL)
dvander@11
    36
{
dvander@11
    37
}
dvander@11
    38
dvander@54
    39
Zone::~Zone()
dvander@54
    40
{
dvander@61
    41
    delete types_;
dvander@54
    42
    delete symbols_;
dvander@61
    43
    delete globalRoots_;
dvander@54
    44
}
dvander@54
    45
dvander@0
    46
bool
dvander@0
    47
Zone::initialize()
dvander@0
    48
{
dvander@0
    49
    if (!stack_.initialize())
dvander@0
    50
        return false;
dvander@11
    51
    if (!heap_.initialize())
dvander@11
    52
        return false;
dvander@11
    53
dvander@54
    54
    symbols_ = new StringPool(this);
dvander@54
    55
    if (!symbols_ || !symbols_->initialize())
dvander@54
    56
        return false;
dvander@54
    57
dvander@61
    58
    globalRoots_ = new GlobalRoots(this);
dvander@61
    59
    if (!globalRoots_ || !globalRoots_->initialize())
dvander@61
    60
        return false;
dvander@61
    61
dvander@11
    62
    maps_[MapKind_Meta] = heap_.metaMap();
dvander@12
    63
    if ((maps_[MapKind_Type] = allocateMap(MapKind_Type, sizeof(Map))) == NULL)
dvander@12
    64
        return false;
dvander@12
    65
    if ((maps_[MapKind_FixedArray] = allocateMap(MapKind_FixedArray, sizeof(Map))) == NULL)
dvander@12
    66
        return false;
dvander@12
    67
    if ((maps_[MapKind_ByteArray] = allocateMap(MapKind_ByteArray, sizeof(Map))) == NULL)
dvander@12
    68
        return false;
dvander@12
    69
    if ((maps_[MapKind_Code] = allocateMap(MapKind_Code, sizeof(Map))) == NULL)
dvander@12
    70
        return false;
dvander@14
    71
    if ((maps_[MapKind_Reference] = allocateMap(MapKind_Reference, sizeof(Map))) == NULL)
dvander@14
    72
        return false;
dvander@12
    73
    if ((maps_[MapKind_MetaArray] = allocateMap(MapKind_MetaArray, sizeof(Map))) == NULL)
dvander@11
    74
        return false;
dvander@14
    75
    if ((maps_[MapKind_Module] = allocateMap(MapKind_Module, sizeof(Map))) == NULL)
dvander@14
    76
        return false;
dvander@26
    77
    if ((maps_[MapKind_Function] = allocateMap(MapKind_Function, sizeof(Map))) == NULL)
dvander@26
    78
        return false;
dvander@54
    79
    if ((maps_[MapKind_String] = allocateMap(MapKind_String, sizeof(Map))) == NULL)
dvander@54
    80
        return false;
dvander@53
    81
    if ((maps_[MapKind_FreeRegion] = allocateMap(MapKind_FreeRegion, sizeof(Map))) == NULL)
dvander@53
    82
        return false;
dvander@11
    83
dvander@11
    84
    types_ = new TypeManager(this);
dvander@11
    85
    if (!types_ || !types_->initialize())
dvander@11
    86
        return false;
dvander@11
    87
dvander@65
    88
    // Create the cached array maps for generic arrays. This is for the API
dvander@65
    89
    // version of Invoke(), which needs to make arrays very quickly from C++.
dvander@65
    90
    {
dvander@65
    91
        // Generic "cell" array (contents do not matter, just non-gc things).
dvander@65
    92
        Local<Type> type(this, types_->getPrimitive(PrimitiveType_Int32));
dvander@65
    93
        if (!type)
dvander@65
    94
            return false;
dvander@65
    95
dvander@67
    96
        type = types_->unsafeArray(type, Type::UNKNOWN_SIZE, false);
dvander@65
    97
        if (!type)
dvander@65
    98
            return false;
dvander@65
    99
dvander@65
   100
        Local<ArrayMap> contained(this);
dvander@65
   101
        genericArrayMap_ = ArrayMap::New(this, type, contained);
dvander@65
   102
        if (!genericArrayMap_)
dvander@65
   103
            return false;
dvander@65
   104
dvander@65
   105
        type = types_->getPrimitive(PrimitiveType_Char);
dvander@65
   106
        if (!type)
dvander@65
   107
            return false;
dvander@65
   108
dvander@67
   109
        type = types_->unsafeArray(type, Type::UNKNOWN_SIZE, false);
dvander@65
   110
        if (!type)
dvander@65
   111
            return false;
dvander@65
   112
dvander@65
   113
        charArrayMap_ = ArrayMap::New(this, type, contained);
dvander@65
   114
        if (!charArrayMap_)
dvander@65
   115
            return false;
dvander@65
   116
    }
dvander@65
   117
dvander@0
   118
    return true;
dvander@0
   119
}
dvander@12
   120
dvander@12
   121
Map *
dvander@12
   122
Zone::allocateMap(MapKind kind, size_t bytes, MapKind parent)
dvander@12
   123
{
dvander@12
   124
    assert(maps_[parent]);
dvander@12
   125
    Map *map = heap_.allocateMap(kind, bytes);
dvander@12
   126
    if (!map)
dvander@12
   127
        return NULL;
dvander@12
   128
    map->init(maps_[parent]);
dvander@12
   129
    return map;
dvander@12
   130
}
dvander@45
   131
dvander@45
   132
void
dvander@45
   133
Zone::accept(VirtualObjectVisitor *visitor)
dvander@45
   134
{
dvander@45
   135
    for (unsigned i = 0; i < MapKinds_Total; i++)
dvander@45
   136
        visitor->visit(maps_[i].address());
dvander@65
   137
    visitor->visit(charArrayMap_.address());
dvander@65
   138
    visitor->visit(genericArrayMap_.address());
dvander@45
   139
    types()->accept(visitor);
dvander@45
   140
dvander@45
   141
    Local<Object> *local = lastLocalRoot_;
dvander@45
   142
    while (local) {
dvander@45
   143
        visitor->visit(local->address());
dvander@45
   144
        local = local->prev();
dvander@45
   145
    }
dvander@45
   146
dvander@61
   147
    globalRoots_->accept(visitor);
dvander@45
   148
    rootScopes_.accept(visitor);
dvander@51
   149
dvander@51
   150
    stack_.accept(visitor);
dvander@45
   151
}
dvander@45
   152
dvander@54
   153
String *
dvander@54
   154
Zone::makeSymbol(const char *str, size_t length)
dvander@54
   155
{
dvander@54
   156
    return symbols_->add(str, length);
dvander@54
   157
}
dvander@54
   158
dvander@54
   159
String *
dvander@54
   160
Zone::makeSymbol(const char *str)
dvander@54
   161
{
dvander@54
   162
    return makeSymbol(str, strlen(str));
dvander@54
   163
}
dvander@54
   164
dvander@54
   165
void
dvander@54
   166
ZoneAllocatorPolicy::reportOutOfMemory()
dvander@54
   167
{
dvander@54
   168
    // :TODO: report
dvander@54
   169
    assert(false);
dvander@54
   170
}
dvander@54
   171
dvander@54
   172
void
dvander@54
   173
ZoneAllocatorPolicy::reportAllocationOverflow()
dvander@54
   174
{
dvander@54
   175
    // :TODO: report
dvander@54
   176
    assert(false);
dvander@54
   177
}