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 / ArgNode.C < prev    next >
C/C++ Source or Header  |  1998-11-23  |  3KB  |  143 lines

  1. // $Id: ArgNode.C,v 1.9 1998/11/23 17:43:15 zeller Exp $ 
  2. // ArgNode class
  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 ArgNode_rcsid[] = 
  30.     "$Id: ArgNode.C,v 1.9 1998/11/23 17:43:15 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36.  
  37. #include <strstream.h>
  38. #include "assert.h"
  39. #include "VSLLib.h"
  40. #include "ArgNode.h"
  41. #include "VSLDef.h"
  42.  
  43. DEFINE_TYPE_INFO_1(ArgNode, DummyNode)
  44.  
  45. // ArgNode
  46.  
  47. ArgNodeFunc ArgNode::matchCallback = 0;
  48.  
  49.  
  50. // Evaluate argument
  51. const Box *ArgNode::_eval(ListBox *arglist) const
  52. {
  53.     const Box *box = 0;
  54.  
  55.     if (arglist)
  56.     {
  57.     box = (*arglist)[_id];
  58.     if (box)
  59.         box = ((Box *)box)->link();
  60.     }
  61.  
  62.     if (box == 0)
  63.     {
  64.     ostrstream os;
  65.     os << "arg" << _id << " cannot be isolated";
  66.     VSLLib::eval_error(os);
  67.     }
  68.  
  69.     return box;
  70. }
  71.  
  72. // Dump ArgNode
  73. void ArgNode::dump(ostream& s) const
  74. {
  75.     s << "arg" << _id;
  76. }
  77.  
  78. // Dump as tree
  79. void ArgNode::_dumpTree(ostream& s) const
  80. {
  81.     s << _id;
  82. }
  83.  
  84. bool ArgNode::matches(const VSLNode &node) const
  85. {
  86.     bool ret = matchesAll ||
  87.     VSLNode::matches(node) &&
  88.         _id == ((ArgNode *)&node)->_id; // dirty trick
  89.  
  90.     if (ret && matchCallback)
  91.     matchCallback(_id, &node);
  92.  
  93.     return ret;
  94. }
  95.  
  96.  
  97. // Optimization
  98.  
  99.  // instantiateArgs: in expressions f(arg1, arg2, ...), replace
  100. // arg1 .. argn by actual arguments
  101.  
  102. // Replace NODE by corresponding expr from VALUES
  103. int ArgNode::instantiateArgs(VSLDef *, VSLNode **node, VSLNode *values[],
  104.                  unsigned base, unsigned n)
  105. {
  106.     assert(this == *node);
  107.  
  108.     // Abort if out of area
  109.     if (_id < base || _id >= base + n)
  110.     return 0;
  111.  
  112.     VSLNode *source = values[_id];
  113.     assert (source != 0);
  114.  
  115.     VSLNode *newNode = source->dup();
  116.     *node = newNode;
  117.  
  118. #if 0
  119.     if (VSEFlags::show_optimize)
  120.     {
  121.     cout << "\n" << cdef->longname() << ": instantiateArgs: replacing\n" 
  122.         << *this << "\nby " << *newNode << '\n';
  123.     cout.flush();
  124.     }
  125. #endif
  126.  
  127.     // Delete ArgNode
  128.     delete this;
  129.  
  130.     return 1;
  131. }
  132.  
  133. // Increase instance counter
  134. void ArgNode::countArgNodes(VSLDef *, int instances[],
  135.                 unsigned base, unsigned n)
  136. {
  137.     // Ignore if out of area
  138.     if (_id < base || _id >= base + n)
  139.     return;
  140.  
  141.     instances[_id]++;
  142. }
  143.