[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