home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / CallNode.C < prev    next >
C/C++ Source or Header  |  1998-11-23  |  5KB  |  233 lines

  1. // $Id: CallNode.C,v 1.10 1998/11/23 17:43:18 zeller Exp $
  2. // VSL function calls
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char CallNode_rcsid[] = 
  30.     "$Id: CallNode.C,v 1.10 1998/11/23 17:43:18 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36.  
  37. #include "assert.h"
  38. #include "VSLLib.h"
  39.  
  40. #include "VSLNode.h"
  41. #include "CallNode.h"
  42. #include "VSEFlags.h"
  43. #include "ConstNode.h"
  44. #include "VSLDef.h"
  45.  
  46. DEFINE_TYPE_INFO_1(CallNode, VSLNode)
  47.  
  48. // CallNode
  49.  
  50. bool CallNode::matchesAll = false;
  51.  
  52.  
  53. // Dump function name
  54. void CallNode::dump(ostream& s) const
  55. {
  56.     s << func_name();
  57.  
  58.     if (VSEFlags::include_list_info)
  59.     s << *_arg;
  60.     else
  61.     if (_arg->isArgNode())
  62.         s << "(" << *_arg << "...)";
  63.     else
  64.         s << *_arg;
  65. }
  66.  
  67. // ...as tree
  68. void CallNode::_dumpTree(ostream& s) const
  69. {
  70.     s << "\"" << func_name() << "\", ";
  71.     _arg->dumpTree(s);
  72. }
  73.  
  74. // Evaluate function
  75. const Box *CallNode::_eval(ListBox *arglist) const
  76. {
  77.     // Evaluate arg
  78.     const Box *myarg = _arg->eval(arglist);
  79.     if (myarg == 0)
  80.     return 0;
  81.  
  82.     // Call function
  83.     const Box *box = call((Box *)myarg);
  84.  
  85.     ((Box *)myarg)->unlink();
  86.  
  87.     return box;
  88. }
  89.  
  90.  
  91.  
  92. // Optimization
  93.  
  94. // In general, all these apply the optimization on the function arguments
  95.  
  96. int CallNode::resolveDefs(VSLDef *cdef, bool complain_recursive)
  97. {
  98.     return arg()->resolveDefs(cdef, complain_recursive);
  99. }
  100.  
  101. int CallNode::resolveSynonyms(VSLDef *cdef, VSLNode ** /* node */)
  102. {
  103.     // assert (this == *node);
  104.     return arg()->resolveSynonyms(cdef, &arg());
  105. }
  106.  
  107. int CallNode::foldOps(VSLDef *cdef, VSLNode ** /* node */)
  108. {
  109.     // assert (this == *node);
  110.     return arg()->foldOps(cdef, &arg());
  111. }
  112.  
  113. int CallNode::inlineFuncs(VSLDef *cdef, VSLNode ** /* node */)
  114. {
  115.     // assert (this == *node);
  116.     return arg()->inlineFuncs(cdef, &arg());
  117. }
  118.  
  119. int CallNode::instantiateArgs(VSLDef *cdef, VSLNode ** /* node */,
  120.                   VSLNode *values[], unsigned base, unsigned n)
  121. {
  122.     // assert(this == *node); 
  123.     return arg()->instantiateArgs(cdef, &arg(), values, base, n);
  124. }
  125.  
  126. void CallNode::countArgNodes(VSLDef *cdef, int instances[],
  127.     unsigned base, unsigned n)
  128. {
  129.     arg()->countArgNodes(cdef, instances, base, n);
  130. }
  131.  
  132. void CallNode::compilePatterns(VSLDef *cdef) const
  133. {
  134.     arg()->compilePatterns(cdef);
  135. }
  136.  
  137. void CallNode::uncompilePatterns(VSLDef *cdef) const
  138. {
  139.     arg()->uncompilePatterns(cdef);
  140. }
  141.  
  142. int CallNode::countSelfReferences(VSLDef *cdef, VSLDefList *deflist)
  143. {
  144.     return arg()->countSelfReferences(cdef, deflist);
  145. }
  146.  
  147. int CallNode::resolveName(VSLDef *cdef, VSLNode ** /* node */, string& name,
  148.     unsigned id)
  149. {
  150.     // assert(this == *node); 
  151.     return arg()->resolveName(cdef, &arg(), name, id);
  152. }
  153.  
  154. int CallNode::_resolveNames(VSLDef *cdef, unsigned base)
  155. {
  156.     return arg()->resolveNames(cdef, base);
  157. }
  158.  
  159. int CallNode::_reBase(VSLDef *cdef, unsigned newBase)
  160. {
  161.     return arg()->reBase(cdef, newBase);
  162. }
  163.  
  164. string CallNode::firstName() const
  165. {
  166.     return arg()->firstName();
  167. }
  168.  
  169.  
  170.  
  171. // Fold constants
  172. int CallNode::foldConsts(VSLDef *cdef, VSLNode **node)
  173. {
  174.     assert (this == *node);
  175.     int changes = 0;
  176.  
  177.     // Apply on all aguments
  178.     changes += arg()->foldConsts(cdef, &arg());
  179.  
  180.     // If still non-constant, return
  181.     if (!isConst())
  182.     return changes;
  183.  
  184.     // Otherwise: evaluate function, avoiding all side effects
  185.     sideEffectsProhibited = true;
  186.     sideEffectsOccured = false;
  187.  
  188.     const Box *result = eval(0);
  189.  
  190.     if (result)
  191.     {
  192.     assert(!sideEffectsOccured);
  193.  
  194.     // Replace CallNode by constant
  195.     if (VSEFlags::show_optimize)
  196.     {
  197.         cout << "\n" << cdef->longname() << ": foldConsts: replacing\n" 
  198.         << *this << '\n';
  199.         cout.flush();
  200.     }
  201.  
  202.     *node = new ConstNode((Box *)result);
  203.  
  204.     if (VSEFlags::show_optimize)
  205.     {
  206.         cout << "by " << **node << "\n";
  207.         cout.flush();
  208.     }
  209.     
  210.     changes++;
  211.  
  212.     // Delete old CallNode and its subtree
  213.     delete this;
  214.     }
  215.  
  216.     sideEffectsProhibited = false;
  217.  
  218.     return changes;
  219. }
  220.  
  221.  
  222.  
  223. // Debugging
  224.  
  225. // Representation invariant
  226. bool CallNode::OK() const
  227. {
  228.       assert (VSLNode::OK());
  229.       assert (_arg && _arg->OK());
  230.  
  231.       return true;
  232. }
  233.