Browse Source

Fix code generation for ternary operator and VAR parameters.

Vladislav Folts 9 years ago
parent
commit
03e4af9c82

BIN
bin/compiled.zip


+ 2 - 2
src/eberon/EberonContextExpression.ob

@@ -205,8 +205,8 @@ BEGIN
         END;
 
         result := Expression.makeSimple(SELF.condition.code() + " ? " 
-                                        + SELF.first.code() + " : "
-                                        + SELF.second.code(),
+                                        + Expression.deref(SELF.first).code() + " : "
+                                        + Expression.deref(SELF.second).code(),
                                         resultType);
     END;
     SELF.parent()(ContextExpression.PExpressionHandler).handleExpression(result);

+ 12 - 0
test/expected/eberon/ternary_operator.js

@@ -7,4 +7,16 @@ function integer(b/*BOOLEAN*/, i1/*INTEGER*/, i2/*INTEGER*/){
 function integer2(b1/*BOOLEAN*/, b2/*BOOLEAN*/, i1/*INTEGER*/, i2/*INTEGER*/, i3/*INTEGER*/){
 	return b1 ? i1 : b2 ? i2 : i3;
 }
+
+function byRef(b/*BOOLEAN*/, i1/*VAR INTEGER*/, i2/*VAR INTEGER*/){
+	return b ? i1.get() : i2.get();
+}
+
+function byRef1(b/*BOOLEAN*/, i1/*VAR INTEGER*/, i2/*INTEGER*/){
+	return b ? i1.get() : i2;
+}
+
+function byRef2(b/*BOOLEAN*/, i1/*INTEGER*/, i2/*VAR INTEGER*/){
+	return b ? i1 : i2.get();
+}
 }();

+ 12 - 0
test/input/eberon/ternary_operator.ob

@@ -8,4 +8,16 @@ PROCEDURE integer2(b1, b2: BOOLEAN; i1, i2, i3: INTEGER): INTEGER;
     RETURN b1 ? i1 : b2 ? i2 : i3;
 END;
 
+PROCEDURE byRef(b: BOOLEAN; VAR i1, i2: INTEGER): INTEGER;
+    RETURN b ? i1 : i2;
+END;
+
+PROCEDURE byRef1(b: BOOLEAN; VAR i1: INTEGER; i2: INTEGER): INTEGER;
+    RETURN b ? i1 : i2;
+END;
+
+PROCEDURE byRef2(b: BOOLEAN; i1: INTEGER; VAR i2: INTEGER): INTEGER;
+    RETURN b ? i1 : i2;
+END;
+
 END test.

+ 3 - 1
test/test_unit_eberon.js

@@ -1526,6 +1526,7 @@ exports.suite = {
                 + "PROCEDURE passDerived(d: Derived): BOOLEAN; RETURN TRUE END;"
                 + "PROCEDURE passPBase(p: PBase): BOOLEAN; RETURN TRUE END;"
                 + "PROCEDURE passPDerived(p: PDerived): BOOLEAN; RETURN TRUE END;"
+                + "PROCEDURE passRef(VAR i: INTEGER): BOOLEAN; RETURN TRUE END;"
                 ),
         pass("b ? i1 : i2",
              "(b ? i1 : i2) # 0",
@@ -1558,7 +1559,8 @@ exports.suite = {
              ["b ? b ? i1 : i2 : i1", "expected \":\" after \"?\" in ternary operator"],
              ["b ? rb : NIL", "incompatible types in ternary operator: 'Base' and 'NIL'"],
              ["passPDerived(b ? NIL : pb)", "type mismatch for argument 1: 'PBase' cannot be converted to 'PDerived'"],
-             ["passPDerived(b ? pb : NIL)", "type mismatch for argument 1: 'PBase' cannot be converted to 'PDerived'"]
+             ["passPDerived(b ? pb : NIL)", "type mismatch for argument 1: 'PBase' cannot be converted to 'PDerived'"],
+             ["passRef(b ? i1 : i2)", "expression cannot be used as VAR parameter"]
              )
     )
 };