(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: ReturnStmt.m3 *) (* Last modified on Tue Apr 10 22:55:36 1990 by muller *) (* modified on Sat Feb 10 20:40:58 1990 by kalsow *) MODULE ReturnStmt; IMPORT Expr, Error, Emit, Type, AssignStmt, Token, Scanner; IMPORT Variable, Void, Temp, Marker, String, Stmt, StmtRep; TYPE P = Stmt.T OBJECT expr : Expr.T; METHODS bind := Bind; check := Check; precompile := Precompile; compile := Compile; END; PROCEDURE Parse (READONLY fail: Token.Set): Stmt.T = VAR p: P; BEGIN p := NEW (P); StmtRep.Init (p); p.expr := NIL; Scanner.Match (Token.T.tRETURN, fail, Token.ExprStart); IF (Scanner.cur.token IN Token.ExprStart) THEN p.expr := Expr.Parse (fail); END; RETURN p; END Parse; PROCEDURE Bind (p: P) = BEGIN Expr.Bind (p.expr); END Bind; PROCEDURE Check (p: P) = VAR void: BOOLEAN; t: Type.T; v: Variable.T; BEGIN IF NOT Marker.ReturnOK () THEN Error.Msg ("RETURN not in a procedure"); RETURN ; END; Marker.ReturnVar (t, v); void := Type.IsEqual (t, Void.T); IF (p.expr = NIL) THEN IF (NOT void) THEN Error.Msg ("missing return result") END; ELSIF (void) THEN Error.Msg ("procedure does not have a return result"); ELSE p.expr := AssignStmt.CheckRHS (t, p.expr); END; END Check; PROCEDURE Precompile (<*UNUSED*> p: P) = BEGIN END Precompile; PROCEDURE Compile (p: P): Stmt.Outcomes = VAR t: Type.T; v: Variable.T; x: Temp.T; BEGIN IF (p.expr # NIL) THEN x := Expr.Compile (p.expr); Marker.ReturnVar (t, v); Emit.OpV ("@ = ", v); Emit.OpT ("@;\n", x); Temp.Free (x); END; Marker.EmitReturn (); RETURN Stmt.Outcomes {Stmt.Outcome.Returns}; END Compile; BEGIN END ReturnStmt.