(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: Exceptionz.m3 *) (* Last Modified On Wed May 16 02:47:32 1990 by muller *) (* Modified On Sat Feb 10 20:57:40 1990 by kalsow *) MODULE Exceptionz; IMPORT Value, ValueRep, String, Type, Void, Scope; IMPORT Error, Expr, Emit, Temp, Wr, Token, Decl; FROM Scanner IMPORT GetToken, Fail, Match, MatchID, cur; TYPE T = Value.T BRANDED OBJECT tipe : Type.T; METHODS bind := Bind; typeCheck := Check; class := MyClass; fingerprint := FPrinter; load := Load; write := Write; select := ValueRep.NoDuplicates; declare0 := Declarer; declare1 := Compile; needsDecl := ValueRep.Always; toExpr := ValueRep.NoExpr; toType := ValueRep.NoType; END; PROCEDURE ParseDecl (READONLY fail: Token.Set; att: Decl.Attributes) = TYPE TK = Token.T; VAR t: T; id: String.T; BEGIN IF att.isInline THEN Error.Msg ("a variable cannot be inline"); END; IF att.isExternal THEN Error.Msg ("a variable cannot be external"); END; Match (TK.tEXCEPTION, fail, Token.Set {TK.tIDENT, TK.tSEMI}); WHILE (cur.token = TK.tIDENT) DO id := MatchID (fail, Token.Set {TK.tLPAREN, TK.tSEMI}); t := NEW (T); ValueRep.Init (t, id); t.readonly := TRUE; t.unused := att.isUnused; t.obsolete := att.isObsolete; t.tipe := NIL; IF (cur.token = TK.tLPAREN) THEN GetToken (); (* ( *) t.tipe := Type.Parse (fail + Token.Set {TK.tRPAREN, TK.tSEMI}); Match (TK.tRPAREN, fail, Token.Set {TK.tSEMI}); END; Scope.Insert (t); Match (TK.tSEMI, fail, Token.Set {}); END; END ParseDecl; PROCEDURE Bind (t: T) = BEGIN t.tipe := Type.Bind (t.tipe); t.type := Void.T; END Bind; PROCEDURE Check (t: T) = BEGIN IF (t.tipe # NIL) THEN Type.Check (t.tipe); IF (Type.Size (t.tipe) < 0) THEN Error.Str (t.name, "argument type must have fixed length"); END; END; END Check; PROCEDURE ArgType (v: Value.T): Type.T = BEGIN TYPECASE (v) OF | NULL => RETURN NIL; | T(t) => RETURN t.tipe; ELSE RETURN NIL; END; END ArgType; PROCEDURE Load (t: T): Temp.T = BEGIN RETURN Temp.FromValue (t); END Load; PROCEDURE Write (t: T) = BEGIN Emit.OpN ("@", t); END Write; PROCEDURE Compile (<*UNUSED*> t: T) = BEGIN END Compile; PROCEDURE MyClass (<*UNUSED*> t: T): Value.Class = BEGIN RETURN Value.Class.Exception; END MyClass; PROCEDURE Declarer (t: T): BOOLEAN = BEGIN Value.GenStorageClass (t); IF t.external OR t.imported THEN Emit.OpN ("EXCEPTION_NAME @;\n", t); ELSE Emit.OpN ("EXCEPTION_NAME @ = ", t); Emit.OpN ("\"@\";\n", t); END; RETURN TRUE; END Declarer; PROCEDURE FPrinter (t: T; map: Type.Map; wr: Wr.T) = VAR s: String.Stack; BEGIN Wr.PutText (wr, "EXCEPT "); s.top := 0; Scope.NameToPrefix (t, s); String.PutStack (wr, s); Wr.PutText (wr, " "); Type.Fingerprint (t.tipe, map, wr); END FPrinter; BEGIN END Exceptionz.