diff -r 9c544823d090 -r c0740249963c src/BytecodeCompiler.cpp --- a/src/BytecodeCompiler.cpp Sat Aug 04 19:33:06 2012 -0700 +++ b/src/BytecodeCompiler.cpp Sat Aug 04 20:12:20 2012 -0700 @@ -228,6 +228,17 @@ __ get(var); } } + } else if (node->lvalue()->isFieldExpression()) { + FieldExpression *expr = node->lvalue()->toFieldExpression(); + __ note_position(expr->pos()); + + expr->left()->accept(this); + + if (node->token() != TOK_ASSIGN) { + __ dup(); + __ getfield(expr->fieldIndex(), expr->type()); + } + } else { IndexExpression *index = node->lvalue()->toIndexExpression(); __ note_position(index->pos()); @@ -276,6 +287,9 @@ __ setref(var->type()->contained()); else __ set(var); + } else if (node->lvalue()->isFieldExpression()) { + FieldExpression *expr = node->lvalue()->toFieldExpression(); + __ setfield(expr->fieldIndex(), expr->type()); } else { IndexExpression *index = node->lvalue()->toIndexExpression(); // :TODO: get rid of the BOUNDS instruction, embed it in g/setarray*? @@ -506,6 +520,13 @@ } void +BytecodeCompiler::visit(FieldExpression *node) +{ + node->left()->accept(this); + __ getfield(node->fieldIndex(), node->type()); +} + +void BytecodeCompiler::visit(ReturnStatement *node) { if (node->expression()) {