[pypy-commit] pypy pyparser-improvements-3: merge default

2018-06-06 Thread cfbolz
Author: Carl Friedrich Bolz-Tereick 
Branch: pyparser-improvements-3
Changeset: r94729:37acacd15a8b
Date: 2018-06-06 14:27 +0200
http://bitbucket.org/pypy/pypy/changeset/37acacd15a8b/

Log:merge default

diff --git a/pypy/interpreter/astcompiler/test/test_compiler.py 
b/pypy/interpreter/astcompiler/test/test_compiler.py
--- a/pypy/interpreter/astcompiler/test/test_compiler.py
+++ b/pypy/interpreter/astcompiler/test/test_compiler.py
@@ -27,7 +27,7 @@
 generator._resolve_block_targets(blocks)
 return generator, blocks
 
-class TestCompiler:
+class BaseTestCompiler:
 """These tests compile snippets of code and check them by
 running them with our own interpreter.  These are thus not
 completely *unit* tests, but given that our interpreter is
@@ -74,6 +74,9 @@
 def error_test(self, source, exc_type):
 py.test.raises(exc_type, self.simple_test, source, None, None)
 
+
+class TestCompiler(BaseTestCompiler):
+
 def test_issue_713(self):
 func = "def f(_=2): return (_ if _ else _) if False else _"
 yield self.st, func, "f()", 2
@@ -953,9 +956,11 @@
 yield (self.st, "x=(lambda: (-0.0, 0.0), lambda: (0.0, -0.0))[1]()",
 'repr(x)', '(0.0, -0.0)')
 
+class TestCompilerRevDB(BaseTestCompiler):
+spaceconfig = {"translation.reverse_debugger": True}
+
 def test_revdb_metavar(self):
 from pypy.interpreter.reverse_debugging import dbstate, setup_revdb
-self.space.config.translation.reverse_debugger = True
 self.space.reverse_debugging = True
 try:
 setup_revdb(self.space)
diff --git a/pypy/interpreter/pyparser/parser.py 
b/pypy/interpreter/pyparser/parser.py
--- a/pypy/interpreter/pyparser/parser.py
+++ b/pypy/interpreter/pyparser/parser.py
@@ -28,6 +28,7 @@
 new.symbol_ids = self.symbol_ids
 new.symbols_names = self.symbol_names
 new.keyword_ids = self.keyword_ids
+new.token_to_error_string = self.token_to_error_string
 new.dfas = self.dfas
 new.labels = self.labels
 new.token_ids = self.token_ids
diff --git a/pypy/interpreter/pyparser/pygram.py 
b/pypy/interpreter/pyparser/pygram.py
--- a/pypy/interpreter/pyparser/pygram.py
+++ b/pypy/interpreter/pyparser/pygram.py
@@ -23,6 +23,17 @@
 python_grammar_no_print.keyword_ids = 
python_grammar_no_print.keyword_ids.copy()
 del python_grammar_no_print.keyword_ids["print"]
 
+python_grammar_revdb = python_grammar.shared_copy()
+python_grammar_no_print_revdb = python_grammar_no_print.shared_copy()
+copied_token_ids = python_grammar.token_ids.copy()
+python_grammar_revdb.token_ids = copied_token_ids
+python_grammar_no_print_revdb.token_ids = copied_token_ids
+
+metavar_token_id = pytoken.python_tokens['REVDBMETAVAR']
+# the following line affects python_grammar_no_print too, since they share the
+# dict
+del python_grammar.token_ids[metavar_token_id]
+
 class _Tokens(object):
 pass
 for tok_name, idx in pytoken.python_tokens.iteritems():
@@ -39,3 +50,16 @@
 syms._rev_lookup = rev_lookup # for debugging
 
 del _get_python_grammar, _Tokens, tok_name, sym_name, idx
+
+def choose_grammar(print_function, revdb):
+if print_function:
+if revdb:
+return python_grammar_no_print_revdb
+else:
+return python_grammar_no_print
+else:
+if revdb:
+return python_grammar_revdb
+else:
+return python_grammar
+
diff --git a/pypy/interpreter/pyparser/pyparse.py 
b/pypy/interpreter/pyparser/pyparse.py
--- a/pypy/interpreter/pyparser/pyparse.py
+++ b/pypy/interpreter/pyparser/pyparse.py
@@ -165,10 +165,9 @@
 compile_info.last_future_import = last_future_import
 compile_info.flags |= newflags
 
-if compile_info.flags & consts.CO_FUTURE_PRINT_FUNCTION:
-self.grammar = pygram.python_grammar_no_print
-else:
-self.grammar = pygram.python_grammar
+self.grammar = pygram.choose_grammar(
+print_function=compile_info.flags & 
consts.CO_FUTURE_PRINT_FUNCTION,
+revdb=self.space.config.translation.reverse_debugger)
 
 try:
 for token in tokens:
diff --git a/pypy/interpreter/pyparser/test/test_pyparse.py 
b/pypy/interpreter/pyparser/test/test_pyparse.py
--- a/pypy/interpreter/pyparser/test/test_pyparse.py
+++ b/pypy/interpreter/pyparser/test/test_pyparse.py
@@ -168,13 +168,11 @@
 assert expected_tree == tree
 
 def test_revdb_dollar_num(self):
-self.parse('$0')
-self.parse('$5')
-self.parse('$42')
-self.parse('2+$42.attrname')
-py.test.raises(SyntaxError, self.parse, '$')
-py.test.raises(SyntaxError, self.parse, '$a')
-py.test.raises(SyntaxError, self.parse, '$.5')
+assert not self.space.config.translation.reverse_debugger
+py.test.raises(SyntaxError, self.parse, '$0')
+

[pypy-commit] pypy pyparser-improvements-3: merge default

2018-06-05 Thread cfbolz
Author: Carl Friedrich Bolz-Tereick 
Branch: pyparser-improvements-3
Changeset: r94724:6bbf7066c948
Date: 2018-06-04 14:55 +0200
http://bitbucket.org/pypy/pypy/changeset/6bbf7066c948/

Log:merge default

diff too long, truncating to 2000 out of 17409 lines

diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -33,7 +33,12 @@
 050d84dd78997f021acf0e133934275d63547cc0 release-pypy2.7-v5.4.1
 050d84dd78997f021acf0e133934275d63547cc0 release-pypy2.7-v5.4.1
 0e2d9a73f5a1818d0245d75daccdbe21b2d5c3ef release-pypy2.7-v5.4.1
+4909c06daf41ce88f87dc01c57959cadad4df4a8 RevDB-pypy2.7-v5.4.1
+4909c06daf41ce88f87dc01c57959cadad4df4a8 RevDB-pypy2.7-v5.4.1
+d7724c0a5700b895a47de44074cdf5fd659a988f RevDB-pypy2.7-v5.4.1
 aff251e543859ce4508159dd9f1a82a2f553de00 release-pypy2.7-v5.6.0
+e90317857d27917bf840caf675832292ee070510 RevDB-pypy2.7-v5.6.1
+a24d6c7000c8099c73d3660857f7e3cee5ac045c RevDB-pypy2.7-v5.6.2
 fa3249d55d15b9829e1be69cdf45b5a44cec902d release-pypy2.7-v5.7.0
 b16a4363e930f6401bceb499b9520955504c6cb0 release-pypy3.5-v5.7.0
 1aa2d8e03cdfab54b7121e93fda7e98ea88a30bf release-pypy2.7-v5.7.1
@@ -51,3 +56,5 @@
  release-pypy3.5-v5.10.0
 09f9160b643e3f02ccb8c843b2fbb4e5cbf54082 release-pypy3.5-v5.10.0
 3f6eaa010fce78cc7973bdc1dfdb95970f08fed2 release-pypy3.5-v5.10.1
+ab0b9caf307db6592905a80b8faffd69b39005b8 release-pypy2.7-v6.0.0
+fdd60ed87e941677e8ea11acf9f1819466521bf2 release-pypy3.5-v6.0.0
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -247,6 +247,7 @@
   Lukas Vacek
   Omer Katz
   Jacek Generowicz
+  Tomasz Dziopa
   Sylvain Thenault
   Jakub Stasiak
   Andrew Dalke
@@ -307,6 +308,7 @@
   Yury V. Zaytsev
   florinpapa
   Anders Sigfridsson
+  Matt Jackson
   Nikolay Zinov
   rafalgalczyn...@gmail.com
   Joshua Gilbert
diff --git a/dotviewer/font/NOTICE b/dotviewer/font/COPYING.txt
rename from dotviewer/font/NOTICE
rename to dotviewer/font/COPYING.txt
diff --git a/lib-python/2.7/opcode.py b/lib-python/2.7/opcode.py
--- a/lib-python/2.7/opcode.py
+++ b/lib-python/2.7/opcode.py
@@ -194,5 +194,6 @@
 def_op('CALL_METHOD', 202)# #args not including 'self'
 def_op('BUILD_LIST_FROM_ARG', 203)
 jrel_op('JUMP_IF_NOT_DEBUG', 204) # jump over assert statements
+def_op('LOAD_REVDB_VAR', 205) # reverse debugger (syntax example: $5)
 
 del def_op, name_op, jrel_op, jabs_op
diff --git a/lib_pypy/_ctypes/array.py b/lib_pypy/_ctypes/array.py
--- a/lib_pypy/_ctypes/array.py
+++ b/lib_pypy/_ctypes/array.py
@@ -82,8 +82,11 @@
 def _CData_output(self, resarray, base=None, index=-1):
 from _rawffi.alt import types
 # If a char_p or unichar_p is received, skip the string interpretation
-if base._ffiargtype != types.Pointer(types.char_p) and \
-   base._ffiargtype != types.Pointer(types.unichar_p):
+try:
+deref = type(base)._deref_ffiargtype()
+except AttributeError:
+deref = None
+if deref != types.char_p and deref != types.unichar_p:
 # this seems to be a string if we're array of char, surprise!
 from ctypes import c_char, c_wchar
 if self._type_ is c_char:
@@ -120,6 +123,12 @@
 value = self(*value)
 return _CDataMeta.from_param(self, value)
 
+def _build_ffiargtype(self):
+return _ffi.types.Pointer(self._type_.get_ffi_argtype())
+
+def _deref_ffiargtype(self):
+return self._type_.get_ffi_argtype()
+
 def array_get_slice_params(self, index):
 if hasattr(self, '_length_'):
 start, stop, step = index.indices(self._length_)
@@ -248,6 +257,5 @@
 _type_ = base
 )
 cls = ArrayMeta(name, (Array,), tpdict)
-cls._ffiargtype = _ffi.types.Pointer(base.get_ffi_argtype())
 ARRAY_CACHE[key] = cls
 return cls
diff --git a/lib_pypy/_ctypes/basics.py b/lib_pypy/_ctypes/basics.py
--- a/lib_pypy/_ctypes/basics.py
+++ b/lib_pypy/_ctypes/basics.py
@@ -49,10 +49,13 @@
 else:
 return self.from_param(as_parameter)
 
+def _build_ffiargtype(self):
+return _shape_to_ffi_type(self._ffiargshape_)
+
 def get_ffi_argtype(self):
 if self._ffiargtype:
 return self._ffiargtype
-self._ffiargtype = _shape_to_ffi_type(self._ffiargshape_)
+self._ffiargtype = self._build_ffiargtype()
 return self._ffiargtype
 
 def _CData_output(self, resbuffer, base=None, index=-1):
diff --git a/lib_pypy/_ctypes/pointer.py b/lib_pypy/_ctypes/pointer.py
--- a/lib_pypy/_ctypes/pointer.py
+++ b/lib_pypy/_ctypes/pointer.py
@@ -70,7 +70,12 @@
 self._ffiarray = ffiarray
 self.__init__ = __init__
 self._type_ = TP
-self._ffiargtype = _ffi.types.Pointer(TP.get_ffi_argtype())
+
+def _build_ffiargtype(self):
+return _ffi.types.Pointer(self._type_.get_ffi_argtype())
+
+def _deref_ffiargtype(self):
+return self._type_.get_ffi_argtype()