@@ -1441,8 +1441,6 @@ def typedef_resolution(self,structDump):
14411441
14421442 problems = missing_type_defs + list (problems - set (plist )) # let's make sure the original missing types are ordered first
14431443 prev_undefined = None
1444- print (f"tiny_page in undefined=> { 'tiny_page' in undefined } ; tiny_page in RESOLVED => { 'tiny_page' in RESOLVED } " )
1445- print (f"malloc_t requires : { x_requires ['malloc_t' ]} (uses tiny_page: { uses_x ['tiny_page' ]} )" )
14461444 while (len (undefined )> 0 ):
14471445 prev_undefined = copy .copy (undefined )
14481446 updated = False
@@ -1525,7 +1523,21 @@ def typedef_resolution(self,structDump):
15251523 return "\n " .join (typedefs ),recovered_types ,needs_stdio
15261524
15271525
1528-
1526+ def aggregate_sets (self ,x_init ,known ,lookup ):
1527+ x_ = x_init
1528+ union_x = set ([ i for y in x_ for i in lookup .get (y ,set ())- known ])| x_
1529+ return union_x
1530+
1531+ def fully_resolve_aggregates (self ,x_init ,known ,lookup ):
1532+ changed = True
1533+ x_ = copy .copy (x_init )
1534+ while changed :
1535+ x_delta = self .aggregate_sets (x_ ,known ,lookup )
1536+ if x_delta == x_ :
1537+ changed = False
1538+ x_ = x_ | x_delta
1539+ return x_
1540+
15291541
15301542 def rule_one (self ,x :str ,x_requires :dict ,resolved :set ):
15311543 valid = None
@@ -1539,15 +1551,20 @@ def rule_one(self,x:str,x_requires:dict,resolved:set):
15391551 def rule_two (self ,x ,x_requires :dict ,uses_x :dict ,resolved :set ,fnptr_types :list ):
15401552 x_reqs = x_requires [x ]- resolved
15411553 uses_x_x = uses_x .get (x ,set ())- resolved
1542- req_union = set ([ x for y in x_reqs for x in x_requires [y ]- resolved ])| x_reqs
1543- uses_union = set ([ x for y in x_reqs for x in uses_x .get (y ,[])- resolved ])| uses_x_x
1554+ #req_union=set([ x for y in x_reqs for x in x_requires[y]-resolved ])|x_reqs
1555+ req_union = self .aggregate_sets (x_reqs ,resolved ,x_requires )
1556+ #uses_union=set([ x for y in x_reqs for x in uses_x.get(y,[])-resolved ])|uses_x_x
1557+ uses_union = self .aggregate_sets (x_reqs ,resolved ,uses_x )| uses_x_x
1558+ #uses_union=self.fully_resolve_aggregates(x_reqs,resolved,uses_x)|uses_x_x
15441559 valid_ = None
15451560 print (f"DEBUG: CHECKING RULE 2: { x } is valid [{ req_union <= uses_union } ] => { req_union } ({ uses_union } )" )
15461561 if req_union <= uses_union :
15471562 valid_ = req_union
15481563 if x in fnptr_types :
15491564 valid_ .add (x )
15501565 print (f"DEBUG: RULE 2: { x } is valid [{ valid_ } ] => { req_union } ({ uses_union } )" )
1566+ else :
1567+ print (f"DEBUG: RULE 2: { x } failed REQUIRE_UNION:{ req_union } is not a subset of USES_UNION:{ uses_union } " )
15511568 return valid_
15521569
15531570 def process_rules_for_x (self ,x :str ,x_requires :dict ,uses_x :dict ,resolved :set ,orig_x_requires :dict ,fnptr_types :list ):
0 commit comments