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),
|