11pub mod math;
22pub mod rules;
33
4+ use egg:: Id ;
45use math:: * ;
56
67use std:: ffi:: { CStr , CString } ;
78use std:: os:: raw:: c_char;
8- use std:: slice;
9+ use std:: { slice, sync :: atomic :: Ordering } ;
910
1011unsafe fn cstring_to_recexpr ( c_string : * const c_char ) -> Option < RecExpr > {
1112 match CStr :: from_ptr ( c_string) . to_str ( ) {
@@ -79,6 +80,7 @@ pub unsafe extern "C" fn egraph_add_expr(
7980 expr : * const c_char ,
8081) -> * mut EGraphAddResult {
8182 ffirun ( || {
83+ let _ = env_logger:: try_init ( ) ;
8284 let ctx = & mut * ptr;
8385 let mut runner = ctx
8486 . runner
@@ -95,6 +97,7 @@ pub unsafe extern "C" fn egraph_add_expr(
9597 Some ( rec_expr) => {
9698 runner = runner. with_expr ( & rec_expr) ;
9799 let id = * runner. roots . last ( ) . unwrap ( ) ;
100+ let id = usize:: from ( id) as u32 ;
98101 EGraphAddResult { id, successp : true }
99102 }
100103 } ;
@@ -151,24 +154,38 @@ pub unsafe extern "C" fn egraph_run_iter(
151154 let rules: Vec < Rewrite > = rules:: mk_rules ( & ffi_tuples) ;
152155
153156 runner. egraph . analysis . constant_fold = is_constant_folding_enabled;
154- runner = runner. with_node_limit ( limit as usize ) . run ( & rules) ;
157+ runner = runner
158+ . with_node_limit ( limit as usize )
159+ . with_hook ( |r| {
160+ if r. egraph . analysis . unsound . load ( Ordering :: SeqCst ) {
161+ Err ( "Unsoundness detected" . into ( ) )
162+ } else {
163+ Ok ( ( ) )
164+ }
165+ } )
166+ . run ( & rules) ;
155167 }
156168 ctx. runner = Some ( runner) ;
157169 } )
158170}
159171
160172fn find_extracted ( runner : & Runner , id : u32 ) -> & Extracted {
161- let id = runner. egraph . find ( id) ;
162- let iter = runner
163- . iterations
164- . last ( )
165- . expect ( "There should be some iterations by now!" ) ;
166- iter. data
173+ let id = runner. egraph . find ( Id :: from ( id as usize ) ) ;
174+ let desired_iter = if runner. egraph . analysis . unsound . load ( Ordering :: SeqCst ) {
175+ // go back one more iter, add egg can duplicate the final iter in the case of an error
176+ runner. iterations . len ( ) . saturating_sub ( 3 )
177+ } else {
178+ runner. iterations . len ( ) . saturating_sub ( 1 )
179+ } ;
180+
181+ runner. iterations [ desired_iter]
182+ . data
167183 . extracted
168184 . iter ( )
169185 . find ( |( i, _) | runner. egraph . find ( * i) == id)
170186 . map ( |( _, ext) | ext)
171187 . expect ( "Couldn't find matching extraction!" )
188+ . clone ( )
172189}
173190
174191#[ no_mangle]
0 commit comments