src/Zone.h
author Asher Baker <asherkin@gmail.com>
Mon Jun 10 01:04:43 2013 +0100 (2013-06-10)
changeset 263 ba85a47ee414
parent 251 ca99a81745fe
permissions -rw-r--r--
Normalise line endings.
asherkin@263
     1
/* vim: set ts=4 sw=4 tw=99 et:
asherkin@263
     2
 *
asherkin@263
     3
 * Copyright (C) 2012 David Anderson
asherkin@263
     4
 *
asherkin@263
     5
 * This file is part of SourcePawn.
asherkin@263
     6
 *
asherkin@263
     7
 * SourcePawn is free software: you can redistribute it and/or modify it under
asherkin@263
     8
 * the terms of the GNU General Public License as published by the Free
asherkin@263
     9
 * Software Foundation, either version 3 of the License, or (at your option)
asherkin@263
    10
 * any later version.
asherkin@263
    11
 * 
asherkin@263
    12
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
asherkin@263
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
asherkin@263
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
asherkin@263
    15
 *
asherkin@263
    16
 * You should have received a copy of the GNU General Public License along with
asherkin@263
    17
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
asherkin@263
    18
 */
asherkin@263
    19
#ifndef _include_jitcraft_thread_h_
asherkin@263
    20
#define _include_jitcraft_thread_h_
asherkin@263
    21
asherkin@263
    22
#include <stdarg.h>
asherkin@263
    23
#include "PoolAllocator.h"
asherkin@263
    24
#include "Stack.h"
asherkin@263
    25
#include "Heap.h"
asherkin@263
    26
#include "Barriers.h"
asherkin@263
    27
#include "Handles.h"
asherkin@263
    28
#include "Messages.h"
asherkin@263
    29
#include "RootScopes.h"
asherkin@263
    30
#include "VirtualObjectVisitor.h"
asherkin@263
    31
asherkin@263
    32
namespace ke {
asherkin@263
    33
asherkin@263
    34
class TypeManager;
asherkin@263
    35
class String;
asherkin@263
    36
class StringPool;
asherkin@263
    37
class GlobalRoots;
asherkin@263
    38
class ArrayMap;
asherkin@263
    39
class Exception;
asherkin@263
    40
class NativeTable;
asherkin@263
    41
class PackageCache;
asherkin@263
    42
asherkin@263
    43
class Zone
asherkin@263
    44
{
asherkin@263
    45
    PoolAllocator pool_;
asherkin@263
    46
    Stack stack_;
asherkin@263
    47
    Heap heap_;
asherkin@263
    48
asherkin@263
    49
    // Map cache.
asherkin@263
    50
    Unbarriered<Map> maps_[MapKinds_Total];
asherkin@263
    51
    Unbarriered<ArrayMap> externalGenericArrayMap_;
asherkin@263
    52
    Unbarriered<ArrayMap> externalCharArrayMap_;
asherkin@263
    53
asherkin@263
    54
    TypeManager *types_;
asherkin@263
    55
    StringPool *symbols_;
asherkin@263
    56
    GlobalRoots *globalRoots_;
asherkin@263
    57
    NativeTable *nativeTable_;
asherkin@263
    58
    PackageCache *packages_;
asherkin@263
    59
asherkin@263
    60
    // Root list.
asherkin@263
    61
    Local<Object> *lastLocalRoot_;
asherkin@263
    62
    RootScopeManager rootScopes_;
asherkin@263
    63
    AutoRooted *specialRoots_;
asherkin@263
    64
asherkin@263
    65
    // Exception stuff.
asherkin@263
    66
    bool hasPendingException_;
asherkin@263
    67
    Ke::IMessageReporter *reporter_;
asherkin@263
    68
asherkin@263
    69
    Ke::IPublicFunctionListener *publicFunctionListener_;
asherkin@263
    70
asherkin@263
    71
  private:
asherkin@263
    72
    Zone *thisFromCtor() {
asherkin@263
    73
        return this;
asherkin@263
    74
    }
asherkin@263
    75
asherkin@263
    76
  public:
asherkin@263
    77
    Zone();
asherkin@263
    78
    ~Zone();
asherkin@263
    79
    bool initialize();
asherkin@263
    80
asherkin@263
    81
    PoolAllocator &pool() {
asherkin@263
    82
        return pool_;
asherkin@263
    83
    }
asherkin@263
    84
    Stack &stack() {
asherkin@263
    85
        return stack_;
asherkin@263
    86
    }
asherkin@263
    87
    Heap &heap() {
asherkin@263
    88
        return heap_;
asherkin@263
    89
    }
asherkin@263
    90
    Object *allocate(MapKind kind, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
asherkin@263
    91
        assert(maps_[kind]);
asherkin@263
    92
        Local<Map> map(this, maps_[kind]);
asherkin@263
    93
        return allocate(map, bytes, tenure);
asherkin@263
    94
    }
asherkin@263
    95
    Object *allocate(Handle<Map> map, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
asherkin@263
    96
        return heap_.allocate(map, bytes, tenure);
asherkin@263
    97
    }
asherkin@263
    98
    Map *getMap(MapKind kind) {
asherkin@263
    99
        return maps_[kind];
asherkin@263
   100
    }
asherkin@263
   101
    Map *allocateMap(MapKind kind, size_t bytes, MapKind parent = MapKind_Meta);
asherkin@263
   102
asherkin@263
   103
    ArrayMap *externalGenericArrayMap() {
asherkin@263
   104
        return externalGenericArrayMap_;
asherkin@263
   105
    }
asherkin@263
   106
    ArrayMap *externalCharArrayMap() {
asherkin@263
   107
        return externalCharArrayMap_;
asherkin@263
   108
    }
asherkin@263
   109
asherkin@263
   110
    TypeManager *types() const {
asherkin@263
   111
        return types_;
asherkin@263
   112
    }
asherkin@263
   113
    AutoRooted **lastSpecialRoot() {
asherkin@263
   114
        return &specialRoots_;
asherkin@263
   115
    }
asherkin@263
   116
    Local<Object> **lastLocalRoot() {
asherkin@263
   117
        return &lastLocalRoot_;
asherkin@263
   118
    }
asherkin@263
   119
    Object **makeScopedRoot(Object *ptr) {
asherkin@263
   120
        return rootScopes_.make(ptr);
asherkin@263
   121
    }
asherkin@263
   122
    RootScopeManager &rootScopes() {
asherkin@263
   123
        return rootScopes_;
asherkin@263
   124
    }
asherkin@263
   125
    StringPool *symbols() {
asherkin@263
   126
        return symbols_;
asherkin@263
   127
    }
asherkin@263
   128
    GlobalRoots *globalRoots() {
asherkin@263
   129
        return globalRoots_;
asherkin@263
   130
    }
asherkin@263
   131
    NativeTable *nativeTable() {
asherkin@263
   132
        return nativeTable_;
asherkin@263
   133
    }
asherkin@263
   134
    PackageCache *packages() {
asherkin@263
   135
        return packages_;
asherkin@263
   136
    }
asherkin@263
   137
asherkin@263
   138
    String *makeSymbol(const char *string, size_t length);
asherkin@263
   139
    String *makeSymbol(const char *string);
asherkin@263
   140
asherkin@263
   141
    void reportOutOfMemory();
asherkin@263
   142
    void reportAllocationOverflow();
asherkin@263
   143
    void reportError(Message message, ...);
asherkin@263
   144
    void reportErrorVA(Message message, va_list ap);
asherkin@263
   145
    bool hasPendingException();
asherkin@263
   146
    void clearPendingException();
asherkin@263
   147
    void installErrorReporter(Ke::IMessageReporter *reporter);
asherkin@263
   148
    Ke::IMessageReporter *errorReporter() {
asherkin@263
   149
        return reporter_;
asherkin@263
   150
    }
asherkin@263
   151
asherkin@263
   152
    void accept(VirtualObjectVisitor *visitor);
asherkin@263
   153
    void sweepWeakRoots();
asherkin@263
   154
asherkin@263
   155
    void setPublicFunctionListener(Ke::IPublicFunctionListener *listener);
asherkin@263
   156
    void registerPublic(Handle<Function> fun);
asherkin@263
   157
    void unregisterPublic(Handle<Function> fun);
asherkin@263
   158
asherkin@263
   159
    // Helpers that report OOM.
asherkin@263
   160
    void *malloc(size_t size);
asherkin@263
   161
    void *realloc(void *ptr, size_t size);
asherkin@263
   162
};
asherkin@263
   163
asherkin@263
   164
// In a multi-threaded system, this would be a TLS variable.
asherkin@263
   165
// In the interest of simplicity, we are single-threaded for now.
asherkin@263
   166
extern Zone *SingleThreadedZone;
asherkin@263
   167
asherkin@263
   168
// Exposed for the compiler.
asherkin@263
   169
char *BuildErrorMessage(const char *format, va_list ap);
asherkin@263
   170
void FreeErrorMessage(const char *message);
asherkin@263
   171
asherkin@263
   172
static inline Zone *ZONE()
asherkin@263
   173
{
asherkin@263
   174
    return SingleThreadedZone;
asherkin@263
   175
}
asherkin@263
   176
asherkin@263
   177
template <typename T>
asherkin@263
   178
Local<T>::Local(Zone *zone, T *thing)
asherkin@263
   179
  : zone_(zone),
asherkin@263
   180
    thing_(thing),
asherkin@263
   181
    prev_(*zone->lastLocalRoot())
asherkin@263
   182
{
asherkin@263
   183
    *zone->lastLocalRoot() = toRaw();
asherkin@263
   184
}
asherkin@263
   185
asherkin@263
   186
template <typename T>
asherkin@263
   187
asherkin@263
   188
Local<T>::~Local()
asherkin@263
   189
{
asherkin@263
   190
    assert(*zone_->lastLocalRoot() == toRaw());
asherkin@263
   191
    *zone_->lastLocalRoot() = prev_;
asherkin@263
   192
}
asherkin@263
   193
asherkin@263
   194
template <typename T>
asherkin@263
   195
ScopedRoot<T>::ScopedRoot()
asherkin@263
   196
  : thingp_(make(NULL))
asherkin@263
   197
{
asherkin@263
   198
}
asherkin@263
   199
asherkin@263
   200
template <typename T>
asherkin@263
   201
ScopedRoot<T>::ScopedRoot(T *thing)
asherkin@263
   202
  : thingp_(make(thing))
asherkin@263
   203
{
asherkin@263
   204
    // Type check that T is an Object.
asherkin@263
   205
    (void)static_cast<Object *>(thing);
asherkin@263
   206
}
asherkin@263
   207
asherkin@263
   208
template <typename T> T **
asherkin@263
   209
ScopedRoot<T>::make(T *other)
asherkin@263
   210
{
asherkin@263
   211
    return reinterpret_cast<T **>(ZONE()->makeScopedRoot(other));
asherkin@263
   212
}
asherkin@263
   213
asherkin@263
   214
RootScope::RootScope(Zone *zone)
asherkin@263
   215
  : Ke::HandleScope(zone, zone->rootScopes().position(), *zone->rootScopes().scope())
asherkin@263
   216
{
asherkin@263
   217
}
asherkin@263
   218
asherkin@263
   219
}
asherkin@263
   220
asherkin@263
   221
#endif // _include_jitcraft_thread_h_