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