[M3devel] strange errors...
Mika Nystrom
mika at async.caltech.edu
Mon Jul 16 05:51:33 CEST 2007
Tony Hosking writes:
...
>>
>> Line 113 in Main.m3 is:
>>
>> Wr.PutText(wr, subs.apply(Bundle.Get(Form, "tokform.m3")));
>
>Where does the variable 'wr' come from? It is this 'wr' that is
>failing the assert. It should not be gray, assuming that the GC was
>able to find it. Can I see your Main.m3?
>
It fails exactly the same way with @M3paranoidgc.
wr comes from FileWr.Open. The programmer has re-used wr for two
open FileWrs... I marked line 113, where it crashes:
(* Copyright (c) 2000 California Institute of Technology *)
(* All rights reserved. See the file COPYRIGHT for a full description. *)
(* $Id: Main.m3,v 1.3 2002/12/11 08:54:53 kp Exp $ *)
MODULE Main;
IMPORT Debug;
IMPORT tokformBundle, Bundle;
IMPORT TokParams;
IMPORT TokSpec;
IMPORT FileWr, Wr, Thread, OSError;
IMPORT TextWr;
IMPORT TextSubs;
IMPORT TextList;
IMPORT Pathname;
IMPORT Fmt;
IMPORT FmtTable;
(* IMPORT Term; *)
<* FATAL Thread.Alerted, Wr.Failure *>
VAR
Form := tokformBundle.Get();
PROCEDURE FormatTypes(t: TextList.T; tokName, kind: TEXT): TEXT =
VAR
wr := TextWr.New();
cur := t;
subs: TextSubs.T;
BEGIN
WHILE cur # NIL DO
subs := NEW(TextSubs.T).init();
subs.add("%type", cur.head);
subs.add("%tok", tokName);
Wr.PutText(wr, subs.apply(Bundle.Get(Form, kind)));
cur := cur.tail;
END;
RETURN TextWr.ToText(wr);
END FormatTypes;
PROCEDURE FormatLegalConst(tok: TokSpec.T): TEXT =
VAR
dummy: TEXT;
fmt := NEW(FmtTable.T).init();
BEGIN
FOR i := 1 TO tok.lastConstCode DO
IF tok.constTokensR.get(i, dummy) THEN
fmt.putInt(i);
END;
END;
RETURN fmt.toText();
END FormatLegalConst;
PROCEDURE FormatNamedConst(tok: TokSpec.T): TEXT =
VAR
cur := tok.tokens;
name: TEXT;
code: INTEGER;
wr := TextWr.New();
BEGIN
WHILE cur # NIL DO
name := cur.head;
IF tok.constTokens.get(name, code) THEN
Wr.PutText(wr, " " & name & " = " & Fmt.Int(code) & ";\n");
END;
cur := cur.tail;
END;
RETURN TextWr.ToText(wr);
END FormatNamedConst;
PROCEDURE Subs(tok: TokSpec.T; name: TEXT): TextSubs.T =
VAR
subs := NEW(TextSubs.T).init();
BEGIN
subs.add("\\\n", "");
subs.add("%tok", name);
subs.add("%type", FormatTypes(tok.varTokens, name, "tokform.type"));
subs.add("%case", FormatTypes(tok.varTokens, name, "tokform.case"));
subs.add("%constSet", FormatLegalConst(tok));
subs.add("%constName", FormatNamedConst(tok));
subs.add("%lastConst", Fmt.Int(tok.lastConstCode));
subs.add("%gen", "(* Generated by ktok *)");
RETURN subs;
END Subs;
VAR
tp: TokParams.T;
tok: TokSpec.T;
subs: TextSubs.T;
wr: Wr.T;
BEGIN
Debug.S("WELCOME!");
tp := TokParams.Get("tok", ".t", "Tok.i3", FALSE);
Debug.S("GOT TOKPARAMS!");
tok := TokParams.ReadTokens(tp);
Debug.S("GOT TOKENS");
subs := Subs(tok, tp.outBase);
Debug.S("GOT SUBS!");
TRY
wr := FileWr.Open(tp.out);
EXCEPT OSError.E =>
Debug.Error("Cannot open tok interface output file: " & tp.out);
END;
Wr.PutText(wr, subs.apply(Bundle.Get(Form, "tokform.i3")));
Wr.Close(wr);
TRY
wr := FileWr.Open(Pathname.ReplaceExt(tp.out, "m3"));
EXCEPT OSError.E =>
Debug.Error("Cannot open tok implementation output file: " &
Pathname.ReplaceExt(tp.out, "m3"));
END;
Wr.PutText(wr, subs.apply(Bundle.Get(Form, "tokform.m3"))); (* line 113 *)
Wr.Close(wr);
END Main.
More information about the M3devel
mailing list