src/compiler/HIR.h
author Asher Baker <asherkin@gmail.com>
Mon Jun 10 01:04:43 2013 +0100 (2013-06-10)
changeset 263 ba85a47ee414
parent 256 3c184218462d
permissions -rw-r--r--
Normalise line endings.
asherkin@263
     1
/*
asherkin@263
     2
 * Copyright (C) 2012 David Anderson
asherkin@263
     3
 *
asherkin@263
     4
 * This file is part of SourcePawn.
asherkin@263
     5
 *
asherkin@263
     6
 * SourcePawn is free software: you can redistribute it and/or modify it under
asherkin@263
     7
 * the terms of the GNU General Public License as published by the Free
asherkin@263
     8
 * Software Foundation, either version 3 of the License, or (at your option)
asherkin@263
     9
 * any later version.
asherkin@263
    10
 * 
asherkin@263
    11
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
asherkin@263
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
asherkin@263
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
asherkin@263
    14
 *
asherkin@263
    15
 * You should have received a copy of the GNU General Public License along with
asherkin@263
    16
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
asherkin@263
    17
 */
asherkin@263
    18
#ifndef _include_sp2_hir_h_
asherkin@263
    19
#define _include_sp2_hir_h_
asherkin@263
    20
asherkin@263
    21
#include "../Types.h"
asherkin@263
    22
#include "../PoolAllocator.h"
asherkin@263
    23
#include "../Opcodes.h"
asherkin@263
    24
#include "Symbols.h"
asherkin@263
    25
asherkin@263
    26
namespace ke {
asherkin@263
    27
asherkin@263
    28
#define HIR_OPS(_)                      \
asherkin@263
    29
    _(Call)                             \
asherkin@263
    30
    _(Boolean)                          \
asherkin@263
    31
    _(Integer)                          \
asherkin@263
    32
    _(Float)                            \
asherkin@263
    33
    _(String)                           \
asherkin@263
    34
    _(Import)                           \
asherkin@263
    35
    _(Array)                            \
asherkin@263
    36
    _(Store)                            \
asherkin@263
    37
    _(ToRef)                            \
asherkin@263
    38
    _(NewDependentArray)                \
asherkin@263
    39
    /* Special LValue types */          \
asherkin@263
    40
    _(Index)                            \
asherkin@263
    41
    _(Local)                            \
asherkin@263
    42
    _(Global)                           \
asherkin@263
    43
    _(Field)                            \
asherkin@263
    44
    /* End LValues */                   \
asherkin@263
    45
    _(Unary)                            \
asherkin@263
    46
    _(Binary)                           \
asherkin@263
    47
    _(Convert)                          \
asherkin@263
    48
    _(PostIncDec)
asherkin@263
    49
asherkin@263
    50
// Forward declarations.
asherkin@263
    51
#define _(name)    class H##name;
asherkin@263
    52
HIR_OPS(_)
asherkin@263
    53
#undef _
asherkin@263
    54
asherkin@263
    55
class HIRVisitor;
asherkin@263
    56
class AstNode;
asherkin@263
    57
class HLValue;
asherkin@263
    58
class Array;
asherkin@263
    59
asherkin@263
    60
class HIR : public PoolObject
asherkin@263
    61
{
asherkin@263
    62
  public:
asherkin@263
    63
    enum HOp {
asherkin@263
    64
#define _(name) k##name,
asherkin@263
    65
        HIR_OPS(_)
asherkin@263
    66
#undef _
asherkin@263
    67
        kTotalOps
asherkin@263
    68
    };
asherkin@263
    69
asherkin@263
    70
  public:
asherkin@263
    71
    HIR(AstNode *node, Type *type)
asherkin@263
    72
      : node_(node),
asherkin@263
    73
        type_(type)
asherkin@263
    74
    {
asherkin@263
    75
    }
asherkin@263
    76
asherkin@263
    77
    Handle<Type> type() {
asherkin@263
    78
        return type_;
asherkin@263
    79
    }
asherkin@263
    80
    AstNode *node() const {
asherkin@263
    81
        return node_;
asherkin@263
    82
    }
asherkin@263
    83
asherkin@263
    84
    virtual bool isLValue() const {
asherkin@263
    85
        return false;
asherkin@263
    86
    }
asherkin@263
    87
asherkin@263
    88
    virtual HOp op() const = 0;
asherkin@263
    89
    virtual void accept(HIRVisitor *visitor) = 0;
asherkin@263
    90
asherkin@263
    91
#define _(name)                                         \
asherkin@263
    92
    bool is##name() const {                             \
asherkin@263
    93
        return op() == k##name;                         \
asherkin@263
    94
    }                                                   \
asherkin@263
    95
    H##name *to##name() {                               \
asherkin@263
    96
        assert(is##name());                             \
asherkin@263
    97
        return reinterpret_cast<H##name *>(this);       \
asherkin@263
    98
    }
asherkin@263
    99
    HIR_OPS(_)
asherkin@263
   100
#undef _
asherkin@263
   101
asherkin@263
   102
    HLValue *toLValue() {
asherkin@263
   103
        assert(isLValue());
asherkin@263
   104
        return reinterpret_cast<HLValue *>(this);
asherkin@263
   105
    }
asherkin@263
   106
asherkin@263
   107
  private:
asherkin@263
   108
    AstNode *node_;
asherkin@263
   109
    ScopedRoot<Type> type_;
asherkin@263
   110
};
asherkin@263
   111
asherkin@263
   112
class BytecodeEmitter;
asherkin@263
   113
asherkin@263
   114
class HIRVisitor
asherkin@263
   115
{
asherkin@263
   116
  public:
asherkin@263
   117
#define _(name)                                 \
asherkin@263
   118
    virtual void visit##name(H##name *hir) {    \
asherkin@263
   119
        assert(false);                          \
asherkin@263
   120
    }
asherkin@263
   121
    HIR_OPS(_)
asherkin@263
   122
#undef _
asherkin@263
   123
};
asherkin@263
   124
asherkin@263
   125
typedef PoolList<HIR *> HIRList;
asherkin@263
   126
asherkin@263
   127
#define DEFINE_HIR(name)                        \
asherkin@263
   128
    virtual HOp op() const {                    \
asherkin@263
   129
        return k##name;                         \
asherkin@263
   130
    }                                           \
asherkin@263
   131
    virtual void accept(HIRVisitor *visitor) {  \
asherkin@263
   132
        visitor->visit##name(this);             \
asherkin@263
   133
    }
asherkin@263
   134
asherkin@263
   135
class HBoolean : public HIR
asherkin@263
   136
{
asherkin@263
   137
  public:
asherkin@263
   138
    HBoolean(AstNode *node, Type *type, bool value)
asherkin@263
   139
      : HIR(node, type),
asherkin@263
   140
        value_(value)
asherkin@263
   141
    {
asherkin@263
   142
    }
asherkin@263
   143
asherkin@263
   144
    DEFINE_HIR(Boolean);
asherkin@263
   145
    bool value() const {
asherkin@263
   146
        return value_;
asherkin@263
   147
    }
asherkin@263
   148
asherkin@263
   149
  private:
asherkin@263
   150
    bool value_;
asherkin@263
   151
};
asherkin@263
   152
asherkin@263
   153
class HInteger : public HIR
asherkin@263
   154
{
asherkin@263
   155
  public:
asherkin@263
   156
    HInteger(AstNode *node, Type *type, int value)
asherkin@263
   157
      : HIR(node, type),
asherkin@263
   158
        value_(value)
asherkin@263
   159
    {
asherkin@263
   160
    }
asherkin@263
   161
asherkin@263
   162
    DEFINE_HIR(Integer);
asherkin@263
   163
    int value() const {
asherkin@263
   164
        return value_;
asherkin@263
   165
    }
asherkin@263
   166
asherkin@263
   167
  private:
asherkin@263
   168
    int value_;
asherkin@263
   169
};
asherkin@263
   170
asherkin@263
   171
class HString : public HIR
asherkin@263
   172
{
asherkin@263
   173
  public:
asherkin@263
   174
    HString(AstNode *node, Type *type, String *string)
asherkin@263
   175
      : HIR(node, type),
asherkin@263
   176
        string_(string)
asherkin@263
   177
    {
asherkin@263
   178
    }
asherkin@263
   179
asherkin@263
   180
    DEFINE_HIR(String);
asherkin@263
   181
    Handle<String> string() const {
asherkin@263
   182
        return string_;
asherkin@263
   183
    }
asherkin@263
   184
asherkin@263
   185
  private:
asherkin@263
   186
    ScopedRoot<String> string_;
asherkin@263
   187
};
asherkin@263
   188
asherkin@263
   189
class HImport : public HIR
asherkin@263
   190
{
asherkin@263
   191
  public:
asherkin@263
   192
    HImport(AstNode *node, Type *type, unsigned index)
asherkin@263
   193
      : HIR(node, type),
asherkin@263
   194
        index_(index)
asherkin@263
   195
    {
asherkin@263
   196
    }
asherkin@263
   197
asherkin@263
   198
    DEFINE_HIR(Import);
asherkin@263
   199
    unsigned index() const {
asherkin@263
   200
        return index_;
asherkin@263
   201
    }
asherkin@263
   202
asherkin@263
   203
  private:
asherkin@263
   204
    unsigned index_;
asherkin@263
   205
};
asherkin@263
   206
asherkin@263
   207
class HArray : public HIR
asherkin@263
   208
{
asherkin@263
   209
  public:
asherkin@263
   210
    HArray(AstNode *node, Type *type, Array *array, bool duplicate)
asherkin@263
   211
      : HIR(node, type),
asherkin@263
   212
        array_(array),
asherkin@263
   213
        duplicate_(duplicate)
asherkin@263
   214
    {
asherkin@263
   215
    }
asherkin@263
   216
asherkin@263
   217
    DEFINE_HIR(Array);
asherkin@263
   218
    Handle<Array> array() const {
asherkin@263
   219
        return array_;
asherkin@263
   220
    }
asherkin@263
   221
    bool duplicate() const {
asherkin@263
   222
        return duplicate_;
asherkin@263
   223
    }
asherkin@263
   224
asherkin@263
   225
  private:
asherkin@263
   226
    ScopedRoot<Array> array_;
asherkin@263
   227
    bool duplicate_;
asherkin@263
   228
};
asherkin@263
   229
asherkin@263
   230
class HConvert : public HIR
asherkin@263
   231
{
asherkin@263
   232
  public:
asherkin@263
   233
    HConvert(AstNode *node, Type *type, Opcode op, HIR *in)
asherkin@263
   234
      : HIR(node, type),
asherkin@263
   235
        op_(op),
asherkin@263
   236
        in_(in)
asherkin@263
   237
    {
asherkin@263
   238
    }
asherkin@263
   239
asherkin@263
   240
    DEFINE_HIR(Convert);
asherkin@263
   241
    Opcode opcode() const {
asherkin@263
   242
        return op_;
asherkin@263
   243
    }
asherkin@263
   244
    HIR *in() const {
asherkin@263
   245
        return in_;
asherkin@263
   246
    }
asherkin@263
   247
asherkin@263
   248
  private:
asherkin@263
   249
    Opcode op_;
asherkin@263
   250
    HIR *in_;
asherkin@263
   251
};
asherkin@263
   252
asherkin@263
   253
class HLValue : public HIR
asherkin@263
   254
{
asherkin@263
   255
  public:
asherkin@263
   256
    HLValue(AstNode *node, Type *type)
asherkin@263
   257
      : HIR(node, type)
asherkin@263
   258
    {
asherkin@263
   259
    }
asherkin@263
   260
asherkin@263
   261
    // Pushes a reference to the LValue on the stack.
asherkin@263
   262
    virtual void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_) = 0;
asherkin@263
   263
    
asherkin@263
   264
    // Duplicates a stack reference.
asherkin@263
   265
    virtual void hold(BytecodeEmitter &emitter_) = 0;
asherkin@263
   266
asherkin@263
   267
    // Reorders the stack for a post-increment operation:
asherkin@263
   268
    //   REF VAL -> VAL REF VAL
asherkin@263
   269
    virtual void swapAndPick(BytecodeEmitter &emitter_) = 0;
asherkin@263
   270
asherkin@263
   271
    // Given a stack layout of the form:
asherkin@263
   272
    //  [-1]    value
asherkin@263
   273
    //  [-2..n] ref
asherkin@263
   274
    //
asherkin@263
   275
    // Emits a store to the reference.
asherkin@263
   276
    virtual void store(BytecodeEmitter &emitter_) = 0;
asherkin@263
   277
    virtual void load(BytecodeEmitter &emitter_) = 0;
asherkin@263
   278
asherkin@263
   279
    // Try to make a direct reference, if semantics allow it. False if the
asherkin@263
   280
    // caller must allocate a reference to the stack.
asherkin@263
   281
    virtual bool ref(BytecodeEmitter &emitter_) = 0;
asherkin@263
   282
asherkin@263
   283
    bool isLValue() const {
asherkin@263
   284
        return true;
asherkin@263
   285
    }
asherkin@263
   286
};
asherkin@263
   287
asherkin@263
   288
class HLocal : public HLValue
asherkin@263
   289
{
asherkin@263
   290
  public:
asherkin@263
   291
    HLocal(AstNode *node, VariableSymbol *sym);
asherkin@263
   292
asherkin@263
   293
    DEFINE_HIR(Local);
asherkin@263
   294
asherkin@263
   295
    // Pushes a reference to the LValue on the stack.
asherkin@263
   296
    void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_);
asherkin@263
   297
    void hold(BytecodeEmitter &emitter_);
asherkin@263
   298
    void swapAndPick(BytecodeEmitter &emitter_);
asherkin@263
   299
    void store(BytecodeEmitter &emitter_);
asherkin@263
   300
    void load(BytecodeEmitter &emitter_);
asherkin@263
   301
    bool ref(BytecodeEmitter &emitter_);
asherkin@263
   302
asherkin@263
   303
    VariableSymbol *sym() const {
asherkin@263
   304
        return sym_;
asherkin@263
   305
    }
asherkin@263
   306
asherkin@263
   307
  private:
asherkin@263
   308
    VariableSymbol *sym_;
asherkin@263
   309
};
asherkin@263
   310
asherkin@263
   311
class HIndex : public HLValue
asherkin@263
   312
{
asherkin@263
   313
  public:
asherkin@263
   314
    HIndex(AstNode *node, Type *type, HIR *left, HIR *right)
asherkin@263
   315
      : HLValue(node, type),
asherkin@263
   316
        left_(left),
asherkin@263
   317
        right_(right)
asherkin@263
   318
    {
asherkin@263
   319
    }
asherkin@263
   320
asherkin@263
   321
    DEFINE_HIR(Index);
asherkin@263
   322
asherkin@263
   323
    void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_);
asherkin@263
   324
    void hold(BytecodeEmitter &emitter_);
asherkin@263
   325
    void swapAndPick(BytecodeEmitter &emitter_);
asherkin@263
   326
    void store(BytecodeEmitter &emitter_);
asherkin@263
   327
    void load(BytecodeEmitter &emitter_);
asherkin@263
   328
    bool ref(BytecodeEmitter &emitter_);
asherkin@263
   329
asherkin@263
   330
    HIR *base() const {
asherkin@263
   331
        return left_;
asherkin@263
   332
    }
asherkin@263
   333
    HIR *index() const {
asherkin@263
   334
        return right_;
asherkin@263
   335
    }
asherkin@263
   336
asherkin@263
   337
  private:
asherkin@263
   338
    HIR *left_;
asherkin@263
   339
    HIR *right_;
asherkin@263
   340
};
asherkin@263
   341
asherkin@263
   342
class HField : public HLValue
asherkin@263
   343
{
asherkin@263
   344
  public:
asherkin@263
   345
    HField(AstNode *node, HIR *left, Type *type, unsigned index)
asherkin@263
   346
      : HLValue(node, type),
asherkin@263
   347
        base_(left),
asherkin@263
   348
        index_(index)
asherkin@263
   349
    {
asherkin@263
   350
    }
asherkin@263
   351
asherkin@263
   352
    DEFINE_HIR(Field);
asherkin@263
   353
asherkin@263
   354
    void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_);
asherkin@263
   355
    void hold(BytecodeEmitter &emitter_);
asherkin@263
   356
    void swapAndPick(BytecodeEmitter &emitter_);
asherkin@263
   357
    void store(BytecodeEmitter &emitter_);
asherkin@263
   358
    void load(BytecodeEmitter &emitter_);
asherkin@263
   359
    bool ref(BytecodeEmitter &emitter_);
asherkin@263
   360
asherkin@263
   361
    HIR *base() const {
asherkin@263
   362
        return base_;
asherkin@263
   363
    }
asherkin@263
   364
    unsigned index() const {
asherkin@263
   365
        return index_;
asherkin@263
   366
    }
asherkin@263
   367
asherkin@263
   368
  private:
asherkin@263
   369
    HIR *base_;
asherkin@263
   370
    unsigned index_;
asherkin@263
   371
};
asherkin@263
   372
asherkin@263
   373
class HGlobal : public HLValue
asherkin@263
   374
{
asherkin@263
   375
  public:
asherkin@263
   376
    HGlobal(AstNode *node, Symbol *sym)
asherkin@263
   377
      : HLValue(node, sym->type()),
asherkin@263
   378
        sym_(sym)
asherkin@263
   379
    {
asherkin@263
   380
    }
asherkin@263
   381
asherkin@263
   382
    DEFINE_HIR(Global);
asherkin@263
   383
asherkin@263
   384
    void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_);
asherkin@263
   385
    void hold(BytecodeEmitter &emitter_);
asherkin@263
   386
    void swapAndPick(BytecodeEmitter &emitter_);
asherkin@263
   387
    void store(BytecodeEmitter &emitter_);
asherkin@263
   388
    void load(BytecodeEmitter &emitter_);
asherkin@263
   389
    bool ref(BytecodeEmitter &emitter_);
asherkin@263
   390
asherkin@263
   391
    Symbol *sym() const {
asherkin@263
   392
        return sym_;
asherkin@263
   393
    }
asherkin@263
   394
asherkin@263
   395
  private:
asherkin@263
   396
    Symbol *sym_;
asherkin@263
   397
};
asherkin@263
   398
asherkin@263
   399
class HBinary : public HIR
asherkin@263
   400
{
asherkin@263
   401
  public:
asherkin@263
   402
    HBinary(AstNode *node, Type *type, TokenKind token, HIR *left, HIR *right)
asherkin@263
   403
      : HIR(node, type),
asherkin@263
   404
        token_(token),
asherkin@263
   405
        left_(left),
asherkin@263
   406
        right_(right)
asherkin@263
   407
    {
asherkin@263
   408
    }
asherkin@263
   409
asherkin@263
   410
    DEFINE_HIR(Binary);
asherkin@263
   411
    TokenKind token() const {
asherkin@263
   412
        return token_;
asherkin@263
   413
    }
asherkin@263
   414
    HIR *left() const {
asherkin@263
   415
        return left_;
asherkin@263
   416
    }
asherkin@263
   417
    HIR *right() const {
asherkin@263
   418
        return right_;
asherkin@263
   419
    }
asherkin@263
   420
asherkin@263
   421
  private:
asherkin@263
   422
    TokenKind token_;
asherkin@263
   423
    HIR *left_;
asherkin@263
   424
    HIR *right_;
asherkin@263
   425
};
asherkin@263
   426
asherkin@263
   427
class HFloat : public HIR
asherkin@263
   428
{
asherkin@263
   429
  public:
asherkin@263
   430
    HFloat(AstNode *node, Type *type, float value)
asherkin@263
   431
      : HIR(node, type),
asherkin@263
   432
        value_(value)
asherkin@263
   433
    {
asherkin@263
   434
    }
asherkin@263
   435
asherkin@263
   436
    DEFINE_HIR(Float);
asherkin@263
   437
    float value() const {
asherkin@263
   438
        return value_;
asherkin@263
   439
    }
asherkin@263
   440
asherkin@263
   441
  private:
asherkin@263
   442
    float value_;
asherkin@263
   443
};
asherkin@263
   444
asherkin@263
   445
class HUnary : public HIR
asherkin@263
   446
{
asherkin@263
   447
  public:
asherkin@263
   448
    HUnary(AstNode *node, Type *type, TokenKind tok, HIR *in)
asherkin@263
   449
      : HIR(node, type),
asherkin@263
   450
        in_(in),
asherkin@263
   451
        token_(tok)
asherkin@263
   452
    {
asherkin@263
   453
    }
asherkin@263
   454
asherkin@263
   455
    DEFINE_HIR(Unary);
asherkin@263
   456
    HIR *in() const {
asherkin@263
   457
        return in_;
asherkin@263
   458
    }
asherkin@263
   459
    TokenKind token() const {
asherkin@263
   460
        return token_;
asherkin@263
   461
    }
asherkin@263
   462
asherkin@263
   463
  private:
asherkin@263
   464
    HIR *in_;
asherkin@263
   465
    TokenKind token_;
asherkin@263
   466
};
asherkin@263
   467
asherkin@263
   468
class HStore : public HIR
asherkin@263
   469
{
asherkin@263
   470
  public:
asherkin@263
   471
    HStore(AstNode *node, HLValue *lval, HIR *rval)
asherkin@263
   472
      : HIR(node, lval->type()),
asherkin@263
   473
        kind_(TOK_ASSIGN),
asherkin@263
   474
        lval_(lval),
asherkin@263
   475
        rval_(rval)
asherkin@263
   476
    {
asherkin@263
   477
    }
asherkin@263
   478
asherkin@263
   479
    HStore(AstNode *node, TokenKind kind, HLValue *lval, HIR *rval)
asherkin@263
   480
      : HIR(node, lval->type()),
asherkin@263
   481
        kind_(kind),
asherkin@263
   482
        lval_(lval),
asherkin@263
   483
        rval_(rval)
asherkin@263
   484
    {
asherkin@263
   485
    }
asherkin@263
   486
asherkin@263
   487
    DEFINE_HIR(Store);
asherkin@263
   488
asherkin@263
   489
    HLValue *lval() const {
asherkin@263
   490
        return lval_;
asherkin@263
   491
    }
asherkin@263
   492
    HIR *rval() const {
asherkin@263
   493
        return rval_;
asherkin@263
   494
    }
asherkin@263
   495
    TokenKind kind() const {
asherkin@263
   496
        return kind_;
asherkin@263
   497
    }
asherkin@263
   498
asherkin@263
   499
  private:
asherkin@263
   500
    TokenKind kind_;
asherkin@263
   501
    HLValue *lval_;
asherkin@263
   502
    HIR *rval_;
asherkin@263
   503
};
asherkin@263
   504
asherkin@263
   505
class HPostIncDec : public HIR
asherkin@263
   506
{
asherkin@263
   507
  public:
asherkin@263
   508
    HPostIncDec(AstNode *node, TokenKind kind, HLValue *lval, HIR *rval)
asherkin@263
   509
      : HIR(node, lval->type()),
asherkin@263
   510
        kind_(kind),
asherkin@263
   511
        lval_(lval),
asherkin@263
   512
        rval_(rval)
asherkin@263
   513
    {
asherkin@263
   514
    }
asherkin@263
   515
asherkin@263
   516
    DEFINE_HIR(PostIncDec);
asherkin@263
   517
asherkin@263
   518
    HLValue *lval() const {
asherkin@263
   519
        return lval_;
asherkin@263
   520
    }
asherkin@263
   521
    HIR *rval() const {
asherkin@263
   522
        return rval_;
asherkin@263
   523
    }
asherkin@263
   524
    TokenKind kind() const {
asherkin@263
   525
        return kind_;
asherkin@263
   526
    }
asherkin@263
   527
asherkin@263
   528
  private:
asherkin@263
   529
    TokenKind kind_;
asherkin@263
   530
    HLValue *lval_;
asherkin@263
   531
    HIR *rval_;
asherkin@263
   532
};
asherkin@263
   533
asherkin@263
   534
class HCall : public HIR
asherkin@263
   535
{
asherkin@263
   536
  public:
asherkin@263
   537
    HCall(AstNode *node, Type *type, HIR *callee, HIRList *args)
asherkin@263
   538
      : HIR(node, type),
asherkin@263
   539
        callee_(callee),
asherkin@263
   540
        args_(args)
asherkin@263
   541
    {
asherkin@263
   542
    }
asherkin@263
   543
asherkin@263
   544
    DEFINE_HIR(Call);
asherkin@263
   545
asherkin@263
   546
    HIR *callee() const {
asherkin@263
   547
        return callee_;
asherkin@263
   548
    }
asherkin@263
   549
    HIRList *args() const {
asherkin@263
   550
        return args_;
asherkin@263
   551
    }
asherkin@263
   552
asherkin@263
   553
  private:
asherkin@263
   554
    HIR *callee_;
asherkin@263
   555
    HIRList *args_;
asherkin@263
   556
};
asherkin@263
   557
asherkin@263
   558
class HToRef : public HIR
asherkin@263
   559
{
asherkin@263
   560
  public:
asherkin@263
   561
    HToRef(AstNode *node, Type *type, HIR *in)
asherkin@263
   562
      : HIR(node, type),
asherkin@263
   563
        in_(in)
asherkin@263
   564
    {
asherkin@263
   565
    }
asherkin@263
   566
asherkin@263
   567
    DEFINE_HIR(ToRef);
asherkin@263
   568
asherkin@263
   569
    HIR *in() const {
asherkin@263
   570
        return in_;
asherkin@263
   571
    }
asherkin@263
   572
asherkin@263
   573
  private:
asherkin@263
   574
    HIR *in_;
asherkin@263
   575
};
asherkin@263
   576
asherkin@263
   577
class HNewDependentArray : public HIR
asherkin@263
   578
{
asherkin@263
   579
  public:
asherkin@263
   580
    HNewDependentArray(AstNode *node, Type *type, HIR *base, HIR *index)
asherkin@263
   581
      : HIR(node, type),
asherkin@263
   582
        base_(base),
asherkin@263
   583
        index_(index)
asherkin@263
   584
    {
asherkin@263
   585
    }
asherkin@263
   586
asherkin@263
   587
    DEFINE_HIR(NewDependentArray);
asherkin@263
   588
asherkin@263
   589
    HIR *base() const {
asherkin@263
   590
        return base_;
asherkin@263
   591
    }
asherkin@263
   592
    HIR *index() const {
asherkin@263
   593
        return index_;
asherkin@263
   594
    }
asherkin@263
   595
asherkin@263
   596
  private:
asherkin@263
   597
    HIR *base_;
asherkin@263
   598
    HIR *index_;
asherkin@263
   599
};
asherkin@263
   600
asherkin@263
   601
#undef DEFINE_HIR
asherkin@263
   602
asherkin@263
   603
void EmitHIR(Zone *zone, BytecodeEmitter &emitter, HIR *hir);
asherkin@263
   604
asherkin@263
   605
}
asherkin@263
   606
asherkin@263
   607
#endif // _include_sp2_hir_h_