(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: Loophole.m3 *) (* Last Modified On Tue Mar 20 03:15:44 1990 By muller *) (* Modified On Mon Jul 24 09:53:25 1989 By kalsow *) MODULE Loophole; IMPORT CallExpr, Expr, Type, Procedure, CastExpr; IMPORT Int, Module, TypeExpr, Error, Temp; VAR Z: CallExpr.MethodList; PROCEDURE Bind (<*UNUSED*> proc: Expr.T; args: Expr.List): Type.T = VAR t: Type.T; BEGIN IF NOT TypeExpr.Split (args[1], t) THEN t := Int.T END; args[0] := CastExpr.New (args[0], t); Expr.Bind (args[0]); RETURN t; END Bind; PROCEDURE Check (<*UNUSED*> proc: Expr.T; <*UNUSED*> VAR args: Expr.List) = BEGIN IF Module.IsSafe () THEN Error.Msg ("LOOPHOLE: unsafe operation") END; END Check; PROCEDURE Compile (<*UNUSED*> proc: Expr.T; args: Expr.List): Temp.T = BEGIN RETURN Expr.Compile (args[0]); END Compile; PROCEDURE Fold (<*UNUSED*> proc: Expr.T; args: Expr.List): Expr.T = BEGIN RETURN Expr.ConstValue (args[0]); END Fold; PROCEDURE IsWritable (<*UNUSED*> proc: Expr.T; args: Expr.List): BOOLEAN = BEGIN RETURN Expr.IsWritable (args[0]); END IsWritable; PROCEDURE IsDesignator (<*UNUSED*> proc: Expr.T; args: Expr.List): BOOLEAN = BEGIN RETURN Expr.IsDesignator (args[0]); END IsDesignator; PROCEDURE Initialize () = BEGIN Z := CallExpr.NewMethodList (2, 2, TRUE, Bind, Check, Compile, Fold, IsWritable, IsDesignator); Procedure.Define ("LOOPHOLE", Z); END Initialize; BEGIN END Loophole.