javaclass

Changeset

177:9523263f1ec1
2005-02-21 Paul Boddie raw files shortlog changelog graph Attempted to add more sophisticated circular import handling.
javaclass/bytecode.py (file)
     1.1 --- a/javaclass/bytecode.py	Mon Feb 21 00:17:48 2005 +0100
     1.2 +++ b/javaclass/bytecode.py	Mon Feb 21 00:17:51 2005 +0100
     1.3 @@ -2298,14 +2298,13 @@
     1.4  
     1.5              self.namespace[method_name] = fn
     1.6  
     1.7 -        # Add the super class as an external name, if appropriate.
     1.8 -
     1.9 -        if self.class_file.super_class is not None:
    1.10 -            external_names.append(self.class_file.super_class.get_python_name())
    1.11 +        # Add the base classes as external names, if appropriate.
    1.12 +
    1.13 +        external_names += [class_.get_python_name() for class_ in self.get_base_class_references()]
    1.14  
    1.15          return external_names
    1.16  
    1.17 -    def get_class(self, global_names):
    1.18 +    def get_class(self, global_names, classes):
    1.19  
    1.20          """
    1.21          Get the Python class representing the underlying Java class, using the
    1.22 @@ -2314,7 +2313,7 @@
    1.23  
    1.24          # Define superclasses.
    1.25  
    1.26 -        bases = self.get_base_classes(global_names)
    1.27 +        bases = self.get_base_classes(classes)
    1.28  
    1.29          # Define method dispatchers.
    1.30  
    1.31 @@ -2338,33 +2337,27 @@
    1.32          class_names += self.class_file.interfaces
    1.33          return class_names
    1.34  
    1.35 -    def get_base_classes(self, global_names):
    1.36 +    def get_base_classes(self, classes):
    1.37  
    1.38          """
    1.39 -        Identify the superclass, then either load it from the given
    1.40 -        'global_names' if available, or import the class from its parent module.
    1.41 -        Return a tuple containing all base classes (typically a single element
    1.42 -        tuple).
    1.43 +        Identify the superclass, obtaining it from the given 'classes'
    1.44 +        dictionary. Return a tuple containing all base classes (usually a single
    1.45 +        element tuple).
    1.46          """
    1.47  
    1.48          base_classes = []
    1.49  
    1.50          for class_ in self.get_base_class_references():
    1.51 -            base_classes.append(self._get_class(class_, global_names))
    1.52 +            base_classes.append(self._get_class(class_, classes))
    1.53  
    1.54          return tuple(base_classes)
    1.55  
    1.56 -    def _get_class(self, class_, global_names):
    1.57 -        class_name = class_.get_python_name()
    1.58 -        class_name_parts = class_name.split(".")
    1.59 -        obj = global_names
    1.60 -        for class_name_part in class_name_parts[:-1]:
    1.61 -            try:
    1.62 -                obj = obj[class_name_part].__dict__
    1.63 -            except KeyError:
    1.64 -                raise AttributeError, "Cannot find '%s' when referencing Java class '%s'" % (
    1.65 -                    class_name_part, class_name)
    1.66 -        return obj[class_name_parts[-1]]
    1.67 +    def _get_class(self, class_, classes):
    1.68 +        class_name = str(class_.get_name())
    1.69 +        try:
    1.70 +            return classes[class_name]
    1.71 +        except KeyError:
    1.72 +            raise AttributeError, "Cannot find Java class '%s'" % class_name
    1.73  
    1.74      def make_varnames(self, nlocals, method_is_static=0):
    1.75