javaclass

Change of tools/wrap.py

106:c2b3de28489c
tools/wrap.py
     1.1 --- a/tools/wrap.py	Mon Jan 10 23:39:28 2005 +0100
     1.2 +++ b/tools/wrap.py	Mon Jan 10 23:41:59 2005 +0100
     1.3 @@ -23,6 +23,7 @@
     1.4      directory, package = sys.argv[1:3]
     1.5      f = open(os.path.join(directory, "__init__.py"), "w")
     1.6      f.write("import %s\n" % package)
     1.7 +    f.write("import java.lang\n")
     1.8  
     1.9      # Process each class file.
    1.10  
    1.11 @@ -36,15 +37,45 @@
    1.12  
    1.13          full_name = c.this_class.get_python_name()
    1.14          class_name = full_name.split(".")[-1]
    1.15 -        f.write("class %s(%s.%s, object):\n" % (class_name, package, class_name))
    1.16 +        f.write("class %s(%s.%s, java.lang.Object):\n" % (class_name, package, class_name))
    1.17  
    1.18          # Process methods in the class, writing wrapper code.
    1.19  
    1.20          method_names = []
    1.21          for method in c.methods:
    1.22              wrapped_method_name = method.get_unqualified_python_name()
    1.23 -            f.write("    def %s(*args):\n" % wrapped_method_name)
    1.24 -            f.write("        return %s.%s.%s(*args)\n" % (package, class_name, wrapped_method_name))
    1.25 +
    1.26 +            # Find out more about the parameters, introducing special
    1.27 +            # conversions where appropriate.
    1.28 +
    1.29 +            parameters = [("self", None)]
    1.30 +            parameter_index = 1
    1.31 +            for parameter in method.get_descriptor()[0]:
    1.32 +                base_type, object_type, array_type = parameter
    1.33 +                if object_type == "java/lang/String":
    1.34 +                    parameters.append(("p" + str(parameter_index), "unicode"))
    1.35 +                else:
    1.36 +                    parameters.append(("p" + str(parameter_index), None))
    1.37 +                parameter_index += 1
    1.38 +
    1.39 +            # Write the signature.
    1.40 +
    1.41 +            parameter_names = ", ".join([t[0] for t in parameters])
    1.42 +            f.write("    def %s(%s):\n" % (wrapped_method_name, parameter_names))
    1.43 +
    1.44 +            # Write any conversions.
    1.45 +
    1.46 +            for parameter_name, conversion in parameters:
    1.47 +                if conversion:
    1.48 +                    f.write("        %s = %s(%s)\n" % (parameter_name, conversion, parameter_name))
    1.49 +
    1.50 +            # Write the call to the wrapped method.
    1.51 +
    1.52 +            f.write("        return %s.%s.%s(%s)\n" % (package, class_name, wrapped_method_name, parameter_names))
    1.53 +
    1.54 +            # Record the correspondence between the Java-accessible and wrapped
    1.55 +            # method names.
    1.56 +
    1.57              method_name = method.get_python_name()
    1.58              method_names.append((method_name, wrapped_method_name))
    1.59