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