jitcraft/NameBinding.h
author David Anderson <dvander@alliedmods.net>
Mon Jul 02 01:24:57 2012 -0700 (2012-07-02)
changeset 25 23e8b3d8e4e6
parent 2 46fc53b8fd2f
child 28 a9665857cfd5
permissions -rw-r--r--
Scanning, parsing, and static analysis now report errors properly.
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@0
    22
#include "StringPool.h"
dvander@2
    23
#include "Types.h"
dvander@25
    24
#include "Scanner.h"
dvander@0
    25
dvander@0
    26
namespace jc {
dvander@0
    27
dvander@0
    28
class Variable;
dvander@0
    29
class NamedFunction;
dvander@0
    30
class Scope;
dvander@0
    31
class Type;
dvander@2
    32
class NamedEnum;
dvander@2
    33
class NamedConstant;
dvander@0
    34
dvander@0
    35
class BoundName : public PoolObject
dvander@0
    36
{
dvander@0
    37
    Name *name_;
dvander@0
    38
    Scope *scope_;
dvander@0
    39
    Type *type_;
dvander@25
    40
    SourcePosition pos_;
dvander@0
    41
dvander@0
    42
  public:
dvander@0
    43
    enum Kind {
dvander@0
    44
      VARIABLE,
dvander@1
    45
      FUNCTION,
dvander@2
    46
      ENUM,
dvander@2
    47
      CONSTANT
dvander@0
    48
    };
dvander@0
    49
dvander@25
    50
    BoundName(Scope *scope, Name *name, const SourcePosition &pos);
dvander@0
    51
dvander@0
    52
    virtual Kind kind() const = 0;
dvander@0
    53
dvander@0
    54
    Name *name() const {
dvander@0
    55
        return name_;
dvander@0
    56
    }
dvander@25
    57
    Scope *scope() const {
dvander@0
    58
        return scope_;
dvander@0
    59
    }
dvander@0
    60
    Variable *toVariable() {
dvander@0
    61
        assert(kind() == VARIABLE);
dvander@0
    62
        return reinterpret_cast<Variable *>(this);
dvander@0
    63
    }
dvander@0
    64
    NamedFunction *toNamedFunction() {
dvander@0
    65
        assert(kind() == FUNCTION);
dvander@0
    66
        return reinterpret_cast<NamedFunction *>(this);
dvander@0
    67
    }
dvander@2
    68
    NamedConstant *toNamedConstant() {
dvander@2
    69
        assert(kind() == CONSTANT);
dvander@2
    70
        return reinterpret_cast<NamedConstant *>(this);
dvander@2
    71
    }
dvander@0
    72
    Type *type() const {
dvander@0
    73
        return type_;
dvander@0
    74
    }
dvander@0
    75
    void setType(Type *type) {
dvander@0
    76
        type_ = type;
dvander@0
    77
    }
dvander@25
    78
    const SourcePosition &pos() {
dvander@25
    79
        return pos_;
dvander@25
    80
    }
dvander@0
    81
};
dvander@0
    82
dvander@0
    83
class NamedFunction : public BoundName
dvander@0
    84
{
dvander@0
    85
    unsigned slot_;
dvander@0
    86
dvander@0
    87
  public:
dvander@25
    88
    NamedFunction(Scope *scope, Name *name, const SourcePosition &pos);
dvander@0
    89
dvander@0
    90
    Kind kind() const {
dvander@0
    91
        return FUNCTION;
dvander@0
    92
    }
dvander@0
    93
    void allocate(unsigned slot) {
dvander@0
    94
        slot_ = slot;
dvander@0
    95
    }
dvander@0
    96
    unsigned slot() const {
dvander@0
    97
        return slot_;
dvander@0
    98
    }
dvander@0
    99
};
dvander@0
   100
dvander@2
   101
class NamedEnum : public BoundName
dvander@1
   102
{
dvander@1
   103
  public:
dvander@25
   104
    NamedEnum(Scope *scope, Name *name, const SourcePosition &pos)
dvander@25
   105
      : BoundName(scope, name, pos)
dvander@1
   106
    {
dvander@1
   107
    }
dvander@1
   108
dvander@2
   109
    Kind kind() const {
dvander@2
   110
        return ENUM;
dvander@1
   111
    }
dvander@2
   112
};
dvander@2
   113
dvander@2
   114
class NamedConstant : public BoundName
dvander@2
   115
{
dvander@2
   116
    BoxedPrimitive value_;
dvander@2
   117
    Type *type_;
dvander@2
   118
dvander@2
   119
  public:
dvander@25
   120
    NamedConstant(Scope *scope, Name *name, const SourcePosition &pos)
dvander@25
   121
      : BoundName(scope, name, pos),
dvander@2
   122
        type_(NULL)
dvander@2
   123
    {
dvander@2
   124
    }
dvander@2
   125
dvander@2
   126
    Kind kind() const {
dvander@2
   127
        return CONSTANT;
dvander@2
   128
    }
dvander@2
   129
    void set(Type *type, const BoxedPrimitive &value) {
dvander@2
   130
        value_ = value;
dvander@2
   131
        type_ = type;
dvander@2
   132
    }
dvander@2
   133
    Type *type() const {
dvander@2
   134
        return type_;
dvander@2
   135
    }
dvander@2
   136
    BoxedPrimitive value() const {
dvander@2
   137
        return value_;
dvander@1
   138
    }
dvander@1
   139
};
dvander@1
   140
dvander@0
   141
class Variable : public BoundName
dvander@0
   142
{
dvander@0
   143
  public:
dvander@0
   144
    enum Location {
dvander@0
   145
        UNALLOCATED,
dvander@0
   146
        STACK,
dvander@0
   147
        PARAMETER
dvander@0
   148
    };
dvander@0
   149
dvander@25
   150
    Variable(Scope *scope, Name *name, const SourcePosition &pos);
dvander@0
   151
dvander@0
   152
    Kind kind() const {
dvander@0
   153
        return VARIABLE;
dvander@0
   154
    }
dvander@0
   155
    bool unallocated() const {
dvander@0
   156
        return location() == UNALLOCATED;
dvander@0
   157
    }
dvander@0
   158
    void allocate(Location location, unsigned slot) {
dvander@0
   159
        location_ = location;
dvander@0
   160
        slot_ = slot;
dvander@0
   161
    }
dvander@0
   162
    Location location() const {
dvander@0
   163
        return location_;
dvander@0
   164
    }
dvander@0
   165
    unsigned slot() const {
dvander@0
   166
        assert(!unallocated());
dvander@0
   167
        return slot_;
dvander@0
   168
    }
dvander@0
   169
dvander@0
   170
  private:
dvander@0
   171
    Location location_;
dvander@0
   172
    unsigned slot_;
dvander@0
   173
};
dvander@0
   174
dvander@0
   175
}
dvander@0
   176
dvander@0
   177
#endif // _include_name_binding_h_