jitcraft/Zone.h
author David Anderson <dvander@alliedmods.net>
Mon Jul 09 21:40:20 2012 -0700 (2012-07-09)
changeset 66 cbba1997dc71
parent 65 7c942b5adebc
child 69 dfce0539a77d
permissions -rw-r--r--
Add support for passing arrays.
dvander@28
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@28
     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
#ifndef _include_jitcraft_thread_h_
dvander@0
    20
#define _include_jitcraft_thread_h_
dvander@0
    21
dvander@0
    22
#include "PoolAllocator.h"
dvander@0
    23
#include "Stack.h"
dvander@11
    24
#include "Heap.h"
dvander@11
    25
#include "Barriers.h"
dvander@27
    26
#include "Handles.h"
dvander@29
    27
#include "RootScopes.h"
dvander@45
    28
#include "VirtualObjectVisitor.h"
dvander@0
    29
dvander@59
    30
namespace ke {
dvander@0
    31
dvander@11
    32
class TypeManager;
dvander@54
    33
class String;
dvander@54
    34
class StringPool;
dvander@61
    35
class GlobalRoots;
dvander@65
    36
class ArrayMap;
dvander@11
    37
dvander@0
    38
class Zone
dvander@0
    39
{
dvander@0
    40
    PoolAllocator pool_;
dvander@0
    41
    Stack stack_;
dvander@11
    42
    Heap heap_;
dvander@11
    43
dvander@11
    44
    // Map cache.
dvander@11
    45
    Unbarriered<Map> maps_[MapKinds_Total];
dvander@65
    46
    Unbarriered<ArrayMap> genericArrayMap_;
dvander@65
    47
    Unbarriered<ArrayMap> charArrayMap_;
dvander@11
    48
dvander@11
    49
    TypeManager *types_;
dvander@54
    50
    StringPool *symbols_;
dvander@61
    51
    GlobalRoots *globalRoots_;
dvander@0
    52
dvander@27
    53
    // Root list.
dvander@28
    54
    Local<Object> *lastLocalRoot_;
dvander@29
    55
    RootScopeManager rootScopes_;
dvander@27
    56
dvander@0
    57
  public:
dvander@11
    58
    Zone();
dvander@54
    59
    ~Zone();
dvander@0
    60
    bool initialize();
dvander@0
    61
dvander@0
    62
    PoolAllocator &pool() {
dvander@0
    63
        return pool_;
dvander@0
    64
    }
dvander@0
    65
    Stack &stack() {
dvander@0
    66
        return stack_;
dvander@0
    67
    }
dvander@11
    68
    Heap &heap() {
dvander@11
    69
        return heap_;
dvander@11
    70
    }
dvander@11
    71
    Object *allocate(MapKind kind, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
dvander@11
    72
        assert(maps_[kind]);
dvander@53
    73
        Local<Map> map(this, maps_[kind]);
dvander@28
    74
        return allocate(map, bytes, tenure);
dvander@12
    75
    }
dvander@27
    76
    Object *allocate(Handle<Map> map, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
dvander@27
    77
        return heap_.allocate(map, bytes, tenure);
dvander@27
    78
    }
dvander@53
    79
    Map *getMap(MapKind kind) {
dvander@53
    80
        return maps_[kind];
dvander@53
    81
    }
dvander@12
    82
    Map *allocateMap(MapKind kind, size_t bytes, MapKind parent = MapKind_Meta);
dvander@65
    83
dvander@65
    84
    ArrayMap *genericArrayMap() {
dvander@65
    85
        return genericArrayMap_;
dvander@65
    86
    }
dvander@65
    87
    ArrayMap *charArrayMap() {
dvander@65
    88
        return charArrayMap_;
dvander@65
    89
    }
dvander@65
    90
dvander@11
    91
    TypeManager *types() const {
dvander@11
    92
        return types_;
dvander@11
    93
    }
dvander@28
    94
    Local<Object> **lastLocalRoot() {
dvander@28
    95
        return &lastLocalRoot_;
dvander@28
    96
    }
dvander@29
    97
    Object **makeScopedRoot(Object *ptr) {
dvander@29
    98
        return rootScopes_.make(ptr);
dvander@29
    99
    }
dvander@29
   100
    RootScopeManager &rootScopes() {
dvander@29
   101
        return rootScopes_;
dvander@29
   102
    }
dvander@54
   103
    StringPool *symbols() {
dvander@54
   104
        return symbols_;
dvander@54
   105
    }
dvander@61
   106
    GlobalRoots *globalRoots() {
dvander@61
   107
        return globalRoots_;
dvander@61
   108
    }
dvander@54
   109
dvander@54
   110
    String *makeSymbol(const char *string, size_t length);
dvander@54
   111
    String *makeSymbol(const char *string);
dvander@45
   112
dvander@45
   113
    void accept(VirtualObjectVisitor *visitor);
dvander@0
   114
};
dvander@0
   115
dvander@0
   116
// In a multi-threaded system, this would be a TLS variable.
dvander@0
   117
// In the interest of simplicity, we are single-threaded for now.
dvander@60
   118
extern Zone *SingleThreadedZone;
dvander@0
   119
dvander@0
   120
static inline Zone *ZONE()
dvander@0
   121
{
dvander@60
   122
    return SingleThreadedZone;
dvander@0
   123
}
dvander@0
   124
dvander@28
   125
template <typename T>
dvander@28
   126
Local<T>::Local(Zone *zone, T *thing)
dvander@28
   127
  : zone_(zone),
dvander@28
   128
    thing_(thing),
dvander@28
   129
    prev_(*zone->lastLocalRoot())
dvander@28
   130
{
dvander@28
   131
    *zone->lastLocalRoot() = toRaw();
dvander@0
   132
}
dvander@0
   133
dvander@28
   134
template <typename T>
dvander@28
   135
Local<T>::~Local()
dvander@28
   136
{
dvander@28
   137
    assert(*zone_->lastLocalRoot() == toRaw());
dvander@28
   138
    *zone_->lastLocalRoot() = prev_;
dvander@28
   139
}
dvander@28
   140
dvander@29
   141
template <typename T>
dvander@53
   142
ScopedRoot<T>::ScopedRoot()
dvander@53
   143
  : thingp_(make(NULL))
dvander@53
   144
{
dvander@53
   145
}
dvander@53
   146
dvander@53
   147
template <typename T>
dvander@29
   148
ScopedRoot<T>::ScopedRoot(T *thing)
dvander@34
   149
  : thingp_(make(thing))
dvander@29
   150
{
dvander@29
   151
    // Type check that T is an Object.
dvander@29
   152
    (void)static_cast<Object *>(thing);
dvander@29
   153
}
dvander@29
   154
dvander@29
   155
template <typename T> T **
dvander@29
   156
ScopedRoot<T>::make(T *other)
dvander@29
   157
{
dvander@29
   158
    return reinterpret_cast<T **>(ZONE()->makeScopedRoot(other));
dvander@29
   159
}
dvander@29
   160
dvander@29
   161
RootScope::RootScope(Zone *zone)
dvander@60
   162
  : Ke::HandleScope(zone, zone->rootScopes().position(), *zone->rootScopes().scope())
dvander@29
   163
{
dvander@29
   164
}
dvander@29
   165
dvander@28
   166
}
dvander@28
   167
dvander@28
   168
#endif // _include_jitcraft_thread_h_