(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: NilChkExpr.m3 *) (* Last Modified On Sat Apr 7 02:13:52 1990 By muller *) (* Modified On Sat Feb 10 20:07:16 1990 By kalsow *) MODULE NilChkExpr; IMPORT Expr, ExprA, ExprRep, Type, Emit, AddressExpr, Temp, Wr, Target; TYPE P = ExprA.T OBJECT offset : INTEGER; METHODS bind := Bind; check := Check; compile := Compile; evaluate := Fold; fprint := FPrinter; write := ExprRep.NoWriter; isEqual := ExprA.EqCheck; getBounds := Bounder; isWritable := ExprRep.IsNever; isDesignator := ExprRep.IsNever; isZeroes := ExprRep.IsNever; genLiteral := ExprRep.NoLiteral; END; CONST EasyCheck = 1024 * Target.CHARSIZE; PROCEDURE New (a: Expr.T): Expr.T = VAR p: P; BEGIN IF (TYPECODE (a) = TYPECODE (P)) THEN RETURN a END; p := NEW (P); ExprRep.Init (p); p.a := a; p.offset := LAST (INTEGER); RETURN p; END New; PROCEDURE SetOffset (a: Expr.T; offset: INTEGER) = VAR p: P; BEGIN p := NARROW (a, P); p.offset := offset; END SetOffset; PROCEDURE Bind (p: P) = BEGIN Expr.Bind (p.a); p.type := Expr.TypeOf (p.a); END Bind; PROCEDURE Check (p: P) = BEGIN Expr.TypeCheck (p.a); END Check; PROCEDURE Compile (p: P): Temp.T = VAR t1, t2: Temp.T; BEGIN t1 := Expr.Compile (p.a); t2 := Temp.Alloc (p); IF p.offset < EasyCheck THEN Emit.OpTT ("NILCHECKA (@ = @);\n", t2, t1); ELSE Emit.OpTT ("NILCHECKB (@ = @);\n", t2, t1); END; Temp.Free (t1); RETURN t2; END Compile; PROCEDURE Fold (p: P): Expr.T = VAR e: Expr.T; i: INTEGER; BEGIN e := Expr.ConstValue (p.a); IF (e = NIL) THEN RETURN NIL END; IF NOT AddressExpr.Split (e, i) THEN RETURN NIL END; IF (i = 0) THEN RETURN NIL END; RETURN e; END Fold; PROCEDURE Bounder (p: P; VAR min, max: INTEGER) = BEGIN Expr.GetBounds (p.a, min, max); END Bounder; PROCEDURE FPrinter (p: P; map: Type.Map; wr: Wr.T) = BEGIN Wr.PutText (wr, "CHKN "); Expr.Fingerprint (p.a, map, wr); END FPrinter; BEGIN END NilChkExpr.