Browse Source

INCL/EXCL works for non-const second argument (as in a new report 07/13).

Vladislav Folts 11 years ago
parent
commit
98e44f9281
4 changed files with 21 additions and 12 deletions
  1. 12 7
      src/procedure.js
  2. 2 0
      test/expected/set.js
  3. 2 0
      test/input/set.ob
  4. 5 5
      test/test_unit.js

+ 12 - 7
src/procedure.js

@@ -188,17 +188,22 @@ var TwoArgToOperatorProcCallGenerator = ExpCallGenerator.extend({
     }
     }
 });
 });
 
 
-function setBitImpl(name, op){
+function setBitImpl(name, bitOp){
     var args = [new Arg(Type.basic.set, true),
     var args = [new Arg(Type.basic.set, true),
                 new Arg(Type.basic.integer, false)];
                 new Arg(Type.basic.integer, false)];
     function operator(x, y){
     function operator(x, y){
         var value = y.constValue();
         var value = y.constValue();
-        if (value === undefined || value < 0 || value > 31)
-            throw new Errors.Error("constant (0..31) expected as second argument of " + name);
-        var comment = "bit: " + (y.isTerm() ? value : Code.adjustPrecedence(y, precedence.shift));
-        value = 1 << value;
-        var valueCode = value + "/*" + comment + "*/";
-        return op(Code.adjustPrecedence(x, precedence.assignment), valueCode);
+        var valueCode;
+        if (value === undefined)
+            valueCode = op.lsl(new Code.Expression("1"), y).code();
+        else {
+            if (value < 0 || value > 31)
+                throw new Errors.Error("value (0..31) expected as a second argument of " + name + ", got " + value);
+            var comment = "bit: " + (y.isTerm() ? value : Code.adjustPrecedence(y, precedence.shift));
+            value = 1 << value;
+            valueCode = value + "/*" + comment + "*/";
+        }
+        return bitOp(Code.adjustPrecedence(x, precedence.assignment), valueCode);
     }
     }
     var proc = new Std(
     var proc = new Std(
         name,
         name,

+ 2 - 0
test/expected/set.js

@@ -97,8 +97,10 @@ s1 = ~s2;
 s2 |= 8/*bit: 3*/;
 s2 |= 8/*bit: 3*/;
 s1 |= 512/*bit: ((ci * 2 | 0) + 3 | 0)*/;
 s1 |= 512/*bit: ((ci * 2 | 0) + 3 | 0)*/;
 s1 |= 2/*bit: (cb ? 1 : 0)*/;
 s1 |= 2/*bit: (cb ? 1 : 0)*/;
+s2 |= 1 << i1;
 aSet[0] |= 8/*bit: 3*/;
 aSet[0] |= 8/*bit: 3*/;
 s2 &= ~(8/*bit: 3*/);
 s2 &= ~(8/*bit: 3*/);
 s2 &= ~(1/*bit: (!cb ? 1 : 0)*/);
 s2 &= ~(1/*bit: (!cb ? 1 : 0)*/);
+s2 &= ~(1 << i1);
 aSet[0] &= ~(8/*bit: 3*/);
 aSet[0] &= ~(8/*bit: 3*/);
 }();
 }();

+ 2 - 0
test/input/set.ob

@@ -57,9 +57,11 @@ BEGIN
 	INCL(s2, 3);
 	INCL(s2, 3);
 	INCL(s1, ci * 2 + 3);
 	INCL(s1, ci * 2 + 3);
 	INCL(s1, ORD(cb));
 	INCL(s1, ORD(cb));
+	INCL(s2, i1);
 	INCL(aSet[0], 3);
 	INCL(aSet[0], 3);
 
 
 	EXCL(s2, 3);
 	EXCL(s2, 3);
 	EXCL(s2, ORD(~cb));
 	EXCL(s2, ORD(~cb));
+	EXCL(s2, i1);
 	EXCL(aSet[0], 3);
 	EXCL(aSet[0], 3);
 END m.
 END m.

+ 5 - 5
test/test_unit.js

@@ -929,12 +929,12 @@ var testSuite = {
     context(Grammar.statement,
     context(Grammar.statement,
             "VAR set1, set2: SET; b: BOOLEAN; i: INTEGER;"),
             "VAR set1, set2: SET; b: BOOLEAN; i: INTEGER;"),
     pass("INCL(set1, 0)",
     pass("INCL(set1, 0)",
-         "EXCL(set1, 3)"),
+         "EXCL(set1, 3)",
+         "INCL(set1, i)",
+         "EXCL(set1, i)"),
     fail(["INCL({}, i)", "expression cannot be used as VAR parameter"],
     fail(["INCL({}, i)", "expression cannot be used as VAR parameter"],
-         ["INCL(set1, i)", "constant (0..31) expected as second argument of INCL"],
-         ["EXCL(set1, i)", "constant (0..31) expected as second argument of EXCL"],
-         ["INCL(set1, 32)", "constant (0..31) expected as second argument of INCL"],
-         ["EXCL(set1, -1)", "constant (0..31) expected as second argument of EXCL"]
+         ["INCL(set1, 32)", "value (0..31) expected as a second argument of INCL, got 32"],
+         ["EXCL(set1, -1)", "value (0..31) expected as a second argument of EXCL, got -1"]
         )
         )
     ),
     ),
 "procedure body": testWithGrammar(
 "procedure body": testWithGrammar(