src/BytecodeCompiler.cpp
changeset 148 c0740249963c
parent 147 9c544823d090
child 149 b01ee7446984
     1.1 --- a/src/BytecodeCompiler.cpp	Sat Aug 04 19:33:06 2012 -0700
     1.2 +++ b/src/BytecodeCompiler.cpp	Sat Aug 04 20:12:20 2012 -0700
     1.3 @@ -228,6 +228,17 @@
     1.4                  __ get(var);
     1.5              }
     1.6          }
     1.7 +    } else if (node->lvalue()->isFieldExpression()) {
     1.8 +        FieldExpression *expr = node->lvalue()->toFieldExpression();
     1.9 +        __ note_position(expr->pos());
    1.10 +
    1.11 +        expr->left()->accept(this);
    1.12 +
    1.13 +        if (node->token() != TOK_ASSIGN) {
    1.14 +            __ dup();
    1.15 +            __ getfield(expr->fieldIndex(), expr->type());
    1.16 +        }
    1.17 +
    1.18      } else {
    1.19          IndexExpression *index = node->lvalue()->toIndexExpression();
    1.20          __ note_position(index->pos());
    1.21 @@ -276,6 +287,9 @@
    1.22              __ setref(var->type()->contained());
    1.23          else
    1.24              __ set(var);
    1.25 +    } else if (node->lvalue()->isFieldExpression()) {
    1.26 +        FieldExpression *expr = node->lvalue()->toFieldExpression();
    1.27 +        __ setfield(expr->fieldIndex(), expr->type());
    1.28      } else {
    1.29          IndexExpression *index = node->lvalue()->toIndexExpression();
    1.30          // :TODO: get rid of the BOUNDS instruction, embed it in g/setarray*?
    1.31 @@ -506,6 +520,13 @@
    1.32  }
    1.33  
    1.34  void
    1.35 +BytecodeCompiler::visit(FieldExpression *node)
    1.36 +{
    1.37 +    node->left()->accept(this);
    1.38 +    __ getfield(node->fieldIndex(), node->type());
    1.39 +}
    1.40 +
    1.41 +void
    1.42  BytecodeCompiler::visit(ReturnStatement *node)
    1.43  {
    1.44      if (node->expression()) {