@@ -72,7 +72,7 @@ def lookup(self, name: str) -> Optional[Any]:
7272 # @param timeout Timeout in millis
7373 # @param maxRecursionDepth Max recursion depth
7474 #
75- def set_runtime_bounds (self , timeout : int , max_recursion_depth : int ) -> None :
75+ def set_runtime_bounds (self , timeout : Optional [ int ] , max_recursion_depth : Optional [ int ] ) -> None :
7676 timebox .Timebox (self , timeout , max_recursion_depth )
7777
7878 def set_evaluate_entry_callback (self , cb : Callable ) -> None :
@@ -1904,12 +1904,17 @@ def _static_initializer() -> None:
19041904 # compile JSONata regex literals. Every engine, including the
19051905 # default, must translate RegexFlags into its own native
19061906 # representation -- see jsonata.regex_engine.default_regex_engine.
1907+ # @param {Integer} timeout - max evaluation time in milliseconds, or None
1908+ # for no limit. Raises D1012 if exceeded.
1909+ # @param {Integer} stack - max eval-apply recursion depth, or None for
1910+ # no limit. Raises D1011 if exceeded.
19071911 # @returns Evaluated expression
19081912 # @throws jexception.JException An exception if an error occured.
19091913 #
19101914 @staticmethod
1911- def jsonata (expression : Optional [str ], regex_engine : RegexEngine = default_regex_engine ) -> 'Jsonata' :
1912- return Jsonata (expression , regex_engine )
1915+ def jsonata (expression : Optional [str ], regex_engine : RegexEngine = default_regex_engine ,
1916+ timeout : Optional [int ] = None , stack : Optional [int ] = None ) -> 'Jsonata' :
1917+ return Jsonata (expression , regex_engine , timeout , stack )
19131918
19141919 #
19151920 # Internal constructor
@@ -1923,9 +1928,14 @@ def jsonata(expression: Optional[str], regex_engine: RegexEngine = default_regex
19231928 timestamp : int
19241929 input : Optional [Any ]
19251930 regex_engine : RegexEngine
1931+ timeout : Optional [int ]
1932+ stack : Optional [int ]
19261933
1927- def __init__ (self , expr : Optional [str ], regex_engine : RegexEngine = default_regex_engine ) -> None :
1934+ def __init__ (self , expr : Optional [str ], regex_engine : RegexEngine = default_regex_engine ,
1935+ timeout : Optional [int ] = None , stack : Optional [int ] = None ) -> None :
19281936 self .regex_engine = regex_engine
1937+ self .timeout = timeout
1938+ self .stack = stack
19291939 try :
19301940 self .parser = Jsonata .get_parser ()
19311941 self .ast = self .parser .parse (expr , regex_engine ) # , optionsRecover);
@@ -1936,6 +1946,8 @@ def __init__(self, expr: Optional[str], regex_engine: RegexEngine = default_rege
19361946 # populateMessage(err); // possible side-effects on `err`
19371947 raise err
19381948 self .environment = self .create_frame (Jsonata .static_frame )
1949+ if timeout is not None or stack is not None :
1950+ self .environment .set_runtime_bounds (timeout , stack )
19391951
19401952 self .timestamp = timebox .Timebox .current_milli_time () # will be overridden on each call to evalute()
19411953
0 commit comments