ByteSized and PointerSized functions.

This commit is contained in:
David Brown 2016-08-19 12:55:12 +01:00
parent 2271062636
commit dd4de5aeed
2 changed files with 20 additions and 9 deletions

View file

@ -932,7 +932,8 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
CASE f OF CASE f OF
OPM.Undef, OPM.Undef,
OPM.String: OPM.String:
| OPM.Byte: IF ~(g IN {OPM.Byte, OPM.Char, OPM.SInt}) THEN err(113) END | OPM.Byte: IF ~( (g IN {OPM.Byte, OPM.Char})
OR ((g IN OPM.intSet) & (y.size = 1))) THEN err(113) END
| OPM.Bool, | OPM.Bool,
OPM.Char, OPM.Char,
OPM.Set: IF g # f THEN err(113) END OPM.Set: IF g # f THEN err(113) END
@ -1014,6 +1015,16 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
BEGIN RETURN -SignedMaximum(bytecount) - 1 BEGIN RETURN -SignedMaximum(bytecount) - 1
END SignedMinimum; END SignedMinimum;
PROCEDURE ByteSized(typ: OPT.Struct): BOOLEAN;
BEGIN RETURN (typ.form IN {OPM.Byte..OPM.Char})
OR (typ.form IN OPM.intSet) & (typ.size = 1);
END ByteSized;
PROCEDURE PointerSized(typ: OPT.Struct): BOOLEAN;
BEGIN RETURN (typ.form = OPM.Pointer)
OR (typ.form IN OPM.intSet) & (typ.size = OPM.PointerSize)
END PointerSized;
PROCEDURE StPar0*(VAR par0: OPT.Node; fctno: INTEGER); (* par0: first param of standard proc *) PROCEDURE StPar0*(VAR par0: OPT.Node; fctno: INTEGER); (* par0: first param of standard proc *)
VAR f: INTEGER; typ: OPT.Struct; x: OPT.Node; VAR f: INTEGER; typ: OPT.Struct; x: OPT.Node;
BEGIN x := par0; f := x^.typ^.form; BEGIN x := par0; f := x^.typ^.form;
@ -1133,7 +1144,7 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
|OPM.ashfn: (*ASH*) |OPM.ashfn: (*ASH*)
IF (x^.class = OPM.Ntype) OR (x^.class = OPM.Nproc) THEN err(126) IF (x^.class = OPM.Ntype) OR (x^.class = OPM.Nproc) THEN err(126)
ELSIF f IN OPM.intSet THEN ELSIF f IN OPM.intSet THEN
IF f # OPM.LInt THEN Convert(x, OPT.linttyp) END IF x.typ.size # OPM.LIntSize THEN Convert(x, OPT.linttyp) END
ELSE err(111); x^.typ := OPT.linttyp ELSE err(111); x^.typ := OPT.linttyp
END END
|OPM.adrfn: (*SYSTEM.ADR*) |OPM.adrfn: (*SYSTEM.ADR*)
@ -1157,8 +1168,8 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
OPM.bitfn, OPM.bitfn,
OPM.movefn: (*SYSTEM.GET, SYSTEM.PUT, SYSTEM.BIT, SYSTEM.MOVE*) OPM.movefn: (*SYSTEM.GET, SYSTEM.PUT, SYSTEM.BIT, SYSTEM.MOVE*)
IF (x^.class = OPM.Ntype) OR (x^.class = OPM.Nproc) THEN err(126) IF (x^.class = OPM.Ntype) OR (x^.class = OPM.Nproc) THEN err(126)
ELSIF (x^.class = OPM.Nconst) & (f IN {OPM.SInt, OPM.Int}) THEN Convert(x, OPT.linttyp) ELSIF (x^.class = OPM.Nconst) & (f IN OPM.intSet) & (x.typ.size < OPT.linttyp.size) THEN Convert(x, OPT.linttyp)
ELSIF ~(f IN {OPM.LInt, OPM.Pointer}) THEN err(111); x^.typ := OPT.linttyp ELSIF ~PointerSized(x.typ) THEN err(111); x^.typ := OPT.linttyp
END END
|OPM.getrfn, |OPM.getrfn,
OPM.putrfn: (*SYSTEM.GETREG, SYSTEM.PUTREG*) OPM.putrfn: (*SYSTEM.GETREG, SYSTEM.PUTREG*)
@ -1325,8 +1336,8 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
p^.typ := OPT.notyp p^.typ := OPT.notyp
|OPM.movefn: (*SYSTEM.MOVE*) |OPM.movefn: (*SYSTEM.MOVE*)
IF (x^.class = OPM.Ntype) OR (x^.class = OPM.Nproc) THEN err(126) IF (x^.class = OPM.Ntype) OR (x^.class = OPM.Nproc) THEN err(126)
ELSIF (x^.class = OPM.Nconst) & (f IN {OPM.SInt, OPM.Int}) THEN Convert(x, OPT.linttyp) ELSIF (x^.class = OPM.Nconst) & (f IN OPM.intSet) & (x.typ.size < OPT.linttyp.size) THEN Convert(x, OPT.linttyp)
ELSIF ~(f IN {OPM.LInt, OPM.Pointer}) THEN err(111); x^.typ := OPT.linttyp ELSIF ~(PointerSized(x.typ)) THEN err(111); x^.typ := OPT.linttyp
END ; END ;
p^.link := x p^.link := x
|OPM.assertfn: (*ASSERT*) |OPM.assertfn: (*ASSERT*)
@ -1422,7 +1433,7 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
BEGIN (* ftyp^.comp = OPM.DynArr *) BEGIN (* ftyp^.comp = OPM.DynArr *)
f := atyp^.comp; ftyp := ftyp^.BaseTyp; atyp := atyp^.BaseTyp; f := atyp^.comp; ftyp := ftyp^.BaseTyp; atyp := atyp^.BaseTyp;
IF fvarpar & (ftyp = OPT.bytetyp) THEN (* ok, but ... *) IF fvarpar & (ftyp = OPT.bytetyp) THEN (* ok, but ... *)
IF ~(f IN {OPM.Array, OPM.DynArr}) OR ~(atyp^.form IN {OPM.Byte..OPM.SInt}) THEN IF ~(f IN {OPM.Array, OPM.DynArr}) OR ~(ByteSized(atyp)) THEN
IF OPM.verbose IN OPM.opt THEN err(-301) END IF OPM.verbose IN OPM.opt THEN err(-301) END
END END
ELSIF f IN {OPM.Array, OPM.DynArr} THEN ELSIF f IN {OPM.Array, OPM.DynArr} THEN
@ -1475,7 +1486,7 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
WHILE (q # fp^.typ) & (q # NIL) & (q # OPT.undftyp) DO q := q^.BaseTyp END ; WHILE (q # fp^.typ) & (q # NIL) & (q # OPT.undftyp) DO q := q^.BaseTyp END ;
IF q = NIL THEN err(111) END IF q = NIL THEN err(111) END
ELSIF (fp^.typ = OPT.sysptrtyp) & (ap^.typ^.form = OPM.Pointer) THEN (* ok *) ELSIF (fp^.typ = OPT.sysptrtyp) & (ap^.typ^.form = OPM.Pointer) THEN (* ok *)
ELSIF (ap^.typ # fp^.typ) & ~((fp^.typ^.form = OPM.Byte) & (ap^.typ^.form IN {OPM.Char, OPM.SInt})) THEN err(123) ELSIF (ap^.typ # fp^.typ) & ~((fp^.typ^.form = OPM.Byte) & (ByteSized(ap.typ))) THEN err(123)
ELSIF (fp^.typ^.form = OPM.Pointer) & (ap^.class = OPM.Nguard) THEN err(123) ELSIF (fp^.typ^.form = OPM.Pointer) & (ap^.class = OPM.Nguard) THEN err(123)
END END
ELSIF fp^.typ^.comp = OPM.DynArr THEN ELSIF fp^.typ^.comp = OPM.DynArr THEN

View file

@ -46,7 +46,7 @@ assemble:
@printf "\nmake assemble - compiling Oberon compiler c source:\n" @printf "\nmake assemble - compiling Oberon compiler c source:\n"
@printf " VERSION: %s\n" "$(VERSION)" @printf " VERSION: %s\n" "$(VERSION)"
@printf " BRANCH: %s\n" "$(BRANCH)" @printf " BRANCH: %s\n" "$(BRANCH)"
@printf " Target characeristics:\n" @printf " Target characteristics:\n"
@printf " PLATFORM: %s\n" "$(PLATFORM)" @printf " PLATFORM: %s\n" "$(PLATFORM)"
@printf " OS: %s\n" "$(OS)" @printf " OS: %s\n" "$(OS)"
@printf " BUILDDIR: %s\n" "$(BUILDDIR)" @printf " BUILDDIR: %s\n" "$(BUILDDIR)"