jitcraft/Zone.cpp
author David Anderson <dvander@alliedmods.net>
Mon Jul 02 01:52:57 2012 -0700 (2012-07-02)
changeset 26 a48382113da6
parent 14 0784ac5cc347
child 45 25b995bc75a0
permissions -rw-r--r--
Added a Function object to sit in between Module and Code.
dvander@0
     1
/*
dvander@0
     2
 * Copyright (C) 2012 David Anderson
dvander@0
     3
 *
dvander@0
     4
 * This file is part of JITCraft.
dvander@0
     5
 *
dvander@0
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     7
 * the terms of the GNU General Public License as published by the Free
dvander@0
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
     9
 * any later version.
dvander@0
    10
 * 
dvander@0
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    14
 *
dvander@0
    15
 * You should have received a copy of the GNU General Public License along with
dvander@0
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    17
 */
dvander@0
    18
#include "Zone.h"
dvander@11
    19
#include "TypeManager.h"
dvander@0
    20
dvander@0
    21
using namespace jc;
dvander@0
    22
dvander@0
    23
Zone jc::SingleThreadedZone;
dvander@0
    24
dvander@11
    25
Zone::Zone()
dvander@11
    26
  : heap_(this),
dvander@11
    27
    types_(NULL)
dvander@11
    28
{
dvander@11
    29
}
dvander@11
    30
dvander@0
    31
bool
dvander@0
    32
Zone::initialize()
dvander@0
    33
{
dvander@0
    34
    if (!stack_.initialize())
dvander@0
    35
        return false;
dvander@11
    36
    if (!heap_.initialize())
dvander@11
    37
        return false;
dvander@11
    38
dvander@11
    39
    maps_[MapKind_Meta] = heap_.metaMap();
dvander@12
    40
    if ((maps_[MapKind_Type] = allocateMap(MapKind_Type, sizeof(Map))) == NULL)
dvander@12
    41
        return false;
dvander@12
    42
    if ((maps_[MapKind_FixedArray] = allocateMap(MapKind_FixedArray, sizeof(Map))) == NULL)
dvander@12
    43
        return false;
dvander@12
    44
    if ((maps_[MapKind_ByteArray] = allocateMap(MapKind_ByteArray, sizeof(Map))) == NULL)
dvander@12
    45
        return false;
dvander@12
    46
    if ((maps_[MapKind_Code] = allocateMap(MapKind_Code, sizeof(Map))) == NULL)
dvander@12
    47
        return false;
dvander@14
    48
    if ((maps_[MapKind_Reference] = allocateMap(MapKind_Reference, sizeof(Map))) == NULL)
dvander@14
    49
        return false;
dvander@12
    50
    if ((maps_[MapKind_MetaArray] = allocateMap(MapKind_MetaArray, sizeof(Map))) == NULL)
dvander@11
    51
        return false;
dvander@14
    52
    if ((maps_[MapKind_Module] = allocateMap(MapKind_Module, sizeof(Map))) == NULL)
dvander@14
    53
        return false;
dvander@26
    54
    if ((maps_[MapKind_Function] = allocateMap(MapKind_Function, sizeof(Map))) == NULL)
dvander@26
    55
        return false;
dvander@11
    56
dvander@11
    57
    types_ = new TypeManager(this);
dvander@11
    58
    if (!types_ || !types_->initialize())
dvander@11
    59
        return false;
dvander@11
    60
dvander@0
    61
    return true;
dvander@0
    62
}
dvander@12
    63
dvander@12
    64
Map *
dvander@12
    65
Zone::allocateMap(MapKind kind, size_t bytes, MapKind parent)
dvander@12
    66
{
dvander@12
    67
    assert(maps_[parent]);
dvander@12
    68
    Map *map = heap_.allocateMap(kind, bytes);
dvander@12
    69
    if (!map)
dvander@12
    70
        return NULL;
dvander@12
    71
    map->init(maps_[parent]);
dvander@12
    72
    return map;
dvander@12
    73
}