# HG changeset patch # User David Anderson # Date 1344139607 25200 # Node ID b01ee74469841552afb31ba16254374073edc0cd # Parent c0740249963cdccbacc2aaa31240adf0ff1736ed Added incdec support for fields. diff -r c0740249963c -r b01ee7446984 src/BytecodeCompiler.cpp --- a/src/BytecodeCompiler.cpp Sat Aug 04 20:12:20 2012 -0700 +++ b/src/BytecodeCompiler.cpp Sat Aug 04 21:06:47 2012 -0700 @@ -351,6 +351,19 @@ if (node->postfix()) __ dup(); } + } else if (expr->isFieldExpression()) { + FieldExpression *field = expr->toFieldExpression(); + + field->left()->accept(this); + __ dup(); + __ getfield(field->fieldIndex(), field->type()); + + if (node->postfix()) { + // The stack looks like this now: + // OBJECT VALUE + __ swap(); // VALUE OBJECT + __ pick2(); // VALUE OBJECT VALUE + } } else { IndexExpression *index = expr->toIndexExpression(); __ note_position(index->pos()); @@ -397,7 +410,11 @@ __ setref(node->type()); else __ set(var); + } else if (expr->isFieldExpression()) { + FieldExpression *field = expr->toFieldExpression(); + __ setfield(field->fieldIndex(), field->type()); } else { + assert(expr->isIndexExpression()); __ setarray(node->type()); } diff -r c0740249963c -r b01ee7446984 src/SemanticAnalysis.cpp --- a/src/SemanticAnalysis.cpp Sat Aug 04 20:12:20 2012 -0700 +++ b/src/SemanticAnalysis.cpp Sat Aug 04 21:06:47 2012 -0700 @@ -1055,7 +1055,15 @@ return true; } - if (given->isEnum() || given->isFunction()) { + if (actual->isStruct()) { + if (!given->isStruct() || actual != given) { + typeMismatch(node, actual, given); + return false; + } + return true; + } + + if (given->isEnum() || given->isFunction() || given->isStruct()) { typeMismatch(node, actual, given); return false; }