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 #ifndef CBZ_REF_CLONE_CHANGER_H
00038 #define CBZ_REF_CLONE_CHANGER_H
00039
00040
00041 typedef map< Node *,
00042 Node *,
00043 less< Node * > > node_map;
00044
00045 typedef node_map::iterator node_map_p;
00046
00047 class ref_clone_changer : public Changer
00048 {
00049 public:
00050
00051 static Node * clone(Node * n, bool nil_bad_links);
00052
00053 private:
00054
00055 node_map * _map;
00056
00057 public:
00058
00059 ref_clone_changer()
00060 : Changer(Preorder, Subtree, false),
00061 _map(new node_map())
00062 {}
00063
00064 node_map * map() const { return _map; }
00065
00066 Node * at_node(Node * the_node, Order ord)
00067 {
00068 Node * newnode = the_node->clone();
00069 (*_map)[the_node] = newnode;
00070 return newnode;
00071 }
00072
00073
00074 };
00075
00076 class ref_fix_walker : public Walker
00077 {
00078 private:
00079
00080 node_map * _map;
00081 bool _nil_bad_links;
00082
00083 Node * lookup(Node * old);
00084
00085 public:
00086
00087 ref_fix_walker(node_map * m, bool nil_bad_links)
00088 : Walker(Preorder, Subtree),
00089 _map(m),
00090 _nil_bad_links(nil_bad_links)
00091 {}
00092
00093 virtual void at_tdef(tdefNode * the_tdef, Order ord);
00094 virtual void at_id(idNode * the_id, Order ord);
00095 virtual void at_call(callNode * the_call, Order ord);
00096 virtual void at_label(labelNode * the_label, Order ord);
00097 virtual void at_case(caseNode * the_case, Order ord);
00098 virtual void at_switch(switchNode * the_switch, Order ord);
00099 virtual void at_goto(gotoNode * the_goto, Order ord);
00100 virtual void at_continue(continueNode * the_continue, Order ord);
00101 virtual void at_break(breakNode * the_break, Order ord);
00102 virtual void at_return(returnNode * the_return, Order ord);
00103 };
00104
00105
00106 #endif // CBZ_REF_CLONE_CHANGER_H