Skip to content

Commit

Permalink
Fix Collector #902: Script recursion broken due to shared globals.
Browse files Browse the repository at this point in the history
  • Loading branch information
Evan Simpson committed Jun 10, 2003
1 parent b38452c commit 70c83e5
Showing 1 changed file with 14 additions and 15 deletions.
29 changes: 14 additions & 15 deletions PythonScript.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
Python code.
"""

__version__='$Revision: 1.44 $'[11:-2]
__version__='$Revision: 1.45 $'[11:-2]

import sys, os, traceback, re, marshal
import sys, os, traceback, re, marshal, new
from Globals import DTMLFile, MessageDialog, package_home
import AccessControl, OFS, RestrictedPython
from OFS.SimpleItem import SimpleItem
Expand Down Expand Up @@ -210,7 +210,7 @@ def __setstate__(self, state):
self._compile()
self._v_change = 1
elif self._code is None:
self._v_f = None
self._v_ft = None
else:
self._newfun(marshal.loads(self._code))

Expand All @@ -224,7 +224,7 @@ def _compile(self):
self.warnings = tuple(r[2])
if errors:
self._code = None
self._v_f = None
self._v_ft = None
self._setFuncSignature((), (), 0)
# Fix up syntax errors.
filestring = ' File "<string>",'
Expand Down Expand Up @@ -255,15 +255,16 @@ def _newfun(self, code):
}
l = {}
exec code in g, l
self._v_f = f = l.values()[0]
f = l.values()[0]
self._v_ft = (f.func_code, g, f.func_defaults or ())
return f

def _makeFunction(self, dummy=0): # CMFCore.FSPythonScript uses dummy arg.
self.ZCacheable_invalidate()
self._compile()

def _editedBindings(self):
if getattr(self, '_v_f', None) is not None:
if getattr(self, '_v_ft', None) is not None:
self._makeFunction()

def _exec(self, bound_names, args, kw):
Expand Down Expand Up @@ -292,21 +293,19 @@ def _exec(self, bound_names, args, kw):

#__traceback_info__ = bound_names, args, kw, self.func_defaults

f = self._v_f
if f is None:
ft = self._v_ft
if ft is None:
__traceback_supplement__ = (
PythonScriptTracebackSupplement, self)
raise RuntimeError, '%s %s has errors.' % (self.meta_type, self.id)

fcode, g, fadefs = ft
g = g.copy()
if bound_names is not None:
# XXX This causes the whole acquisition chain
# to be held by self._v_f. I think we really should
# use new.function() instead, similar to
# CMFCore.FSPythonScript. new.function() takes
# about 8 microseconds on a 1 GHz Athlon. - Shane
f.func_globals.update(bound_names)
f.func_globals['__traceback_supplement__'] = (
g.update(bound_names)
g['__traceback_supplement__'] = (
PythonScriptTracebackSupplement, self, -1)
f = new.function(fcode, g, None, fadefs)

# Execute the function in a new security context.
security=getSecurityManager()
Expand Down

0 comments on commit 70c83e5

Please sign in to comment.