src/NameBinding.h
author David Anderson <danderson@mozilla.com>
Wed Jul 25 01:30:33 2012 -0700 (2012-07-25)
changeset 92 e3974e7360e9
parent 86 32ad0523b309
child 137 be919b22085b
permissions -rw-r--r--
Add GCC/Linux support.
dvander@0
     1
/*
dvander@0
     2
 * Copyright (C) 2012 David Anderson
dvander@0
     3
 *
dvander@0
     4
 * This file is part of JITCraft.
dvander@0
     5
 *
dvander@0
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     7
 * the terms of the GNU General Public License as published by the Free
dvander@0
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
     9
 * any later version.
dvander@0
    10
 * 
dvander@0
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    14
 *
dvander@0
    15
 * You should have received a copy of the GNU General Public License along with
dvander@0
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    17
 */
dvander@0
    18
#ifndef _include_name_binding_h_
dvander@0
    19
#define _include_name_binding_h_
dvander@0
    20
dvander@0
    21
#include "PoolAllocator.h"
dvander@2
    22
#include "Types.h"
dvander@25
    23
#include "Scanner.h"
dvander@0
    24
dvander@59
    25
namespace ke {
dvander@0
    26
dvander@0
    27
class Variable;
dvander@0
    28
class NamedFunction;
dvander@0
    29
class Scope;
dvander@0
    30
class Type;
dvander@2
    31
class NamedEnum;
dvander@2
    32
class NamedConstant;
dvander@54
    33
class String;
dvander@0
    34
dvander@0
    35
class BoundName : public PoolObject
dvander@0
    36
{
dvander@28
    37
    Scope *scope_;
dvander@54
    38
    ScopedRoot<String> name_;
dvander@37
    39
    ScopedRoot<Type> type_;
dvander@63
    40
dvander@63
    41
  protected:
dvander@25
    42
    SourcePosition pos_;
dvander@0
    43
dvander@0
    44
  public:
dvander@0
    45
    enum Kind {
dvander@0
    46
      VARIABLE,
dvander@1
    47
      FUNCTION,
dvander@2
    48
      ENUM,
dvander@2
    49
      CONSTANT
dvander@0
    50
    };
dvander@0
    51
dvander@54
    52
    BoundName(Scope *scope, Handle<String> name, const SourcePosition &pos);
dvander@0
    53
dvander@0
    54
    virtual Kind kind() const = 0;
dvander@0
    55
dvander@54
    56
    String *name() const {
dvander@0
    57
        return name_;
dvander@0
    58
    }
dvander@25
    59
    Scope *scope() const {
dvander@0
    60
        return scope_;
dvander@0
    61
    }
dvander@0
    62
    Variable *toVariable() {
dvander@0
    63
        assert(kind() == VARIABLE);
dvander@0
    64
        return reinterpret_cast<Variable *>(this);
dvander@0
    65
    }
dvander@0
    66
    NamedFunction *toNamedFunction() {
dvander@0
    67
        assert(kind() == FUNCTION);
dvander@0
    68
        return reinterpret_cast<NamedFunction *>(this);
dvander@0
    69
    }
dvander@2
    70
    NamedConstant *toNamedConstant() {
dvander@2
    71
        assert(kind() == CONSTANT);
dvander@2
    72
        return reinterpret_cast<NamedConstant *>(this);
dvander@2
    73
    }
dvander@0
    74
    Type *type() const {
dvander@0
    75
        return type_;
dvander@0
    76
    }
dvander@37
    77
    void setType(Handle<Type> type) {
dvander@0
    78
        type_ = type;
dvander@0
    79
    }
dvander@25
    80
    const SourcePosition &pos() {
dvander@25
    81
        return pos_;
dvander@25
    82
    }
dvander@0
    83
};
dvander@0
    84
dvander@0
    85
class NamedFunction : public BoundName
dvander@0
    86
{
dvander@0
    87
    unsigned slot_;
dvander@63
    88
    TokenKind token_;
dvander@63
    89
    ScopedRoot<Type> forwardType_;
dvander@68
    90
    bool isVariadicNative_;
dvander@0
    91
dvander@0
    92
  public:
dvander@63
    93
    NamedFunction(Scope *scope, Handle<String> name, const SourcePosition &pos, TokenKind token);
dvander@0
    94
dvander@0
    95
    Kind kind() const {
dvander@0
    96
        return FUNCTION;
dvander@0
    97
    }
dvander@0
    98
    void allocate(unsigned slot) {
dvander@0
    99
        slot_ = slot;
dvander@0
   100
    }
dvander@63
   101
    bool isForward() const {
dvander@63
   102
        return token_ == TOK_FORWARD;
dvander@63
   103
    }
dvander@63
   104
    bool isPublic() const {
dvander@63
   105
        return token_ == TOK_PUBLIC;
dvander@63
   106
    }
dvander@68
   107
    bool isNative() const {
dvander@68
   108
        return token_ == TOK_NATIVE;
dvander@68
   109
    }
dvander@63
   110
    void setForwardType(Handle<Type> type) {
dvander@63
   111
        forwardType_ = type;
dvander@63
   112
    }
dvander@63
   113
    Type *forwardType() {
dvander@63
   114
        return forwardType_;
dvander@63
   115
    }
dvander@63
   116
    void setImplemented(const SourcePosition &at) {
dvander@63
   117
        token_ = TOK_PUBLIC;
dvander@63
   118
        pos_ = at;
dvander@63
   119
    }
dvander@68
   120
    void markNativeVariadic() {
dvander@68
   121
        assert(token_ == TOK_NATIVE);
dvander@68
   122
        isVariadicNative_ = true;
dvander@68
   123
    }
dvander@68
   124
    bool isNativeVariadic() {
dvander@68
   125
        assert(token_ == TOK_NATIVE);
dvander@68
   126
        return isVariadicNative_;
dvander@68
   127
    }
dvander@0
   128
    unsigned slot() const {
dvander@0
   129
        return slot_;
dvander@0
   130
    }
dvander@0
   131
};
dvander@0
   132
dvander@2
   133
class NamedEnum : public BoundName
dvander@1
   134
{
dvander@1
   135
  public:
dvander@54
   136
    NamedEnum(Scope *scope, Handle<String> name, const SourcePosition &pos)
dvander@25
   137
      : BoundName(scope, name, pos)
dvander@1
   138
    {
dvander@1
   139
    }
dvander@1
   140
dvander@2
   141
    Kind kind() const {
dvander@2
   142
        return ENUM;
dvander@1
   143
    }
dvander@2
   144
};
dvander@2
   145
dvander@2
   146
class NamedConstant : public BoundName
dvander@2
   147
{
dvander@2
   148
    BoxedPrimitive value_;
dvander@2
   149
    Type *type_;
dvander@2
   150
dvander@2
   151
  public:
dvander@54
   152
    NamedConstant(Scope *scope, Handle<String> name, const SourcePosition &pos)
dvander@25
   153
      : BoundName(scope, name, pos),
dvander@2
   154
        type_(NULL)
dvander@2
   155
    {
dvander@2
   156
    }
dvander@2
   157
dvander@2
   158
    Kind kind() const {
dvander@2
   159
        return CONSTANT;
dvander@2
   160
    }
dvander@2
   161
    void set(Type *type, const BoxedPrimitive &value) {
dvander@2
   162
        value_ = value;
dvander@2
   163
        type_ = type;
dvander@2
   164
    }
dvander@2
   165
    Type *type() const {
dvander@2
   166
        return type_;
dvander@2
   167
    }
dvander@2
   168
    BoxedPrimitive value() const {
dvander@2
   169
        return value_;
dvander@1
   170
    }
dvander@1
   171
};
dvander@1
   172
dvander@0
   173
class Variable : public BoundName
dvander@0
   174
{
dvander@0
   175
  public:
dvander@0
   176
    enum Location {
dvander@0
   177
        UNALLOCATED,
dvander@0
   178
        STACK,
dvander@85
   179
        PARAMETER,
dvander@85
   180
        ENVIRONMENT
dvander@0
   181
    };
dvander@0
   182
dvander@54
   183
    Variable(Scope *scope, Handle<String> name, const SourcePosition &pos);
dvander@0
   184
dvander@0
   185
    Kind kind() const {
dvander@0
   186
        return VARIABLE;
dvander@0
   187
    }
dvander@0
   188
    bool unallocated() const {
dvander@0
   189
        return location() == UNALLOCATED;
dvander@0
   190
    }
dvander@0
   191
    void allocate(Location location, unsigned slot) {
dvander@0
   192
        location_ = location;
dvander@0
   193
        slot_ = slot;
dvander@0
   194
    }
dvander@0
   195
    Location location() const {
dvander@0
   196
        return location_;
dvander@0
   197
    }
dvander@0
   198
    unsigned slot() const {
dvander@0
   199
        assert(!unallocated());
dvander@0
   200
        return slot_;
dvander@0
   201
    }
dvander@85
   202
    bool needsHeapAllocation();
dvander@0
   203
dvander@0
   204
  private:
dvander@0
   205
    Location location_;
dvander@0
   206
    unsigned slot_;
dvander@0
   207
};
dvander@0
   208
dvander@0
   209
}
dvander@0
   210
dvander@0
   211
#endif // _include_name_binding_h_