From: Samuele P. <ped...@us...> - 2001-05-27 18:50:59
|
Update of /cvsroot/jython/jython/Tools/jythonc In directory usw-pr-cvs1:/tmp/cvs-serv24686 Modified Files: BaseEvaluator.py ObjectFactory.py PythonModule.py PythonVisitor.py SimpleCompiler.py compile.py Log Message: ** jythonc nested scopes support ** should also solve #222834 import * into locals Index: BaseEvaluator.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/BaseEvaluator.py,v retrieving revision 2.9 retrieving revision 2.10 diff -C2 -r2.9 -r2.10 *** BaseEvaluator.py 2000/11/10 15:06:56 2.9 --- BaseEvaluator.py 2001/05/27 18:50:56 2.10 *************** *** 89,93 **** if node.id == JJTNAME: return self.set_name(node.getInfo(), value) ! elif node.id == JJTLIST or node.id == JJTTUPLE: return self.set_list(nodeToList(node), value) elif node.id == JJTINDEX_OP: --- 89,93 ---- if node.id == JJTNAME: return self.set_name(node.getInfo(), value) ! elif node.id == JJTLIST or node.id == JJTFPLIST or node.id == JJTTUPLE: return self.set_list(nodeToList(node), value) elif node.id == JJTINDEX_OP: Index: ObjectFactory.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/ObjectFactory.py,v retrieving revision 2.7 retrieving revision 2.8 diff -C2 -r2.7 -r2.8 *** ObjectFactory.py 2001/03/22 20:07:08 2.7 --- ObjectFactory.py 2001/05/27 18:50:56 2.8 *************** *** 31,40 **** return Object(ns.getNew(), ns) ! def makeFunction(self, name, args, body, doc=None): ! func = PyFunction(self.parent, self, name, args, body, doc) return Object(func.getNew(), func) ! def makeClass(self, name, bases, body, doc=None): ! cls = PyClass(self.parent, self, name, bases, body, doc) # Yuck! We can't call getNew() before all modules have been analyzed. class DelayGen: --- 31,40 ---- return Object(ns.getNew(), ns) ! def makeFunction(self, name, def_compiler, scope, body, doc=None): ! func = PyFunction(self, name, def_compiler, scope, body, doc) return Object(func.getNew(), func) ! def makeClass(self, name, bases, def_compiler, scope, body, doc=None): ! cls = PyClass(self, name, bases, def_compiler, scope, body, doc) # Yuck! We can't call getNew() before all modules have been analyzed. class DelayGen: *************** *** 105,119 **** return Object(code, Generic) ! def makeFunctionFrame(self): ! return SimpleCompiler.LocalFrame(self.parent) - def makeClassFrame(self): - return SimpleCompiler.LocalFrame(self.parent, - SimpleCompiler.DynamicStringReference) - - def getCompiler(self, frame): - return SimpleCompiler.SimpleCompiler(self.parent.module, self, frame, - self.parent.options) - class FixedObject(PyObject): --- 105,115 ---- return Object(code, Generic) ! def getCompiler(self, parent_compiler, frameCtr, scope): ! return SimpleCompiler.SimpleCompiler(self.parent.module, self, ! parent = parent_compiler, ! frameCtr = frameCtr, ! scope = scope, ! options = self.parent.options) class FixedObject(PyObject): *************** *** 132,166 **** class PyFunction(FixedObject): ! def __init__(self, parent, factory, name, args, body, doc=None): self.name = name self.factory = factory ! self.parent = parent ! self.args = args self.body = body self.doc = doc def getNew(self): ! globals = jast.GetInstanceAttribute(self.parent.frame.frame, "f_globals") pycode = self.makeCode() ! return jast.New("PyFunction", ! [globals, PyObjectArray(self.args.defaults), pycode]) ! def makeCode(self): ! # Don't handle a,b style args yet ! init_code = [] ! frame = self.parent.frame # Add args to funcframe ! funcframe = self.factory.makeFunctionFrame() ! for argname in self.args.names: ! funcframe.setname(argname, self.factory.makePyObject(None)) ! #funcframe.addlocal(argname) # Parse the body ! comp = self.factory.getCompiler(funcframe) ! code = jast.Block([comp.parse(self.body)]) # Set up a code object ! self.pycode = self.parent.module.getCodeConstant( ! self.name, self.args, funcframe.getlocals(), code) ! self.frame = funcframe return self.pycode --- 128,167 ---- class PyFunction(FixedObject): ! def __init__(self, factory, name, def_compiler,scope, body, doc=None): self.name = name self.factory = factory ! self.def_compiler = def_compiler ! self.scope = scope self.body = body self.doc = doc def getNew(self): ! globals = jast.GetInstanceAttribute(self.def_compiler.frame.frame, "f_globals") pycode = self.makeCode() ! defaults = [ d.visit(self.def_compiler.visitor) for d in self.scope.ac.defaults ] ! clos = self.def_compiler.frame.makeClosure(self.scope) ! ctrargs = [globals, PyObjectArray(defaults), pycode] ! if clos: ! ctrargs.append(PyObjectArray(clos)) ! return jast.New("PyFunction", ctrargs) ! def makeCode(self): # now handles a,b style args too # Add args to funcframe ! ac = self.scope.ac # Parse the body ! comp = self.factory.getCompiler(self.def_compiler,SimpleCompiler.FunctionFrame,self.scope) ! for argname in ac.names: ! comp.frame.setname(argname, self.factory.makePyObject(None)) ! ! tree = self.body ! if ac.init_code.numChildren > 0: ! ac.init_code.jjtAddChild(tree, ac.init_code.numChildren) ! tree = ac.init_code ! code = jast.Block([comp.parse(tree)]) # Set up a code object ! self.pycode = self.def_compiler.top_compiler.module.getCodeConstant( ! self.name, code, comp.frame) ! self.frame = comp.frame return self.pycode *************** *** 168,176 **** class PyClass(FixedObject): ! def __init__(self, parent, factory, name, bases, body, doc=None): self.name = name - self.parent = parent self.factory = factory self.bases = bases self.body = body self.doc = doc --- 169,178 ---- class PyClass(FixedObject): ! def __init__(self, factory, name, bases, def_compiler, scope, body, doc=None): self.name = name self.factory = factory self.bases = bases + self.def_compiler = def_compiler + self.scope = scope self.body = body self.doc = doc *************** *** 184,187 **** --- 186,193 ---- args.append(jast.Identifier("%s.class" % self.proxyname)) + clos = self.def_compiler.frame.makeClosure(self.scope) + if clos: + args.append(PyObjectArray(clos)) + return jast.InvokeStatic("Py", "makeClass", args) *************** *** 241,253 **** def makeCode(self): ! classframe = self.factory.makeClassFrame() ! comp = self.factory.getCompiler(classframe) code = jast.Block([comp.parse(self.body), ! jast.Return(jast.Invoke(classframe.frame, "getf_locals", []))]) ! self.frame = classframe ! self.pycode = self.parent.module.getCodeConstant( ! self.name, None, ! classframe.getlocals(), code) return self.pycode --- 247,258 ---- def makeCode(self): ! comp = self.factory.getCompiler(self.def_compiler, ! SimpleCompiler.ClassFrame, self.scope) code = jast.Block([comp.parse(self.body), ! jast.Return(jast.Invoke(comp.frame.frame, "getf_locals", []))]) ! self.frame = comp.frame ! self.pycode = self.def_compiler.top_compiler.module.getCodeConstant( ! self.name, code, comp.frame) return self.pycode Index: PythonModule.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/PythonModule.py,v retrieving revision 2.13 retrieving revision 2.14 diff -C2 -r2.13 -r2.14 *** PythonModule.py 2000/11/20 21:55:49 2.13 --- PythonModule.py 2001/05/27 18:50:56 2.14 *************** *** 5,13 **** import jast import java, org - from PythonVisitor import Arguments EMPTYSTRING = '' """ --- 5,14 ---- import jast import java, org EMPTYSTRING = '' + from org.python.core.PyTableCode import CO_OPTIMIZED,CO_NESTED + """ *************** *** 44,47 **** --- 45,55 ---- + + def StringArrayOrNull(strs): + if strs: + return jast.StringArray(strs) + else: + return jast.Null + class PythonInner: def __init__(self, parent): *************** *** 95,104 **** return self.getConstant(value, code, "s") ! def getCodeConstant(self, name, args, locals, code): ! if args is None: ! args = Arguments([]) label = "c$%d_%s" % (len(self.codes), legalJavaName(name)) ret = jast.Identifier(label) ! self.codes.append( (label, name, args, locals, code) ) return ret --- 103,110 ---- return self.getConstant(value, code, "s") ! def getCodeConstant(self, name, code, frame): label = "c$%d_%s" % (len(self.codes), legalJavaName(name)) ret = jast.Identifier(label) ! self.codes.append( (label, name, code, frame) ) return ret *************** *** 119,135 **** self.constants.append(["PyFunctionTable", self.getFunctionTable(), jast.New(self.name, [])]) - for label, name, args, locals, code in self.codes: funcid = self.addFunctionCode(name, code) arglist = keyworddict = jast.False ! if args.arglist: arglist = jast.True ! if args.keyworddict: keyworddict = jast.True ! names = jast.StringArray(locals) ! cargs = [jast.IntegerConstant(len(args.names)), names, jast.StringConstant(self.filename), --- 125,146 ---- self.constants.append(["PyFunctionTable", self.getFunctionTable(), jast.New(self.name, [])]) + + for label, name, code, frame in self.codes: + code = frame.toCellPrepend(code) funcid = self.addFunctionCode(name, code) arglist = keyworddict = jast.False ! if frame.args_arglist(): arglist = jast.True ! if frame.args_keyworddict(): keyworddict = jast.True ! names = jast.StringArray(frame.getnames()) ! cellnames = StringArrayOrNull(frame.getcellnames()) ! freenames = StringArrayOrNull(frame.getfreenames()) ! npurecell = frame.get_npurecell() ! cargs = [jast.IntegerConstant(frame.args_count()), names, jast.StringConstant(self.filename), *************** *** 138,142 **** keyworddict, self.getFunctionTable(), ! jast.IntegerConstant(funcid)] newcode = jast.InvokeStatic("Py", "newCode", cargs) self.constants.append(("PyCode", jast.Identifier(label), newcode)) --- 149,157 ---- keyworddict, self.getFunctionTable(), ! jast.IntegerConstant(funcid), ! cellnames, ! freenames, ! jast.IntegerConstant(npurecell), ! jast.IntegerConstant((frame.opt_globals and CO_OPTIMIZED) | (frame.scope.nested_scopes and CO_NESTED))] newcode = jast.InvokeStatic("Py", "newCode", cargs) self.constants.append(("PyCode", jast.Identifier(label), newcode)) *************** *** 184,189 **** def addMain(self, code, cc): ! self.mainCode = self.getCodeConstant("main", Arguments([]), ! cc.frame.getlocals(), code) def dumpMain(self): --- 199,203 ---- def addMain(self, code, cc): ! self.mainCode = self.getCodeConstant("main", code, cc.frame) def dumpMain(self): *************** *** 302,307 **** return self.pyinner.getStringConstant(value) ! def getCodeConstant(self, name, args, locals, code): ! return self.pyinner.getCodeConstant(name, args, locals, code) def addFunctionCode(self, name, code): --- 316,321 ---- return self.pyinner.getStringConstant(value) ! def getCodeConstant(self, name, code, frame): ! return self.pyinner.getCodeConstant(name, code, frame) def addFunctionCode(self, name, code): Index: PythonVisitor.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/PythonVisitor.py,v retrieving revision 2.7 retrieving revision 2.8 diff -C2 -r2.7 -r2.8 *** PythonVisitor.py 2000/11/10 15:08:48 2.7 --- PythonVisitor.py 2001/05/27 18:50:56 2.8 *************** *** 5,8 **** --- 5,10 ---- from org.python.parser import SimpleNode + from org.python.compiler import Future + comp_ops = {JJTLESS_CMP : 'lt', *************** *** 34,76 **** - class Arguments(Visitor): - def __init__(self, parent, argslist=None): - self.arglist = 0 - self.keyworddict = 0 - self.names = [] - self.defaults = [] - - self.parent = parent - - if argslist is not None: - argslist.visit(self) - - def varargslist(self, node): - for i in range(node.numChildren): - node.getChild(i).visit(self) - - def ExtraArgList(self, node): - self.arglist = 1 - self.names.append(node.getChild(0).visit(self)) - - def ExtraKeywordList(self, node): - self.keyworddict = 1 - self.names.append(node.getChild(0).visit(self)) - - def defaultarg(self, node): - name = node.getChild(0).visit(self) - self.names.append(name) - if node.numChildren > 1: - self.defaults.append(node.getChild(1).visit(self.parent)) - - def fplist(self, node): - return 'ugh' - pass # ??? - - def Name(self, node): - return node.getInfo() - - - def getDocString(suite): if suite.numChildren > 0: --- 36,39 ---- *************** *** 165,168 **** --- 128,132 ---- def ImportFrom(self, node): + Future.checkFromFuture(node) # future stmt support self.startnode(node) if node.numChildren > 1: *************** *** 520,542 **** doc = getDocString(Body) - if node.numChildren > 2: - args = Arguments(self, node.getChild(1)) - else: - args = Arguments(self) ! return self.walker.funcdef(funcname, args, Body, doc) def lambdef(self, node): Body = node.getChild(node.numChildren-1) - if node.numChildren > 1: - args = Arguments(self, node.getChild(0)) - else: - args = Arguments(self) - retBody = SimpleNode(JJTRETURN_STMT) retBody.jjtAddChild(Body, 0) ! return self.walker.lambdef(args, retBody) def classdef(self, node): --- 484,497 ---- doc = getDocString(Body) ! return self.walker.funcdef(funcname, node.scope, Body, doc) def lambdef(self, node): Body = node.getChild(node.numChildren-1) retBody = SimpleNode(JJTRETURN_STMT) retBody.jjtAddChild(Body, 0) ! return self.walker.lambdef(node.scope, retBody) def classdef(self, node): *************** *** 551,553 **** bases.append(node.getChild(i).visit(self)) ! return self.walker.classdef(name, bases, suite, doc) --- 506,508 ---- bases.append(node.getChild(i).visit(self)) ! return self.walker.classdef(name, bases, node.scope, suite, doc) Index: SimpleCompiler.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/SimpleCompiler.py,v retrieving revision 2.13 retrieving revision 2.14 diff -C2 -r2.13 -r2.14 *** SimpleCompiler.py 2001/02/25 15:37:21 2.13 --- SimpleCompiler.py 2001/05/27 18:50:56 2.14 *************** *** 2,6 **** from BaseEvaluator import BaseEvaluator - from PythonVisitor import Arguments import jast import ImportName --- 2,5 ---- *************** *** 8,127 **** COMMASPACE = ', ' ! ! class Reference: ! def __init__(self, frame, name): ! self.iframe = frame.frame ! self.frame = frame ! self.locals = frame.locals ! self.name = name ! self.value = None ! self.init() ! ! def init(self): pass ! ! def noValue(self): ! raise NameError, 'try to get %s before set' % repr(self.name) ! ! def getValue(self): ! if self.value is None: ! return self.noValue() ! return self.value ! ! def setValue(self, value): ! if self.value is None: ! self.value = value.makeReference(self.getCode()) ! else: ! # Might want to try and merge types here... ! self.value = self.value.mergeWith(value) ! self.value.code = self.getCode() ! #PyObject(self.getCode(), None) ! return self.setCode(value) ! ! def delValue(self): ! #self.value = None ! return self.delCode() ! ! class DynamicIntReference(Reference): ! def init(self): ! self.ivalue = jast.IntegerConstant(len(self.locals)) ! ! def getCode(self): ! return jast.Invoke(self.iframe, "getlocal", (self.ivalue,)) ! ! def setCode(self, value): ! return jast.Invoke(self.iframe, "setlocal", ! (self.ivalue, value.asAny())) ! def delCode(self): ! return jast.Invoke(self.iframe, "dellocal", (self.ivalue,)) ! ! class DynamicStringReference(Reference): ! def init(self): ! self.ivalue = jast.StringConstant(self.name) ! ! def getCode(self): ! return jast.Invoke(self.iframe, "getname", (self.ivalue,)) ! ! def delCode(self): ! return jast.Invoke(self.iframe, "delname", (self.ivalue,)) ! ! def setCode(self, value): ! return jast.Invoke(self.iframe, "setlocal", ! (self.ivalue, value.asAny())) ! ! class DynamicStringReference2(DynamicStringReference): ! def setCode(self, value): ! return jast.Invoke(self.iframe, "setglobal", ! (self.ivalue, value.asAny())) ! ! def noValue(self): ! # Reference to builtin ! return self.frame.parent.factory.makePyObject(self.getCode()) ! ! class DynamicGlobalStringReference(Reference): ! def init(self): ! self.ivalue = jast.StringConstant(self.name) ! ! def getCode(self): ! return jast.Invoke(self.iframe, "getglobal", (self.ivalue,)) ! ! def delCode(self): ! return jast.Invoke(self.iframe, "delglobal", (self.ivalue,)) ! ! def setCode(self, value): ! return jast.Invoke(self.iframe, "setglobal", ! (self.ivalue, value.asAny())) ! ! def noValue(self): ! # Reference to builtin ! return self.frame.parent.factory.makePyObject(self.getCode()) ! ! class LocalFrame: ! def __init__(self, parent, newReference=DynamicIntReference): ! self.frame = jast.Identifier("frame") ! ! # This should only use SlowGlobals if the function uses ! # ImportAll or ExecStmt. If not it should use ! # parent.globalNamespace. ! ! #self.globalNamespace = SlowGlobals(parent) ! self.globalNamespace = parent.globalNamespace ! ! self.parent = parent ! self.newReference = newReference ! ! self.names = {} ! self.globals = {} ! self.locals = [] ! self.temporaries = {} def gettemps(self, type): --- 7,81 ---- COMMASPACE = ', ' + from org.python.compiler import ScopesCompiler, Future, CompilationContext + from org.python.compiler.ScopeConstants import * ! import warnings ! from org.python.parser import ParseException ! class LocalFrame: ! def __init__(self, compiler, scope=None): ! ! self.frame = jast.Identifier("frame") ! self.compiler = compiler + self.names = {} ! self.temporaries = {} ! self.scope = scope + self.fast_locals = 0 + self.opt_globals = 0 ! def setupClosure(self,nested_scope): ! nested_scope.setup_closure(self.scope) ! def makeClosure(self,nested_scope): ! freenames = nested_scope.freevars ! if len(freenames) == 0: return None ! clos = [] ! factory = self.compiler.factory ! for free in freenames: ! i = self.scope.tbl.get(free).env_index ! code = jast.Invoke(self.frame, "getclosure", [jast.IntegerConstant(i)]) ! clos.append(factory.makePyObject(code)) ! return clos ! ! def getnames(self): ! return self.scope.names ! ! def args_count(self): ! if self.scope.ac: ! return len(self.scope.ac.names) ! return 0 ! ! def args_arglist(self): ! return self.scope.ac and self.scope.ac.arglist ! ! def args_keyworddict(self): ! return self.scope.ac and self.scope.ac.keywordlist ! ! def getfreenames(self): ! return self.scope.freevars ! ! def getcellnames(self): ! return self.scope.cellvars ! ! def get_npurecell(self): ! return self.scope.jy_npurecell ! ! def toCellPrepend(self,code): ! scope = self.scope ! pre = [] ! for parmcell in scope.jy_paramcells: ! syminf = scope.tbl.get(parmcell) ! args = [jast.IntegerConstant(syminf.locals_index), ! jast.IntegerConstant(syminf.env_index)] ! pre.append(jast.Invoke(self.frame, "to_cell", args)) ! if not pre: return code ! pre.append(jast.BlankLine()) ! return jast.Block(jast.flatten([pre,code])) def gettemps(self, type): *************** *** 162,200 **** temps[index] = None ! def getname(self, name): ! if not self.names.has_key(name): ! return self.globalNamespace.getname(self, name) ! ref = self.getReference(name) ! return ref.getValue() ! def delname(self, name): ! if self.globals.has_key(name): ! return self.globalNamespace.delname(self, name) ! ref = self.getReference(name) ! return ref.delValue() ! def setname(self, name, value): ! if self.globals.has_key(name): ! return self.globalNamespace.setname(self, name, value) ! ref = self.getReference(name) ! return ref.setValue(value) ! ! def addglobal(self, name): ! self.globals[name] = 1 ! def addlocal(self, name): ! self.getReference(name) ! def getlocals(self): ! return self.locals ! def getReference(self, name): ! if self.names.has_key(name): ! return self.names[name] ! ret = self.newReference(self, name) ! self.names[name] = ret ! self.locals.append(name) ! return ret def getDeclarations(self): if len(self.temporaries) == 0: --- 116,203 ---- temps[index] = None ! def get_local_value(self,name): ! if self.names.has_key(name): return self.names[name] ! return None # ?? better to fail? when? ! ! def get_closure_value(self,name,up=0): ! if not up: ! syminf = self.scope.tbl.get(name) ! if syminf and syminf.flags&CELL: return self.get_local_value(name) ! return self.compiler.parent_compiler.frame.get_closure_value(name) ! ! def get_global_value(self,name): ! return self.compiler.top_compiler.frame.get_local_value(name) ! ! def get_name_value(self,name): ! if self.names.has_key(name): return self.names[name] ! return self.get_global_value(name) ! def set_global_value(self,name,value): ! self.compiler.top_compiler.frame.set_value(name,value) ! def set_value(self,name,value): ! if self.names.has_key(name): ! self.names[name] = self.names[name].mergeWith(value) ! return ! self.names[name] = value ! ! def delCode(self,method,ref): ! if type(ref) is type(""): ! ref = (jast.StringConstant(ref),) ! else: ! ref = (jast.IntegerConstant(ref),) ! return jast.Invoke(self.frame,method,ref) ! ! def getReference(self,value,method,ref): ! code = self.delCode(method,ref) ! if value: return value.makeReference(code) ! return self.compiler.factory.makePyObject(code) ! ! def setCode(self,method,ref,value): ! if type(ref) is type(""): ! args = (jast.StringConstant(ref),value.asAny()) ! else: ! args = (jast.IntegerConstant(ref),value.asAny()) ! return jast.Invoke(self.frame,method,args) ! def getglobal(self,name): ! return self.getReference(self.get_global_value(name),'getglobal',name) ! def getname(self, name): ! syminf = self.scope.tbl.get(name) ! if syminf: ! flags = syminf.flags ! if not self.scope.nested_scopes: flags &= ~FREE ! if flags&GLOBAL or self.opt_globals and not (flags&(BOUND|CELL|FREE)): ! return self.getglobal(name) ! if self.fast_locals: ! if flags&CELL: return self.getReference( ! self.get_closure_value(name),'getderef',syminf.env_index) ! if flags&BOUND: return self.getReference( ! self.get_local_value(name),'getlocal',syminf.locals_index) ! if flags&FREE and not flags&BOUND: return self.getReference( ! self.get_closure_value(name,up=1),'getderef',syminf.env_index) ! return self.getReference(self.get_name_value(name),'getname',name) ! ! def delname(self, name): ! syminf = self.scope.tbl.get(name) ! if syminf and syminf.flags&GLOBAL: return self.delCode('delglobal',name) ! if not self.fast_locals: return self.delCode('dellocal',name) ! if syminf.flags&CELL: raise NameError,"can not delete variable '%s' referenced in nested scope" % name ! return self.delCode('dellocal',syminf.locals_index) + def setname(self, name, value): + syminf = self.scope.tbl.get(name) + if syminf and syminf.flags&GLOBAL: + self.set_global_value(name,value) + return self.setCode('setglobal',name,value) + + self.set_value(name,value) + + if not self.fast_locals: return self.setCode('setlocal',name,value) + if syminf and syminf.flags&CELL: return self.setCode('setderef',syminf.env_index,value) + return self.setCode('setlocal',syminf.locals_index,value) + def getDeclarations(self): if len(self.temporaries) == 0: *************** *** 214,265 **** class GlobalFrame(LocalFrame): ! def __init__(self, parent): ! LocalFrame.__init__(self, parent) ! self.globalNamespace = parent.globalNamespace ! def getReference(self, name): ! return self.globalNamespace.getReference(self, name) ! ! ! class BasicGlobals: ! def __init__(self, parent, newReference=DynamicGlobalStringReference): ! self.names = {} ! self.newReference = newReference ! self.parent = parent ! ! def delname(self, frame, name): ! ref = self.getReference(frame, name) ! return ref.delValue() ! ! def getname(self, frame, name): ! ref = self.getReference(frame, name) ! return ref.getValue() ! ! def setname(self, frame, name, value): ! ref = self.getReference(frame, name) ! return ref.setValue(value) ! ! def getReference(self, frame, name): ! if self.names.has_key(name): ! return self.names[name] ! ret = self.newReference(frame, name) ! self.names[name] = ret ! return ret ! ! class SlowGlobals(BasicGlobals): ! def __init__(self, parent, newReference=DynamicStringReference2): ! self.names = {} ! self.newReference = newReference ! self.parent = parent ! class SimpleCompiler(BaseEvaluator): ! def __init__(self, module, factory, frame=None, options=None): BaseEvaluator.__init__(self) ! self.globalNamespace = BasicGlobals(self) ! if frame is None: frame = GlobalFrame(self) self.frame = frame self.module = module --- 217,250 ---- class GlobalFrame(LocalFrame): ! def __init__(self, compiler): ! LocalFrame.__init__(self, compiler) ! def setScope(self,scope): self.scope = scope ! class ClassFrame(LocalFrame): ! def getnames(self): ! return [] + class FunctionFrame(LocalFrame): + def __init__(self,compiler,scope): + LocalFrame.__init__(self,compiler,scope=scope) + self.fast_locals = 1 + self.opt_globals = not scope.exec and not scope.from_import_star ! class SimpleCompiler(BaseEvaluator, CompilationContext): ! def __init__(self, module, factory, parent=None, frameCtr=None, scope=None, ! options=None): BaseEvaluator.__init__(self) ! ! if parent is None: frame = GlobalFrame(self) + self.parent_compiler = None + self.top_compiler = self + else: + frame = frameCtr(self, scope=scope) + self.parent_compiler = parent + self.top_compiler = parent.top_compiler + self.frame = frame self.module = module *************** *** 274,278 **** --- 259,283 ---- return name in self.options.falsenames + def getFutures(self): + return self._futures + + def getFilename(self): + return self.module.filename + + def error(self,msg,err,node): + if not err: + try: + warnings.warn_explicit(msg,SyntaxWarning,self.getFilename(),node.beginLine) + return + except Exception,e: + if not isinstance(e,SyntaxWarning): raise e + raise ParseException(msg,node) + def parse(self, node): + if isinstance(self.frame,GlobalFrame): + futures = self._futures = Future() + futures.preprocessFutures(node,None) + ScopesCompiler(self).parse(node) + self.frame.setScope(node.scope) ret = BaseEvaluator.parse(self, node) #print 'parse', ret *************** *** 389,394 **** def global_stmt(self, names): - for name in names: - self.frame.addglobal(name) return jast.SimpleComment('global ' + COMMASPACE.join(names)) --- 394,397 ---- *************** *** 568,572 **** args.append(message.asAny()) ! return jast.If(self.name_const("__debug__").nonzero(), jast.InvokeStatic("Py", "assert", args)) --- 571,575 ---- args.append(message.asAny()) ! return jast.If(self.frame.getglobal("__debug__").nonzero(), jast.InvokeStatic("Py", "assert", args)) *************** *** 715,728 **** return [init, jast.While(test, suite)] ! def funcdef(self, name, args, body, doc=None): ! func = self.factory.makeFunction(name, args, body, doc) return self.set_name(name, func) ! def lambdef(self, args, body): ! func = self.factory.makeFunction("<lambda>", args, body) return func ! def classdef(self, name, bases, body, doc=None): ! c = self.factory.makeClass(name, bases, body, doc) self.module.classes[name] = c return self.set_name(name, c) --- 718,734 ---- return [init, jast.While(test, suite)] ! def funcdef(self, name, scope, body, doc=None): ! self.frame.setupClosure(scope) ! func = self.factory.makeFunction(name, self, scope, body, doc) return self.set_name(name, func) ! def lambdef(self, scope, body): ! self.frame.setupClosure(scope) ! func = self.factory.makeFunction("<lambda>", self, scope, body) return func ! def classdef(self, name, bases, scope, body, doc=None): ! self.frame.setupClosure(scope) ! c = self.factory.makeClass(name, bases, self, scope, body, doc) self.module.classes[name] = c return self.set_name(name, c) Index: compile.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/compile.py,v retrieving revision 2.17 retrieving revision 2.18 diff -C2 -r2.17 -r2.18 *** compile.py 2001/03/22 20:07:08 2.17 --- compile.py 2001/05/27 18:50:56 2.18 *************** *** 136,143 **** methods = [] for name, func in frame.names.items(): ! v = func.value.value args = None ! if hasattr(v, 'args'): ! args = v.args sig = None if hasattr(v, 'doc'): --- 136,143 ---- methods = [] for name, func in frame.names.items(): ! v = func.value args = None ! if hasattr(v, 'frame'): ! args = v.frame.scope.ac sig = None if hasattr(v, 'doc'): *************** *** 221,231 **** name = self.javapackage+'.'+name ! data = "__file__=%s\n" % repr(filename) + data + '\n\n' ! mod = PythonModule(name, filename, frozen=self.deep) fact = ObjectFactory() pi = SimpleCompiler(mod, fact, options=self.options) fact.parent = pi ! code = jast.Block(pi.execstring(data)) mod.addMain(code, pi) self.addDependencies(mod) --- 221,237 ---- name = self.javapackage+'.'+name ! data = data + '\n\n' ! mod = PythonModule(name, filename, frozen=self.deep) fact = ObjectFactory() pi = SimpleCompiler(mod, fact, options=self.options) fact.parent = pi ! code = pi.execstring(data) ! # __file__ ! code.insert(0,jast.Invoke(jast.Identifier('frame'),"setglobal", ! [jast.StringConstant('__file__'), ! mod.getStringConstant(filename)])) ! code.insert(1,jast.BlankLine()) ! code = jast.Block(code) mod.addMain(code, pi) self.addDependencies(mod) |