Fix for parser reinstantiation bug
In the course of refactoring a bug was introduced
which manifested itself in excessive constructions
of parsers and considerable slowdown of reclass.
This patch limits the number of parsers constructed.
diff --git a/reclass/values/parser.py b/reclass/values/parser.py
index 255e477..27e6d2d 100644
--- a/reclass/values/parser.py
+++ b/reclass/values/parser.py
@@ -21,26 +21,41 @@
class Parser(object):
+ def __init__(self):
+ self._ref_parser = None
+ self._simple_parser = None
+ self._old_settings = None
+
+ @property
+ def ref_parser(self):
+ if self._ref_parser is None or self._settings != self._old_settings:
+ self._ref_parser = parsers.get_ref_parser(self._settings)
+ self._old_settings = self._settings
+ return self._ref_parser
+
+ @property
+ def simple_ref_parser(self):
+ if self._simple_parser is None or self._settings != self._old_settings:
+ self._simple_parser = parsers.get_simple_ref_parser(self._settings)
+ self._old_settings = self._settings
+ return self._simple_parser
+
def parse(self, value, settings):
def full_parse():
try:
- return ref_parser.parseString(value).asList()
+ return self.ref_parser.parseString(value).asList()
except pp.ParseException as e:
raise ParseError(e.msg, e.line, e.col, e.lineno)
self._settings = settings
- ref_parser = parsers.get_ref_parser(settings)
- simple_ref_parser = parsers.get_simple_ref_parser(settings)
-
sentinel_count = (value.count(settings.reference_sentinels[0]) +
value.count(settings.export_sentinels[0]))
-
if sentinel_count == 0:
# speed up: only use pyparsing if there are sentinels in the value
return ScaItem(value, self._settings)
elif sentinel_count == 1: # speed up: try a simple reference
try:
- tokens = simple_ref_parser.parseString(value).asList()
+ tokens = self.simple_ref_parser.parseString(value).asList()
except pp.ParseException:
tokens = full_parse() # fall back on the full parser
else: