Added incdec support for fields.
Added incdec support for fields.
1.1 --- a/src/BytecodeCompiler.cpp Sat Aug 04 20:12:20 2012 -0700
1.2 +++ b/src/BytecodeCompiler.cpp Sat Aug 04 21:06:47 2012 -0700
1.3 @@ -351,6 +351,19 @@
1.4 if (node->postfix())
1.5 __ dup();
1.6 }
1.7 + } else if (expr->isFieldExpression()) {
1.8 + FieldExpression *field = expr->toFieldExpression();
1.9 +
1.10 + field->left()->accept(this);
1.11 + __ dup();
1.12 + __ getfield(field->fieldIndex(), field->type());
1.13 +
1.14 + if (node->postfix()) {
1.15 + // The stack looks like this now:
1.16 + // OBJECT VALUE
1.17 + __ swap(); // VALUE OBJECT
1.18 + __ pick2(); // VALUE OBJECT VALUE
1.19 + }
1.20 } else {
1.21 IndexExpression *index = expr->toIndexExpression();
1.22 __ note_position(index->pos());
1.23 @@ -397,7 +410,11 @@
1.24 __ setref(node->type());
1.25 else
1.26 __ set(var);
1.27 + } else if (expr->isFieldExpression()) {
1.28 + FieldExpression *field = expr->toFieldExpression();
1.29 + __ setfield(field->fieldIndex(), field->type());
1.30 } else {
1.31 + assert(expr->isIndexExpression());
1.32 __ setarray(node->type());
1.33 }
1.34
2.1 --- a/src/SemanticAnalysis.cpp Sat Aug 04 20:12:20 2012 -0700
2.2 +++ b/src/SemanticAnalysis.cpp Sat Aug 04 21:06:47 2012 -0700
2.3 @@ -1055,7 +1055,15 @@
2.4 return true;
2.5 }
2.6
2.7 - if (given->isEnum() || given->isFunction()) {
2.8 + if (actual->isStruct()) {
2.9 + if (!given->isStruct() || actual != given) {
2.10 + typeMismatch(node, actual, given);
2.11 + return false;
2.12 + }
2.13 + return true;
2.14 + }
2.15 +
2.16 + if (given->isEnum() || given->isFunction() || given->isStruct()) {
2.17 typeMismatch(node, actual, given);
2.18 return false;
2.19 }