From 54ccb67f95fc0e64f30ec17aa953a126364f448a Mon Sep 17 00:00:00 2001 From: dosmoc Date: Tue, 8 Sep 2015 16:30:25 -0700 Subject: [PATCH 1/2] ensure from __future__ import causes appropriate compiler flags to be added to subsequent calls to eval and exec --- py-src/ltmain.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/py-src/ltmain.py b/py-src/ltmain.py index e07f173..591f085 100644 --- a/py-src/ltmain.py +++ b/py-src/ltmain.py @@ -14,6 +14,9 @@ import asyncore import signal import lttools +import __future__ +import operator +import functools oldout = sys.stdout olderr = sys.stderr @@ -21,6 +24,7 @@ local = True threads = [] currentClient = 0 +compilerFlags = 0 class Printer(): cur = "" @@ -147,6 +151,14 @@ def stopped(): global stop return stop +def featureFlags(code): + names = code.co_names[1:] + return [getattr(__future__, name).compiler_flag for name in names] + +def addFlags(current, new): + new.append(current) + return functools.reduce(operator.or_, new) + def handleEval(data): result = None code = cleanCode(data[2]["code"]) @@ -190,11 +202,14 @@ def handleEval(data): loc = form[0] isEval = False try: - code= compile(ensureUtf(code), ensureUtf(data[2]["name"]), 'eval') + code= compile(ensureUtf(code), ensureUtf(data[2]["name"]), 'eval', compilerFlags) isEval = True except: try: - code= compile(ensureUtf(code), ensureUtf(data[2]["name"]), 'exec') + global compilerFlags + code= compile(ensureUtf(code), ensureUtf(data[2]["name"]), 'exec', compilerFlags) + if code.co_names[0] == '__future__': + compilerFlags = addFlags(compilerFlags, featureFlags(code)) except: e = traceback.format_exc() send(data[0], "editor.eval.python.exception", {"ex": cleanTrace(e), "meta": loc}) From 8f4f57f0fb9b2d5092285c0e7e28d7fac9e9a2ee Mon Sep 17 00:00:00 2001 From: dosmoc Date: Tue, 8 Sep 2015 16:55:57 -0700 Subject: [PATCH 2/2] make sure to try retrieve flags only for features --- py-src/ltmain.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/py-src/ltmain.py b/py-src/ltmain.py index 591f085..2d1bb47 100644 --- a/py-src/ltmain.py +++ b/py-src/ltmain.py @@ -152,7 +152,11 @@ def stopped(): return stop def featureFlags(code): - names = code.co_names[1:] + futureItems = __future__.__dict__.iteritems() + #ensure we only try to get flags for features + featureNames = [k for k,v in futureItems if hasattr(v, 'compiler_flag')] + names = [n for n in code.co_names[1:] if n in featureNames] + return [getattr(__future__, name).compiler_flag for name in names] def addFlags(current, new):