Added incdec support for fields.
authorDavid Anderson <dvander@alliedmods.net>
Sat Aug 04 21:06:47 2012 -0700 (2012-08-04)
changeset 149b01ee7446984
parent 148 c0740249963c
child 150 457110815c87
Added incdec support for fields.
src/BytecodeCompiler.cpp
src/SemanticAnalysis.cpp
     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      }