Module: dfmc-back-end Author: Jonathan Bachrach Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND define compiler-open class () constant slot visited = make(); end class; define compiler-open generic maybe-walk (walker :: , c :: ) => (); define compiler-open generic walk (walker :: , c :: ) => (); define compiler-open generic subsequent-walk (walker :: , c :: ) => (); define compiler-open generic before-walk (walker :: , c :: ) => (); define compiler-open generic do-walk (walker :: , c :: ) => (); define method maybe-walk (walker :: , c :: ) => () if (element(walker.visited, c, default: #f)) subsequent-walk(walker, c); else walker.visited[c] := #t; before-walk(walker, c); walk(walker, c) end if end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); maybe-walk(walker, c.next-computation); end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); maybe-walk(walker, c.consequent); maybe-walk(walker, c.alternative); end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); maybe-walk(walker, c.loop-call-loop); end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); maybe-walk(walker, c.body); maybe-walk(walker, c.next-computation); end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); maybe-walk(walker, c.body); maybe-walk(walker, c.cleanups); maybe-walk(walker, c.next-computation); end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); // The following new code forces a jump to be emitted over any // following code that isn't actually next in the flow. maybe-walk(walker, c.next-computation); end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); // The following new code forces a jump to be emitted over any // following code that isn't actually next in the flow. maybe-walk(walker, c.entry-state.me-block.cleanups); end method; define method walk (walker :: , c :: ) => () do-walk(walker, c); maybe-walk(walker, c.entry-state.me-block.next-computation); end method; define method walk (walker :: , c :: ) => () maybe-walk(walker, c.next-computation); end method; // eof