(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: Adr.m3 *) (* Last Modified On Tue Mar 20 03:03:19 1990 By muller *) (* Modified On Tue Jan 16 14:58:17 1990 By kalsow *) MODULE Adr; IMPORT CallExpr, Expr, Type, Procedure, Error, Emit, Module, Address, Temp; VAR Z: CallExpr.MethodList; PROCEDURE Bind (<*UNUSED*> proc: Expr.T; <*UNUSED*> args: Expr.List): Type.T = BEGIN RETURN Address.T; END Bind; PROCEDURE Check (<*UNUSED*> proc: Expr.T; VAR args: Expr.List) = BEGIN IF Module.IsSafe () THEN Error.Msg ("unsafe operation") END; IF NOT Expr.IsDesignator (args[0]) THEN Error.Msg ("ADR: argument must be a designator"); END; END Check; PROCEDURE Compile (<*UNUSED*> proc: Expr.T; args: Expr.List): Temp.T = VAR t1, t2: Temp.T; BEGIN t1 := Expr.CompileLValue (args[0]); t2 := Temp.AllocEmpty (Address.T); Emit.OpTT ("@ = (char*)(& @);\n", t2, t1); Temp.Free (t1); RETURN t2; END Compile; PROCEDURE Initialize () = BEGIN Z := CallExpr.NewMethodList (1, 1, TRUE, Bind, Check, Compile, CallExpr.NoValue, CallExpr.IsNever, (* writable *) CallExpr.IsNever(* designator *)); Procedure.Define ("ADR", Z); END Initialize; BEGIN END Adr.