1515import copy
1616import logging
1717import re
18+ from functools import lru_cache
1819
1920from casbin .effect import Effector , get_effector , effect_to_bool
2021from casbin .model import Model , FunctionMap
@@ -436,8 +437,9 @@ def enforce_ex(self, *rvals):
436437
437438 exp_string = self .model ["m" ][mtype ].value
438439 exp_has_eval = util .has_eval (exp_string )
439- if not exp_has_eval :
440- expression = self ._get_expression (exp_string , functions )
440+ expression = self ._get_expression ("" if exp_has_eval else exp_string , functions )
441+ if exp_has_eval :
442+ rule_names = util .get_eval_value (exp_string )
441443
442444 policy_effects = set ()
443445
@@ -455,10 +457,8 @@ def enforce_ex(self, *rvals):
455457 parameters = dict (r_parameters , ** p_parameters )
456458
457459 if exp_has_eval :
458- rule_names = util .get_eval_value (exp_string )
459- rules = [util .escape_assertion (p_parameters [rule_name ]) for rule_name in rule_names ]
460- exp_with_rule = util .replace_eval (exp_string , rules )
461- expression = self ._get_expression (exp_with_rule , functions )
460+ rules = tuple (p_parameters [rule_name ] for rule_name in rule_names )
461+ expression .set_expr (self ._get_eval_expression (exp_string , rules ))
462462
463463 result = expression .eval (parameters )
464464
@@ -546,8 +546,17 @@ def configure_logging(logging_config=None):
546546
547547 @staticmethod
548548 def _get_expression (expr , functions = None ):
549+ return SimpleEval (CoreEnforcer ._normalize_expression (expr ), functions )
550+
551+ @staticmethod
552+ @lru_cache (maxsize = 8192 )
553+ def _normalize_expression (expr ):
549554 expr = expr .replace ("&&" , "and" )
550555 expr = expr .replace ("||" , "or" )
551- expr = re .sub (r"!(?!=)" , "not " , expr )
556+ return re .sub (r"!(?!=)" , "not " , expr )
552557
553- return SimpleEval (expr , functions )
558+ @staticmethod
559+ @lru_cache (maxsize = 8192 )
560+ def _get_eval_expression (expr , rules ):
561+ rules = [util .escape_assertion (rule ) for rule in rules ]
562+ return CoreEnforcer ._normalize_expression (util .replace_eval (expr , rules ))
0 commit comments