diff -r a8735148dcf0 -r e9d804821c48 src/BytecodeCompiler.cpp --- a/src/BytecodeCompiler.cpp Mon Jul 30 22:30:38 2012 -0700 +++ b/src/BytecodeCompiler.cpp Wed Aug 01 22:32:59 2012 -0700 @@ -166,7 +166,7 @@ // If this argument is actually a reference, dereference it now. if (var->type()->isReference()) - __ getref(var->type()->contained()->primitive()); + __ getref(var->type()->contained()); } break; } @@ -223,7 +223,7 @@ if (var->type()->isReference()) { __ dup(); - __ getref(var->type()->contained()->primitive()); + __ getref(var->type()->contained()); } else { __ get(var); } @@ -248,7 +248,7 @@ if (node->type()->isArray()) __ getarray_o(); else - __ getarray(node->type()->primitive()); + __ getarray(node->type()); } } @@ -273,7 +273,7 @@ Variable *var = proxy->binding()->toVariable(); if (var->type()->isReference()) - __ setref(var->type()->contained()->primitive()); + __ setref(var->type()->contained()); else __ set(var); } else { @@ -281,7 +281,7 @@ // :TODO: get rid of the BOUNDS instruction, embed it in g/setarray*? // We can't emit it here because the stack is slightly out of position. // __ bounds(); - __ setarray(index->left()->type()->contained()->primitive()); + __ setarray(index->left()->type()->contained()); } } @@ -326,7 +326,7 @@ // Dup and fetch. if (var->type()->isReference()) { __ dup(); - __ getref(node->type()->primitive()); + __ getref(node->type()); if (node->postfix()) { __ swap(); __ pick2(); @@ -347,7 +347,7 @@ assert(!node->type()->isArray()); __ bounds(); __ dup2(); - __ getarray(node->type()->primitive()); + __ getarray(node->type()); if (node->postfix()) { // The stack looks like this now: @@ -380,11 +380,11 @@ Variable *var = proxy->binding()->toVariable(); if (var->type()->isReference()) - __ setref(node->type()->primitive()); + __ setref(node->type()); else __ set(var); } else { - __ setarray(node->type()->primitive()); + __ setarray(node->type()); } // Perform step (8). @@ -413,13 +413,15 @@ void BytecodeCompiler::visit(UnaryExpression *node) { + Local out(zone_, ((Expression *)node)->type()); + switch (node->token()) { case TOK_MINUS: { Local type(zone_, node->expression()->type()); node->expression()->accept(this); - if (node->type()->isFloat()) + if (out->isFloat()) __ neg_f(); else __ neg(); @@ -431,7 +433,7 @@ Local type(zone_, node->expression()->type()); node->expression()->accept(this); - if (node->type()->isFloat()) + if (out->isFloat()) __ not_f(); else __ not_(); @@ -441,12 +443,11 @@ case TOK_LABEL: { Local from(zone_, node->expression()->type()); - Local to(zone_, node->type()); node->expression()->accept(this); - if (!from->isFloat() && to->isFloat()) + if (!from->isFloat() && out->isFloat()) __ bits_f2i(); - else if (from->isFloat() && !to->isFloat()) + else if (from->isFloat() && !out->isFloat()) __ bits_i2f(); break; } @@ -501,7 +502,7 @@ if (node->type()->isArray()) __ getarray_o(); else - __ getarray(node->type()->primitive()); + __ getarray(node->type()); } void