diff --git a/src/compiler/OPB.Mod b/src/compiler/OPB.Mod old mode 100644 new mode 100755 index 84085804..bb7ba725 --- a/src/compiler/OPB.Mod +++ b/src/compiler/OPB.Mod @@ -34,6 +34,16 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *) ELSE node := OPT.NewNode(OPT.Nvar); err(127) END ; node^.obj := obj; node^.typ := obj^.typ; + + (* Array and record value parameters with copy disabled are readonly *) + (* + IF (obj.mode = OPT.Var) + & (obj.typ.comp IN {OPT.Array, OPT.DynArr}) + & (obj.typ.sysflag # 0) THEN + node.readonly := TRUE; + END ; + *) + RETURN node END NewLeaf; @@ -849,17 +859,6 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *) p, q: OPT.Struct; BEGIN y := ynode^.typ; f := x^.form; g := y^.form; - (* - IF OPM.verbose IN OPM.Options THEN - OPM.LogWLn; OPM.LogWStr("PROCEDURE CheckAssign"); OPM.LogWLn; - END; - IF OPM.verbose IN OPM.Options THEN - OPM.LogWStr("y.form = "); OPM.LogWNum(y.form, 0); OPM.LogWLn; - OPM.LogWStr("f = "); OPM.LogWNum(f, 0); OPM.LogWLn; - OPM.LogWStr("g = "); OPM.LogWNum(g, 0); OPM.LogWLn; - OPM.LogWStr("ynode.typ.syze = "); OPM.LogWNum(ynode.typ.size, 0); OPM.LogWLn; - END; - *) IF (ynode^.class = OPT.Ntype) OR (ynode^.class = OPT.Nproc) & (f # OPT.ProcTyp) THEN err(126) END ; CASE f OF OPT.Undef, @@ -1340,10 +1339,12 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *) END StFct; PROCEDURE DynArrParCheck(ftyp, atyp: OPT.Struct; fvarpar: BOOLEAN); - VAR f: INTEGER; + VAR f, sysflag: INTEGER; BEGIN (* ftyp^.comp = OPT.DynArr *) + sysflag := ftyp.sysflag; f := atyp^.comp; ftyp := ftyp^.BaseTyp; atyp := atyp^.BaseTyp; - IF fvarpar & (ftyp = OPT.bytetyp) THEN (* ok, but ... *) + IF (fvarpar OR (sysflag # 0)) & (ftyp = OPT.bytetyp) THEN (* ok, but ... *) + (* Allow any parameter type, but give warning in verbose mode *) IF ~(f IN {OPT.Array, OPT.DynArr}) OR ~((atyp.form IN {OPT.Byte..OPT.Char, OPT.Int}) & (atyp.size = 1)) THEN IF OPM.verbose IN OPM.Options THEN err(-301) END END