src/BytecodeCompiler.cpp
changeset 145 e9d804821c48
parent 143 393f1b8ac8c3
child 146 dc7d3b7a918c
     1.1 --- a/src/BytecodeCompiler.cpp	Mon Jul 30 22:30:38 2012 -0700
     1.2 +++ b/src/BytecodeCompiler.cpp	Wed Aug 01 22:32:59 2012 -0700
     1.3 @@ -166,7 +166,7 @@
     1.4  
     1.5              // If this argument is actually a reference, dereference it now.
     1.6              if (var->type()->isReference())
     1.7 -                __ getref(var->type()->contained()->primitive());
     1.8 +                __ getref(var->type()->contained());
     1.9          }
    1.10          break;
    1.11        }
    1.12 @@ -223,7 +223,7 @@
    1.13  
    1.14              if (var->type()->isReference()) {
    1.15                  __ dup();
    1.16 -                __ getref(var->type()->contained()->primitive());
    1.17 +                __ getref(var->type()->contained());
    1.18              } else {
    1.19                  __ get(var);
    1.20              }
    1.21 @@ -248,7 +248,7 @@
    1.22              if (node->type()->isArray())
    1.23                  __ getarray_o();
    1.24              else
    1.25 -                __ getarray(node->type()->primitive());
    1.26 +                __ getarray(node->type());
    1.27          }
    1.28      }
    1.29  
    1.30 @@ -273,7 +273,7 @@
    1.31          Variable *var = proxy->binding()->toVariable();
    1.32  
    1.33          if (var->type()->isReference())
    1.34 -            __ setref(var->type()->contained()->primitive());
    1.35 +            __ setref(var->type()->contained());
    1.36          else
    1.37              __ set(var);
    1.38      } else {
    1.39 @@ -281,7 +281,7 @@
    1.40          // :TODO: get rid of the BOUNDS instruction, embed it in g/setarray*?
    1.41          // We can't emit it here because the stack is slightly out of position.
    1.42          // __ bounds();
    1.43 -        __ setarray(index->left()->type()->contained()->primitive());
    1.44 +        __ setarray(index->left()->type()->contained());
    1.45      }
    1.46  }
    1.47  
    1.48 @@ -326,7 +326,7 @@
    1.49          // Dup and fetch.
    1.50          if (var->type()->isReference()) {
    1.51              __ dup();
    1.52 -            __ getref(node->type()->primitive());
    1.53 +            __ getref(node->type());
    1.54              if (node->postfix()) {
    1.55                  __ swap();
    1.56                  __ pick2();
    1.57 @@ -347,7 +347,7 @@
    1.58          assert(!node->type()->isArray());
    1.59          __ bounds();
    1.60          __ dup2();
    1.61 -        __ getarray(node->type()->primitive());
    1.62 +        __ getarray(node->type());
    1.63  
    1.64          if (node->postfix()) {
    1.65              // The stack looks like this now:
    1.66 @@ -380,11 +380,11 @@
    1.67          Variable *var = proxy->binding()->toVariable();
    1.68  
    1.69          if (var->type()->isReference())
    1.70 -            __ setref(node->type()->primitive());
    1.71 +            __ setref(node->type());
    1.72          else
    1.73              __ set(var);
    1.74      } else {
    1.75 -        __ setarray(node->type()->primitive());
    1.76 +        __ setarray(node->type());
    1.77      }
    1.78  
    1.79      // Perform step (8).
    1.80 @@ -413,13 +413,15 @@
    1.81  void
    1.82  BytecodeCompiler::visit(UnaryExpression *node)
    1.83  {
    1.84 +    Local<Type> out(zone_, ((Expression *)node)->type());
    1.85 +
    1.86      switch (node->token()) {
    1.87        case TOK_MINUS:
    1.88        {
    1.89          Local<Type> type(zone_, node->expression()->type());
    1.90          node->expression()->accept(this);
    1.91          
    1.92 -        if (node->type()->isFloat())
    1.93 +        if (out->isFloat())
    1.94              __ neg_f();
    1.95          else
    1.96              __ neg();
    1.97 @@ -431,7 +433,7 @@
    1.98          Local<Type> type(zone_, node->expression()->type());
    1.99          node->expression()->accept(this);
   1.100          
   1.101 -        if (node->type()->isFloat())
   1.102 +        if (out->isFloat())
   1.103              __ not_f();
   1.104          else
   1.105              __ not_();
   1.106 @@ -441,12 +443,11 @@
   1.107        case TOK_LABEL:
   1.108        {
   1.109          Local<Type> from(zone_, node->expression()->type());
   1.110 -        Local<Type> to(zone_, node->type());
   1.111  
   1.112          node->expression()->accept(this);
   1.113 -        if (!from->isFloat() && to->isFloat())
   1.114 +        if (!from->isFloat() && out->isFloat())
   1.115              __ bits_f2i();
   1.116 -        else if (from->isFloat() && !to->isFloat())
   1.117 +        else if (from->isFloat() && !out->isFloat())
   1.118              __ bits_i2f();
   1.119          break;
   1.120        }
   1.121 @@ -501,7 +502,7 @@
   1.122      if (node->type()->isArray())
   1.123          __ getarray_o();
   1.124      else
   1.125 -        __ getarray(node->type()->primitive());
   1.126 +        __ getarray(node->type());
   1.127  }
   1.128  
   1.129  void