[Oberon] Static variable overflow (bug?)

Skulski, Wojciech skulski at pas.rochester.edu
Thu Feb 27 14:35:06 CET 2020


>Below is a slightly more elaborate variant that fixes the current bug in ORG.Put1a
>and makes MyViewers.Mod (see below) work on a Project Oberon 2013 system:

How about 
CONST LIMIT = 10000H; ULIMIT = 0FFFFH; (* Upper limit = LIMIT -1 = 0FFFFH; *)

  PROCEDURE Put1a(op, a, b, im: LONGINT);
      VAR r: INTEGER;
  (*same as Put1, but with range test  -10000H<= im < 10000H*)
  (*same as Put1, but with range test    -LIMIT <= im < LIMIT *)
      IF (im >= -LIMIT ) & (im <= ULIMIT) THEN Put1(op, a, b, im)
      ELSIF op = Mov THEN
          Put1(Mov+U, a, 0, im DIV LIMIT );
          IF im MOD LIMIT # 0 THEN Put1(Ior, a, a, im MOD LIMIT ) END
      ELSE r := RH;
          IF b = RH THEN incR END ;
          Put1(Mov+U, RH, 0, im DIV LIMIT );
          IF im MOD LIMIT # 0 THEN Put1(Ior, RH, RH, im MOD LIMIT ) END ;
          Put0(op, a, b, RH);
          IF RH > r THEN DEC(RH) END
  END Put1a;

0. Using literal constants in the code is a universally condemned programming practice.
1. Procedure incR is to be moved up to before procedure ORG.Put0
2. The use of incR ensures that in fact we do have enough registers available
3. Register optimization: But a new register is used only when needed (when b = RH)
4. Instruction optimization: For op = Mov, the extra MOV instruction at the end is avoided

More information about the Oberon mailing list