00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef CBZ_REF_CLONE_CHANGER_H
00039 #define CBZ_REF_CLONE_CHANGER_H
00040
00041
00042 typedef map< Node *,
00043 Node *,
00044 less< Node * > > node_map;
00045
00046 typedef node_map::iterator node_map_p;
00047
00060 class ref_clone_changer : public Changer
00061 {
00062 public:
00063
00081 static Node * clone(Node * n, bool nil_bad_links);
00082
00083 private:
00084
00085 node_map * map() const { return _map; }
00086
00087 node_map * _map;
00088
00089 ref_clone_changer()
00090 : Changer(Preorder, Subtree, false),
00091 _map(new node_map())
00092 {}
00093
00094 virtual Node * at_node(Node * the_node, Order ord)
00095 {
00096 Node * newnode = the_node->clone();
00097 (*_map)[the_node] = newnode;
00098 return newnode;
00099 }
00100
00101 virtual Node * at_decl(declNode * the_decl, Order ord) {
00102 declNode * newnode = (declNode *) this->at_node(the_decl, ord);
00103 newnode->ref_list().clear();
00104 return newnode;
00105 }
00106
00107 virtual Node * at_label(labelNode * the_label, Order ord) {
00108 labelNode * newnode = (labelNode *) this->at_node(the_label, ord);
00109 newnode->references().clear();
00110 return newnode;
00111 }
00112
00113 virtual Node * at_switch(switchNode * the_switch, Order ord) {
00114 switchNode * newnode = (switchNode *) this->at_node(the_switch, ord);
00115 newnode->cases().clear();
00116 return newnode;
00117 }
00118 };
00119
00120 class ref_fix_walker : public Walker
00121 {
00122 private:
00123
00124 node_map * _map;
00125 bool _nil_bad_links;
00126
00127 Node * lookup(Node * old);
00128
00129 public:
00130
00131 ref_fix_walker(node_map * m, bool nil_bad_links)
00132 : Walker(Preorder, Subtree),
00133 _map(m),
00134 _nil_bad_links(nil_bad_links)
00135 {}
00136
00137 virtual void at_tdef(tdefNode * the_tdef, Order ord);
00138 virtual void at_id(idNode * the_id, Order ord);
00139 virtual void at_call(callNode * the_call, Order ord);
00140 virtual void at_case(caseNode * the_case, Order ord);
00141 virtual void at_goto(gotoNode * the_goto, Order ord);
00142 virtual void at_continue(continueNode * the_continue, Order ord);
00143 virtual void at_break(breakNode * the_break, Order ord);
00144 virtual void at_return(returnNode * the_return, Order ord);
00145 virtual void at_proc(procNode * the_proc, Order ord);
00146 };
00147
00148
00149 #endif // CBZ_REF_CLONE_CHANGER_H