@@ -31,6 +31,7 @@ open CHUtils
3131
3232(* chutil *)
3333open CHLogger
34+ open CHXmlDocument
3435
3536(* bchlib *)
3637open BCHBCTypePretty
@@ -72,6 +73,8 @@ object (self)
7273 (* constraints that involve a global variable *)
7374 val gvartypes = H. create 5
7475
76+ val rules_applied = H. create 5
77+
7578 method reset =
7679 begin
7780 H. clear store;
@@ -81,9 +84,28 @@ object (self)
8184 H. clear gvartypes
8285 end
8386
84- method add_constraint (c : type_constraint_t ) =
87+ method private add_rule_applied
88+ (faddr : string )
89+ (loc : string )
90+ (rule : string )
91+ (ix : int ) =
92+ let tir = {
93+ tir_faddr = faddr;
94+ tir_loc = loc;
95+ tir_rule = rule;
96+ tir_constraint_ix = ix
97+ } in
98+ let entry =
99+ if H. mem rules_applied faddr then
100+ H. find rules_applied faddr
101+ else
102+ [] in
103+ H. replace rules_applied faddr (tir :: entry)
104+
105+ method add_constraint
106+ (faddr : string ) (loc : string ) (rule : string ) (c : type_constraint_t ) =
85107 let index = tcd#index_type_constraint c in
86- (* index the constraint *)
108+ let _ = self#add_rule_applied faddr loc rule index in
87109 if H. mem store index then
88110 ()
89111 else
@@ -188,33 +210,50 @@ object (self)
188210 if H. mem iaddrentry iaddr then H. find iaddrentry iaddr else [] in
189211 H. replace iaddrentry iaddr (c :: entry)
190212
191- method add_var_constraint (tyvar : type_variable_t ) =
192- self#add_constraint (TyVar (TyVariable tyvar))
213+ method add_var_constraint
214+ (faddr : string )
215+ (loc : string )
216+ (rule : string )
217+ (tyvar : type_variable_t ) =
218+ self#add_constraint faddr loc rule (TyVar (TyVariable tyvar))
193219
194- method add_term_constraint (t : type_term_t ) =
220+ method add_term_constraint
221+ (faddr : string )
222+ (loc : string )
223+ (rule : string )
224+ (t : type_term_t ) =
195225 match t with
196- | TyVariable tv -> self#add_var_constraint tv
226+ | TyVariable tv -> self#add_var_constraint faddr loc rule tv
197227 | _ -> ()
198228
229+ (*
199230 method add_zerocheck_constraint (tyvar: type_variable_t) =
200231 begin
201232 self#add_var_constraint tyvar;
202233 self#add_constraint (TyZeroCheck (TyVariable tyvar))
203234 end
235+ *)
204236
205- method add_subtype_constraint (t1 : type_term_t ) (t2 : type_term_t ) =
237+ method add_subtype_constraint
238+ (faddr : string )
239+ (loc : string )
240+ (rule : string )
241+ (t1 : type_term_t )
242+ (t2 : type_term_t ) =
206243 begin
207- self#add_term_constraint t1;
208- self#add_term_constraint t2;
209- self#add_constraint (TySub (t1, t2))
244+ self#add_term_constraint faddr loc rule t1;
245+ self#add_term_constraint faddr loc rule t2;
246+ self#add_constraint faddr loc rule (TySub (t1, t2))
210247 end
211248
249+ (*
212250 method add_ground_constraint (t1: type_term_t) (t2: type_term_t) =
213251 begin
214252 self#add_term_constraint t1;
215253 self#add_term_constraint t2;
216254 self#add_constraint (TyGround (t1, t2))
217255 end
256+ *)
218257
219258 method get_function_type_constraints (faddr : string ): type_constraint_t list =
220259 if H. mem functiontypes faddr then
@@ -704,6 +743,31 @@ object (self)
704743 () in
705744 ! result
706745
746+ method private write_xml_rules_applied (node: xml_element_int ) =
747+ let ranode = xmlElement " rules-applied" in
748+ begin
749+ H. iter (fun faddr rules ->
750+ let fnode = xmlElement " function" in
751+ let _ = fnode#setAttribute " faddr" faddr in
752+ begin
753+ List. iter (fun rule ->
754+ let rnode = xmlElement " rule" in
755+ begin
756+ rnode#setAttribute " loc" rule.tir_loc;
757+ rnode#setAttribute " rule" rule.tir_rule;
758+ rnode#setIntAttribute " tc-ix" rule.tir_constraint_ix;
759+ fnode#appendChildren [rnode]
760+ end ) rules;
761+ ranode#appendChildren [fnode]
762+ end ) rules_applied;
763+ node#appendChildren [ranode]
764+ end
765+
766+ method write_xml (node: xml_element_int ) =
767+ begin
768+ self#write_xml_rules_applied (node)
769+ end
770+
707771 method toPretty =
708772 let constraints = ref [] in
709773 let _ =
0 commit comments