Skip to content
Snippets Groups Projects
Commit 1c952773 authored by Michi Hostettler's avatar Michi Hostettler :coffee:
Browse files

Merge branch 'avoid-crash-on-class-loading' into 'master'

avoid crash of stub generation if an inner class throws on java class loading

See merge request !4
parents 28f36834 bcadbeb5
No related branches found
No related tags found
1 merge request!4avoid crash of stub generation if an inner class throws on java class loading
Pipeline #3175512 passed
......@@ -210,6 +210,7 @@ def generateStubsForJavaPackage(package: jpype.JPackage, outputFile: str, subpac
classesDone = set() # type: Set[str]
classesUsed = set() # type: Set[str]
classesFailed = set() # type: Set[str]
customizersUsed = set() # type: Set[Type]
while javaClasses:
javaClassesToGenerate = [c for c in javaClasses if dependenciesSatisfied(package, c, classesDone)]
......@@ -221,6 +222,7 @@ def generateStubsForJavaPackage(package: jpype.JPackage, outputFile: str, subpac
output=classOutput, importsOutput=importOutput)
except jpype.JException as e: # exception during class loading e.g. missing dependencies (spark...)
log.warning(f'Skipping {cls} due to {e}')
classesFailed.add(simpleClassNameOf(cls))
javaClasses.remove(cls)
# Collect all classes in this java package which are referenced by other class stubs, but have not yet been
# generated. To avoid unsatisfied type references in the stubs, we have to generate stubs for them:
......@@ -229,7 +231,12 @@ def generateStubsForJavaPackage(package: jpype.JPackage, outputFile: str, subpac
# - failing that, we generate an empty stub.
missingPrivateClasses = filterClassNamesInPackage(pkgName, classesUsed) - classesDone
for missingPrivateClass in sorted(missingPrivateClasses):
cls = getattr(package, missingPrivateClass, None)
cls = None
try:
if missingPrivateClass not in classesFailed:
cls = getattr(package, missingPrivateClass, None)
except jpype.JException as e: # exception during class loading e.g. missing dependencies (spark...)
log.warning(f'Skipping missing class {missingPrivateClass} due to {e}')
if cls is not None:
if cls not in javaClasses:
......@@ -256,7 +263,6 @@ def generateStubsForJavaPackage(package: jpype.JPackage, outputFile: str, subpac
log.warning(f'reference to missing class {missingPrivateClass} - generating empty stub')
classOutput.append('')
generateEmptyClassStub(missingPrivateClass, classesDone=classesDone, output=classOutput)
generateModuleProtocol(
pkgName,
sorted([className for className in classesDone if '$' not in className]),
......@@ -310,6 +316,10 @@ def generateModuleProtocol(
classOutput.extend(protocolOutput)
def simpleClassNameOf(jClass: jpype.JClass) -> str:
return str(jClass.class_.getName()).split('.')[-1]
def isJavaClass(obj: type) -> bool:
""" Check if a type is a 'real' Java class. This excludes synthetic/anonymous Java classes.
......@@ -1008,7 +1018,7 @@ def generateJavaClassStub(package: jpype.JPackage,
for line in nestedClassesOutput:
output.append(f' {line}')
classesDone |= classesDoneNested
classesDone.add(str(jClass.class_.getName()).split('.')[-1])
classesDone.add(simpleClassNameOf(jClass))
def generateEmptyClassStub(className: str, classesDone: Set[str], output: List[str]):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment