jitcraft/Stack.h
author David Anderson <dvander@alliedmods.net>
Sun Jul 08 15:23:48 2012 -0700 (2012-07-08)
changeset 62 e04c5be84792
parent 59 b7d61ddb3c8d
child 65 7c942b5adebc
permissions -rw-r--r--
Add some more API.
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_stack_h_
dvander@0
    20
#define _include_jc_stack_h_
dvander@0
    21
dvander@0
    22
#include <stddef.h>
dvander@0
    23
#include "Utility.h"
dvander@0
    24
#include "Code.h"
dvander@26
    25
#include "Functions.h"
dvander@47
    26
#include "VirtualObjectVisitor.h"
dvander@0
    27
dvander@59
    28
namespace ke {
dvander@12
    29
dvander@12
    30
class Object;
dvander@12
    31
class Array;
dvander@14
    32
class Reference;
dvander@47
    33
class Frame;
dvander@0
    34
    
dvander@0
    35
union LocalSlot
dvander@0
    36
{
dvander@0
    37
    int i32;
dvander@4
    38
    float f;
dvander@12
    39
    Address address;
dvander@12
    40
    Object *obj;
dvander@12
    41
    Array *array;
dvander@14
    42
    Reference *ref;
dvander@0
    43
};
dvander@0
    44
dvander@0
    45
struct Top
dvander@0
    46
{
dvander@0
    47
    LocalSlot *sp;
dvander@0
    48
    bytecode *pc;
dvander@47
    49
    Frame *fp;
dvander@0
    50
dvander@47
    51
    Top(LocalSlot *sp, bytecode *pc, Frame *fp)
dvander@47
    52
      : sp(sp), pc(pc), fp(NULL)
dvander@0
    53
    {
dvander@0
    54
    }
dvander@0
    55
dvander@0
    56
    Top(LocalSlot *sp)
dvander@47
    57
      : sp(sp), pc(NULL), fp(NULL)
dvander@0
    58
    {
dvander@0
    59
    }
dvander@0
    60
};
dvander@0
    61
dvander@0
    62
class Frame
dvander@0
    63
{
dvander@0
    64
    friend class Stack;
dvander@0
    65
dvander@0
    66
    Frame *prev_;
dvander@0
    67
    bytecode *prevpc_;
dvander@26
    68
    Function *fun_;
dvander@0
    69
    Code *code_;
dvander@12
    70
    Address lifoPosition_;
dvander@0
    71
dvander@0
    72
  public:
dvander@26
    73
    Frame(Frame *prev, bytecode *prevpc, Function *fun, Code *code, Address lifoPosition)
dvander@0
    74
      : prev_(prev),
dvander@0
    75
        prevpc_(prevpc),
dvander@26
    76
        fun_(fun),
dvander@1
    77
        code_(code),
dvander@12
    78
        lifoPosition_(lifoPosition)
dvander@0
    79
    {
dvander@0
    80
    }
dvander@0
    81
dvander@0
    82
    LocalSlot *locals() {
dvander@0
    83
        return reinterpret_cast<LocalSlot *>(this + 1);
dvander@0
    84
    }
dvander@0
    85
    LocalSlot *stackBase() {
dvander@0
    86
        return locals() + code_->nlocals();
dvander@0
    87
    }
dvander@26
    88
    Function *fun() const {
dvander@26
    89
        assert(fun_);
dvander@26
    90
        return fun_;
dvander@26
    91
    }
dvander@26
    92
    Function *maybeFun() const {
dvander@26
    93
        return fun_;
dvander@26
    94
    }
dvander@0
    95
    Code *code() const {
dvander@0
    96
        return code_;
dvander@0
    97
    }
dvander@0
    98
    Frame *prev() const {
dvander@0
    99
        return prev_;
dvander@0
   100
    }
dvander@0
   101
    bytecode *prevpc() const {
dvander@0
   102
        return prevpc_;
dvander@0
   103
    }
dvander@12
   104
    Address lifoPosition() const {
dvander@12
   105
        return lifoPosition_;
dvander@1
   106
    }
dvander@0
   107
    LocalSlot &arg(unsigned slot) {
dvander@26
   108
        assert(slot < fun()->nargs());
dvander@0
   109
        return *(reinterpret_cast<LocalSlot *>(this) - slot - 1);
dvander@0
   110
    }
dvander@47
   111
    void accept(VirtualObjectVisitor *visitor);
dvander@0
   112
};
dvander@0
   113
dvander@0
   114
class Stack
dvander@0
   115
{
dvander@0
   116
    char *buffer_;
dvander@0
   117
    char *end_;
dvander@0
   118
    Top *top_;
dvander@0
   119
dvander@0
   120
  private:
dvander@0
   121
    static const size_t STACK_SIZE = 1024 * 1024;
dvander@0
   122
dvander@0
   123
  public:
dvander@0
   124
    Stack();
dvander@0
   125
    ~Stack();
dvander@0
   126
dvander@0
   127
    bool initialize();
dvander@0
   128
dvander@0
   129
  public:
dvander@47
   130
    Frame *pushFrame(Function *fun);
dvander@47
   131
    Frame *popFrame();
dvander@0
   132
dvander@0
   133
    Top *top() {
dvander@0
   134
        return top_;
dvander@0
   135
    }
dvander@0
   136
    void setTop(Top *top) {
dvander@0
   137
        top_ = top;
dvander@0
   138
    }
dvander@0
   139
    Top begin() {
dvander@0
   140
        return Top((LocalSlot *)buffer_);
dvander@0
   141
    }
dvander@62
   142
    bool isInCallStack(Handle<Module> module);
dvander@47
   143
    void accept(VirtualObjectVisitor *visitor);
dvander@0
   144
};
dvander@0
   145
dvander@0
   146
}
dvander@0
   147
dvander@0
   148
#endif // _include_jc_stack_h_