From: Samuele P. <ped...@us...> - 2001-06-30 01:03:16
|
Update of /cvsroot/jython/jython/Tools/jythonc In directory usw-pr-cvs1:/tmp/cvs-serv29366 Modified Files: ObjectFactory.py compile.py proxies.py Log Message: jythonc fix for #222819; fix for #436730. Index: ObjectFactory.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/ObjectFactory.py,v retrieving revision 2.8 retrieving revision 2.9 diff -C2 -r2.8 -r2.9 *** ObjectFactory.py 2001/05/27 18:50:56 2.8 --- ObjectFactory.py 2001/06/30 01:03:13 2.9 *************** *** 192,195 **** --- 192,213 ---- return jast.InvokeStatic("Py", "makeClass", args) + # proper logic for retrieving superproxy name + def _takeSupername(self,cls,mod,modname = None): + if modname is None: + modname = "" + if mod.package: modname = mod.package+'.' + modname += mod.name + self.javaclasses.extend(cls.javaclasses) + self.proxyname = self.name + self.supername = None + self.issuperproxy = 1 + full_py = modname + '.' + cls.name + if cls.name != mod.name: + self.pySupername = self.supername = full_py + else: + self.pySupername = full_py + self.supername = modname + self.supername = ':'+self.supername # ':' => Compiler will in case prefix this with opts.javapackage + def isSuperclassJava(self): if hasattr(self, 'javaclasses'): *************** *** 199,202 **** --- 217,221 ---- self.proxyname = None self.supername = None + self.pySupername = None self.issuperproxy = 0 import compile *************** *** 218,225 **** if isinstance(base, PyClass): if base.isSuperclassJava(): ! self.javaclasses.extend(base.javaclasses) ! self.proxyname = self.name ! self.supername = base.name ! self.issuperproxy = 1 continue if isinstance(base, PyNamespace): --- 237,241 ---- if isinstance(base, PyClass): if base.isSuperclassJava(): ! self._takeSupername(base,base.def_compiler.module) continue if isinstance(base, PyNamespace): *************** *** 232,241 **** if cls: if cls.value.isSuperclassJava(): ! self.javaclasses.extend(cls.value.javaclasses) ! self.proxyname = self.name ! self.supername = cls.value.name ! self.issuperproxy = 1 ! if cls.value.name != mod.name: ! self.supername = mod.name + '.' + self.supername continue --- 248,252 ---- if cls: if cls.value.isSuperclassJava(): ! self._takeSupername(cls.value,mod,modname = modname) continue Index: compile.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/compile.py,v retrieving revision 2.18 retrieving revision 2.19 diff -C2 -r2.18 -r2.19 *** compile.py 2001/05/27 18:50:56 2.18 --- compile.py 2001/06/30 01:03:13 2.19 *************** *** 132,155 **** - def makeJavaProxy(module, pyc): - frame = pyc.frame - 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'): - if name == "__init__": - sig = getsig(v.doc, args, constructor=1) - else: - sig = getsig(v.doc, args, constructor=0) - methods.append( (name, args, sig) ) - supername = None - if pyc.isSuperclassJava(): - return proxies.JavaProxy(pyc.name, pyc.supername, - pyc.javaclasses, methods, module, pyc.issuperproxy) - return None --- 132,135 ---- *************** *** 316,326 **** if prefixes.has_key(name): del self.packages[name] ! def processModule(self, mod, outdir): self.write(' %s module' % mod.name) proxyClasses = [] mainProxy = None for name, pyc in mod.classes.items(): ! proxy = makeJavaProxy(mod, pyc.value) if proxy is None: continue --- 296,330 ---- if prefixes.has_key(name): del self.packages[name] + + def makeJavaProxy(self, module, pyc): + frame = pyc.frame + 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'): + if name == "__init__": + sig = getsig(v.doc, args, constructor=1) + else: + sig = getsig(v.doc, args, constructor=0) + methods.append( (name, args, sig) ) + if pyc.isSuperclassJava(): + supername, pySupername = pyc.supername, pyc.pySupername + if supername and supername[0] == ':': + supername = supername[1:] + if self.javapackage: supername = self.javapackage + '.' + supername + return proxies.JavaProxy(pyc.name, (supername, pySupername), + pyc.javaclasses, methods, module, pyc.issuperproxy) + return None ! def preprocessModule(self, mod): self.write(' %s module' % mod.name) proxyClasses = [] mainProxy = None for name, pyc in mod.classes.items(): ! proxy = self.makeJavaProxy(mod, pyc.value) if proxy is None: continue *************** *** 354,357 **** --- 358,362 ---- mod.specialClasses = specialClasses + def processModule(self,mod,outdir): self.javasources.append(mod.dump(outdir)) if self.options.bean is not None: *************** *** 385,390 **** for filename, mod in self.modules.items(): mod.modules = Compiler.allmodules ! self.processModule(mod, outdir) self.java2class(outdir) --- 390,400 ---- for filename, mod in self.modules.items(): mod.modules = Compiler.allmodules ! self.preprocessModule(mod) ! ! #self.write('\n...') + for filename, mod in self.modules.items(): + self.processModule(mod,outdir) + self.java2class(outdir) Index: proxies.py =================================================================== RCS file: /cvsroot/jython/jython/Tools/jythonc/proxies.py,v retrieving revision 2.11 retrieving revision 2.12 diff -C2 -r2.11 -r2.12 *** proxies.py 2001/05/07 19:21:21 2.11 --- proxies.py 2001/06/30 01:03:13 2.12 *************** *** 117,121 **** self.bases = bases self.name = name ! self.supername = supername self.methods = methods self.issuperproxy = 0 #issuperproxy --- 117,121 ---- self.bases = bases self.name = name ! self.supername, self.pySupername = supername self.methods = methods self.issuperproxy = 0 #issuperproxy *************** *** 144,147 **** --- 144,148 ---- self.jmethods = {} + self.jabstract = {} self.supermethods = {} for base in bases: *************** *** 161,164 **** --- 162,211 ---- self.innerClasses = [] + # gather info about methods, and methods requiring a super__foo counterpart + self.superproxy = self + self.myCandSupermethods = [] + self.candSupermethods = None + self.methodsMemo = [] + self.prepMethods() + + def __repr__(self): return "<JavaProxy %s.%s>" % (self.modname,self.name) + + def getSuperproxy(self): + if self.superproxy is not self: + return self.superproxy + supername = self.pySupername + if supername is None: return None + modules = self.module.modules + parts = supername.split('.') + modname = '.'.join(parts[0:-1]) + dmodname = parts[-2] + supername = parts[-1] + superproxy = None + if modules.has_key(modname): + mod = modules[modname] + if dmodname == supername: + superproxy = getattr(mod,'javaproxy',None) + else: + for px in getattr(mod,'innerClasses',[]): + if isinstance(px,JavaProxy) and px.name == supername: + superproxy = px + break + self.superproxy = superproxy + return superproxy + + def getCandSupermethods(self,incl): + if incl and self.candSupermethods is not None: + return self.candSupermethods + px = self.getSuperproxy() + if px is not None: + cands = px.getCandSupermethods(incl = 1)[:] + else: + cands = [] + if incl: + cands.extend(self.myCandSupermethods) + self.candSupermethods = cands + return cands + + def dumpAll(self): self.statements = [] *************** *** 174,181 **** self.statements.append(ic) ! def dumpMethods(self): names = self.jmethods.keys() names.sort() ! #print 'adding methods', self.name, names pymethods = {} for name, args, sigs in self.methods: --- 221,228 ---- self.statements.append(ic) ! def prepMethods(self): names = self.jmethods.keys() names.sort() ! #print 'preparing adding methods', self.name, names pymethods = {} for name, args, sigs in self.methods: *************** *** 189,193 **** #print sigs for access, ret, sig, throws in sigs: ! self.callMethod(name, access, ret, sig, throws, 0) if self.jmethods.has_key(name): x = filter(lambda c: isinstance(c, TupleType), sig) --- 236,240 ---- #print sigs for access, ret, sig, throws in sigs: ! dosuper = 0 if self.jmethods.has_key(name): x = filter(lambda c: isinstance(c, TupleType), sig) *************** *** 195,199 **** --- 242,252 ---- if self.jmethods[name].has_key(x): del self.jmethods[name][x] + if not self.jabstract[name][x]: + dosuper = 1 + self.myCandSupermethods.append(name) + self.methodsMemo.append(('n',name, access, ret, sig, throws, + dosuper)) + for name in names: for sig, (access, ret, throws) in self.jmethods[name].items(): *************** *** 204,222 **** access = access & ~FINAL access = access & ~PROTECTED | PUBLIC ! self.callSuperMethod(name, "super__" + name, ! access, ret, sig, throws) continue elif isFinal(access): continue ! if isAbstract(access): access = access & ~PROTECTED | PUBLIC ! self.callMethod(name, access, ret, sig, throws, 0) elif pymethods.has_key(name): access = access & ~PROTECTED | PUBLIC ! self.callMethod(name, access, ret, sig, throws, 1) elif isProtected(access): access = access & ~PROTECTED | PUBLIC ! self.callSuperMethod(name, name, access, ret, sig, throws) def dumpConstructors(self): --- 257,284 ---- access = access & ~FINAL access = access & ~PROTECTED | PUBLIC ! self.methodsMemo.append(('s',name, "super__" + name, ! access, ret, sig, throws)) continue elif isFinal(access): continue ! if self.jabstract[name][sig]: #isAbstract(access): access = access & ~PROTECTED | PUBLIC ! self.methodsMemo.append(('n',name, access, ret, sig, throws, ! 0)) elif pymethods.has_key(name): access = access & ~PROTECTED | PUBLIC ! self.methodsMemo.append(('n',name, access, ret, sig, throws, ! 1)) ! self.myCandSupermethods.append(name) elif isProtected(access): access = access & ~PROTECTED | PUBLIC ! self.methodsMemo.append(('s',name, name, ! access, ret, sig, throws)) ! ! def dumpMethods(self): # use info gathered by prepMethods ! dispatch = { 's': self.callSuperMethod, 'n': self.callMethod } ! for m in self.methodsMemo: ! apply(dispatch[m[0]],m[1:]) def dumpConstructors(self): *************** *** 234,240 **** --- 296,304 ---- if len(value) == 0: del self.jmethods[name] + del self.jabstract[name] def addMethods(self, c): #print 'adding', c.__name__, c.getDeclaredMethods() + for method in c.getDeclaredMethods(): #Check that it's not already included *************** *** 244,253 **** mdict = aget(self.jmethods, name, {}) if mdict.has_key(sig): continue - access = method.modifiers - if isPrivate(access) or isStatic(access): continue --- 308,319 ---- mdict = aget(self.jmethods, name, {}) + absdict = aget(self.jabstract, name, {}) + + access = method.modifiers if mdict.has_key(sig): + if not isAbstract(access): absdict[sig] = 0 continue if isPrivate(access) or isStatic(access): continue *************** *** 266,269 **** --- 332,336 ---- throws = method.exceptionTypes mdict[sig] = access, ret, throws + absdict[sig] = isAbstract(access) sc = c.getSuperclass() *************** *** 364,368 **** supermethod = None ! if not self.issuperproxy: supermethod = jast.Method("super__"+name, jast.Modifier.ModifierString(access), --- 431,435 ---- supermethod = None ! if not self.issuperproxy and name not in self.getCandSupermethods(incl=0): supermethod = jast.Method("super__"+name, jast.Modifier.ModifierString(access), |