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