src/Code.h
author David Anderson <dvander@alliedmods.net>
Sat Dec 22 18:22:14 2012 -0800 (2012-12-22)
changeset 230 fb3cd08bc7fb
parent 195 c1ba166f3fc4
child 263 ba85a47ee414
permissions -rw-r--r--
Re-add LIFO stack optimizations.
dvander@47
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@47
     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_jc_code_h_
dvander@0
    20
#define _include_jc_code_h_
dvander@0
    21
dvander@0
    22
#include "Opcodes.h"
dvander@12
    23
#include "Barriers.h"
dvander@12
    24
#include "Heap.h"
dvander@12
    25
#include "Types.h"
dvander@12
    26
#include "FixedArray.h"
dvander@0
    27
dvander@59
    28
namespace ke {
dvander@0
    29
dvander@0
    30
class Module;
dvander@0
    31
class Type;
dvander@0
    32
dvander@13
    33
// A code object contains the bytecode compiled from a function (or global
dvander@13
    34
// script), as well as all information needed to interpret or JIT-compile
dvander@13
    35
// the bytecode.
dvander@12
    36
class Code : public Object
dvander@0
    37
{
dvander@34
    38
    Barriered<Module> module_;
dvander@34
    39
    Barriered<ByteArray> bytecode_;
dvander@34
    40
    Barriered<FixedArray> locals_;
dvander@34
    41
    Barriered<FixedArray> objects_;
dvander@195
    42
    Barriered<FixedArray> strings_;
dvander@47
    43
    Barriered<ByteArray> safepoints_;
dvander@70
    44
    Barriered<ByteArray> sourcemap_;
dvander@13
    45
    unsigned maxStackDepth_;
dvander@70
    46
    unsigned lineNumber_;
dvander@230
    47
    unsigned maxLoopDepth_;
dvander@0
    48
dvander@0
    49
  public:
dvander@47
    50
    static inline size_t BytesPerSafepoint(size_t stackDepth) {
dvander@47
    51
        return (Align(stackDepth, 8) / 8) + sizeof(unsigned);
dvander@47
    52
    }
dvander@47
    53
dvander@47
    54
  public:
dvander@34
    55
    static Code *New(Zone *zone, Handle<ByteArray> bytecode, Handle<FixedArray> locals,
dvander@195
    56
                     Handle<FixedArray> objects, Handle<FixedArray> strings, unsigned maxStackDepth,
dvander@230
    57
                     unsigned maxLoopDepth, Handle<ByteArray> safepoints, Handle<ByteArray> sourcemap);
dvander@12
    58
dvander@12
    59
    Module *module() {
dvander@13
    60
        return module_;
dvander@12
    61
    }
dvander@12
    62
    bytecode *start() {
dvander@13
    63
        return bytecode_->raw();
dvander@12
    64
    }
dvander@12
    65
    unsigned length() {
dvander@13
    66
        return bytecode_->length();
dvander@12
    67
    }
dvander@12
    68
    Type *localType(size_t index) {
dvander@13
    69
        return Type::cast(locals_->at(index));
dvander@12
    70
    }
dvander@12
    71
    unsigned nlocals() {
dvander@85
    72
        return locals_ ? locals_->length() : 0;
dvander@12
    73
    }
dvander@12
    74
    unsigned maxStackDepth() {
dvander@13
    75
        return maxStackDepth_;
dvander@12
    76
    }
dvander@230
    77
    unsigned maxLoopDepth() {
dvander@230
    78
        return maxLoopDepth_;
dvander@230
    79
    }
dvander@12
    80
    Map *map(size_t index) {
dvander@21
    81
        return Map::cast(objects_->at(index));
dvander@21
    82
    }
dvander@21
    83
    Object *object(size_t index) {
dvander@21
    84
        return objects_->at(index);
dvander@0
    85
    }
dvander@47
    86
    ByteArray *safepoints() {
dvander@47
    87
        return safepoints_;
dvander@47
    88
    }
dvander@195
    89
    FixedArray *strings() {
dvander@195
    90
        return strings_;
dvander@195
    91
    }
dvander@47
    92
    uint8 *safepointAt(unsigned pcOffset);
dvander@47
    93
dvander@195
    94
    void setModule(Handle<Module> module) {
dvander@195
    95
        module_ = module;
dvander@195
    96
    }
dvander@195
    97
dvander@47
    98
    unsigned pcToOffset(bytecode *pc) {
dvander@47
    99
        assert(pc >= start() && pc < start() + length());
dvander@86
   100
        return unsigned(pc - start());
dvander@47
   101
    }
dvander@0
   102
dvander@70
   103
    SourcePosition pcToSource(unsigned pc);
dvander@70
   104
    unsigned lineNumber() {
dvander@70
   105
        return lineNumber_;
dvander@70
   106
    }
dvander@70
   107
dvander@44
   108
    // GC Descriptor.
dvander@44
   109
    static inline size_t offsetOfModule() {
danderson@91
   110
        return OFFSETOF(Code, module_);
dvander@44
   111
    }
dvander@44
   112
    static inline size_t offsetOfBytecode() {
danderson@91
   113
        return OFFSETOF(Code, bytecode_);
dvander@44
   114
    }
dvander@44
   115
    static inline size_t offsetOfLocals() {
danderson@91
   116
        return OFFSETOF(Code, locals_);
dvander@44
   117
    }
dvander@44
   118
    static inline size_t offsetOfObjects() {
danderson@91
   119
        return OFFSETOF(Code, objects_);
dvander@44
   120
    }
dvander@195
   121
    static inline size_t offsetOfStrings() {
dvander@195
   122
        return OFFSETOF(Code, strings_);
dvander@195
   123
    }
dvander@53
   124
    static inline size_t offsetOfSafepoints() {
danderson@91
   125
        return OFFSETOF(Code, safepoints_);
dvander@53
   126
    }
dvander@70
   127
    static inline size_t offsetOfSourceMap() {
danderson@91
   128
        return OFFSETOF(Code, sourcemap_);
dvander@70
   129
    }
dvander@44
   130
    // End GC Descriptor.
dvander@44
   131
dvander@12
   132
    static Code *cast(Object *obj) {
dvander@14
   133
        assert(!obj || obj->is(MapKind_Code));
dvander@12
   134
        return reinterpret_cast<Code *>(obj);
dvander@0
   135
    }
dvander@0
   136
};
dvander@0
   137
dvander@0
   138
}
dvander@0
   139
dvander@0
   140
#endif // _include_jc_code_h_