From cf699c663377e80b23cf62a38e25a5d096415ec6 Mon Sep 17 00:00:00 2001 From: "Tim D. Smith" Date: Wed, 2 Nov 2016 12:14:46 -0700 Subject: [PATCH 1/4] Make `import rply` faster under coverage Importing rply under coverage.py is very slow because of the work done when the rpython libraries are imported. This patch causes the classes needed for translation to be set up only when rply needs to be translated. --- rply/lexergenerator.py | 12 +++++++++--- tests/test_ztranslation.py | 12 ++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/rply/lexergenerator.py b/rply/lexergenerator.py index 62d0bb9..ef8b374 100644 --- a/rply/lexergenerator.py +++ b/rply/lexergenerator.py @@ -2,6 +2,14 @@ try: import rpython + from rpython.rlib.objectmodel import we_are_translated +except ImportError: + rpython = None + + def we_are_translated(): + return False + +if we_are_translated(): from rpython.annotator import model from rpython.annotator.bookkeeper import getbookkeeper from rpython.rlib.objectmodel import instantiate, hlinvoke @@ -14,8 +22,6 @@ from rpython.rtyper.lltypesystem.rstr import STR, string_repr from rpython.rtyper.rmodel import Repr from rpython.tool.pairtype import pairtype -except ImportError: - rpython = None from rply.lexer import Lexer @@ -104,7 +110,7 @@ def build(self): """ return Lexer(self.rules, self.ignore_rules) -if rpython: +if we_are_translated(): class RuleEntry(ExtRegistryEntry): _type_ = Rule diff --git a/tests/test_ztranslation.py b/tests/test_ztranslation.py index d51452c..98fa43c 100644 --- a/tests/test_ztranslation.py +++ b/tests/test_ztranslation.py @@ -2,9 +2,21 @@ try: from rpython.rtyper.test.test_llinterp import interpret + import rpython.rlib.objectmodel except ImportError: py.test.skip("Needs RPython to be on the PYTHONPATH") +try: + reload +except NameError: + from importlib import reload + +old = rpython.rlib.objectmodel.we_are_translated +rpython.rlib.objectmodel.we_are_translated = lambda: True +import rply +reload(rply.lexergenerator) +rpython.rlib.objectmodel.we_are_translated = old + from rply import LexerGenerator, ParserGenerator, Token from rply.errors import ParserGeneratorWarning From 3ba485da9739d857e5f34b441b244482afa08ae0 Mon Sep 17 00:00:00 2001 From: "Tim D. Smith" Date: Tue, 15 Nov 2016 16:01:14 -0800 Subject: [PATCH 2/4] Fix pytest error messages about skip --- tests/test_ztranslation.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/tests/test_ztranslation.py b/tests/test_ztranslation.py index 98fa43c..a1b90a4 100644 --- a/tests/test_ztranslation.py +++ b/tests/test_ztranslation.py @@ -3,19 +3,13 @@ try: from rpython.rtyper.test.test_llinterp import interpret import rpython.rlib.objectmodel + old = rpython.rlib.objectmodel.we_are_translated + rpython.rlib.objectmodel.we_are_translated = lambda: True + import rply + reload(rply.lexergenerator) + rpython.rlib.objectmodel.we_are_translated = old except ImportError: - py.test.skip("Needs RPython to be on the PYTHONPATH") - -try: - reload -except NameError: - from importlib import reload - -old = rpython.rlib.objectmodel.we_are_translated -rpython.rlib.objectmodel.we_are_translated = lambda: True -import rply -reload(rply.lexergenerator) -rpython.rlib.objectmodel.we_are_translated = old + pytestmark = py.test.mark.skip("Needs RPython to be on the PYTHONPATH") from rply import LexerGenerator, ParserGenerator, Token from rply.errors import ParserGeneratorWarning From 770515d061f63473a4608848a9f755b8e2db6aa0 Mon Sep 17 00:00:00 2001 From: "Tim D. Smith" Date: Tue, 15 Nov 2016 16:01:30 -0800 Subject: [PATCH 3/4] Don't test translation except on Python 2.7 --- tox.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 539c54b..e689698 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,8 @@ envlist = py26, py27, py33, py34, py35, pypy, docs deps = pytest # just running tox with PYTHONPATH=pypy tox fails, see # https://bitbucket.org/hpk42/tox/issue/146/setting-pythonpath-causes-tox-to-crash -setenv = PYTHONPATH={env:PYPY_LOCATION} +setenv = + py27,pypy: PYTHONPATH={env:PYPY_LOCATION} commands = py.test [testenv:docs] From c974e01e7559520667424a94819958032f59019a Mon Sep 17 00:00:00 2001 From: "Tim D. Smith" Date: Tue, 15 Nov 2016 16:08:56 -0800 Subject: [PATCH 4/4] style --- rply/lexergenerator.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rply/lexergenerator.py b/rply/lexergenerator.py index ef8b374..d806a37 100644 --- a/rply/lexergenerator.py +++ b/rply/lexergenerator.py @@ -1,5 +1,7 @@ import re +from rply.lexer import Lexer + try: import rpython from rpython.rlib.objectmodel import we_are_translated @@ -23,8 +25,6 @@ def we_are_translated(): from rpython.rtyper.rmodel import Repr from rpython.tool.pairtype import pairtype -from rply.lexer import Lexer - class Rule(object): def __init__(self, name, pattern, flags=0): @@ -110,6 +110,7 @@ def build(self): """ return Lexer(self.rules, self.ignore_rules) + if we_are_translated(): class RuleEntry(ExtRegistryEntry): _type_ = Rule