From: Philip S. <ph...@se...> - 2006-04-18 03:34:19
|
Hi all, First things first: I am really enjoying Spyce; it is making my development work a lot easier. Today I came across a problem that I don't know what to make of, and I've narrowed it down to a very specific test case. My file test.spy (at the end of this message) makes use of a custom tag library called FooTagLibrary.spy. The custom tag lib is ultra-simple: [[.tagcollection ]] [[.begin name=DoNothing buffers=False singleton=True]] [[\ pass ]] [[.end]] test.spy includes this tag lib and uses the DoNothing tag. The strange part is that if I define a Python function inside test.spy, including certain Python code in that function causes the Spyce compilation to error out with this message: Traceback (most recent call last): File "/usr/local/share/spyce-2.0.3/spyce.py", line 554, in __init__ try: exec self.getCode() in self._codeenv SyntaxError: unqualified exec is not allowed in function 'spyceProcess' it contains a nested function with free variables (<string>, line 39) The troublesome code can be quite innocuous; a function body as simple as "return True" triggers what I'm seeing. The name of the function that I define doesn't appear to have any bearing on the problem. If I remove the reference to foo:DoNothing from test.spy, the problem goes away. I can't even begin to imagine what's happening here. Any suggestions would be appreciated. CHeers Philip The contents of test.spy follow -- [[.taglib from=FooTagLibrary.spy as=foo]] <html> <head> <title>testing</title> </head> <body> [[\ def trouble(): # These cause the error -- bool(0) #int(0) #str(0) #float(0) #return True #True == 1 # These do not -- #return 1 #pass #print "boom" #1 == 1 #return 1 == 1 #return (1 == 1) ]] <foo:DoNothing /> </body> </html> |
From: Jonathan E. <jon...@ca...> - 2006-04-18 05:09:34
|
Well, the long explanation is, I was pretty new to the whole "write a compiler in Python" thing when I released Spyce 2.0, and I made a couple mistakes. Placing some unnecessary unqualified execs in the generated code was one of them. (See http://spyced.blogspot.com/2005/04/how-well-do-you-know-python-part-4.html for what this means.) This is fixed in the subversion 2.1 code, but in 2.0, you can work around it by pushing your function up to the class level, i.e., instead of [[\ def trouble(): ... ]] use [[! def trouble(self): ... ]] and then call self.trouble(). -Jonathan -- C++ is history repeated as tragedy. Java is history repeated as farce. --Scott McKay |
From: Philip S. <ph...@se...> - 2006-04-18 14:26:31
|
On Apr 18, 2006, at 1:08 AM, Jonathan Ellis wrote: > Well, the long explanation is, I was pretty new to the whole "write a > compiler in Python" thing when I released Spyce 2.0, and I made a > couple > mistakes. Placing some unnecessary unqualified execs in the generated > code was one of them. (See > http://spyced.blogspot.com/2005/04/how-well-do-you-know-python-part > -4.html > for what this means.) OK, thanks for that. I thought I was going crazy. > This is fixed in the subversion 2.1 code, but in 2.0, you can work > around it by pushing your function up to the class level, OK, I'll do that. Just out of curiosity, how complicated would it be to patch a 2.0.3 installation for this bug? Thanks for all of your work on Spyce. bye Philip |
From: Jonathan E. <jon...@ca...> - 2006-04-18 15:30:58
|
On Tue, 18 Apr 2006 10:26:31 -0400, "Philip Semanchuk" <ph...@se...> said: > > This is fixed in the subversion 2.1 code, but in 2.0, you can work > > around it by pushing your function up to the class level, > > OK, I'll do that. Just out of curiosity, how complicated would it be to > patch a 2.0.3 installation for this bug? You'd just have to backport changeset 841. It won't apply cleanly to 2.0.3 but it should be pretty obvious what you'd have to change. -J -- C++ is history repeated as tragedy. Java is history repeated as farce. --Scott McKay |