From dbc55f256c1c08822b4caaf98f984eb1d3b12f0f Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Fri, 30 Dec 2005 08:54:56 +0000 Subject: [PATCH] add gcj and java->python initial support git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@8134 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- SWIG/CHANGES.current | 22 +- SWIG/Examples/python/check.list | 2 + SWIG/Examples/python/java/Example.java | 29 ++ SWIG/Examples/python/java/Makefile | 27 ++ SWIG/Examples/python/java/example.cxx | 0 SWIG/Examples/python/java/example.i | 11 + SWIG/Examples/python/java/runme.py | 16 + SWIG/Lib/gcj/cni.i | 43 +++ SWIG/Lib/gcj/cni.swg | 14 + SWIG/Lib/gcj/javaprims.i | 422 +++++++++++++++++++++++++ SWIG/Lib/python/cni.i | 1 + SWIG/Lib/python/jstring.i | 72 +++++ SWIG/Makefile.in | 2 +- 13 files changed, 659 insertions(+), 2 deletions(-) create mode 100644 SWIG/Examples/python/java/Example.java create mode 100644 SWIG/Examples/python/java/Makefile create mode 100644 SWIG/Examples/python/java/example.cxx create mode 100644 SWIG/Examples/python/java/example.i create mode 100644 SWIG/Examples/python/java/runme.py create mode 100644 SWIG/Lib/gcj/cni.i create mode 100644 SWIG/Lib/gcj/cni.swg create mode 100644 SWIG/Lib/gcj/javaprims.i create mode 100644 SWIG/Lib/python/cni.i create mode 100644 SWIG/Lib/python/jstring.i diff --git a/SWIG/CHANGES.current b/SWIG/CHANGES.current index 1bd0f65b0..1fbb58ddd 100644 --- a/SWIG/CHANGES.current +++ b/SWIG/CHANGES.current @@ -1,6 +1,26 @@ Version 1.3.28 (unreleased). =========================== +12/30/2005: mmatus + + - Add initial support for gcj and Java -> Python. See + + Examples/python/java + + to see how to use gcj and how to export java classes into + python. + + The idea is to put all the common code for gcj inside + + Lib/gcj + + such that it can be used from other languages. + + Python provide a simple jstring.i interface, which can be + used as a modelo to ruby,tcl and perl, ie, the languages + that use the UTL. + + 12/29/2005: mmatus - Add the copyctor feature/directive to enable the automatic @@ -80,7 +100,7 @@ Version 1.3.28 (unreleased). which always confuses people, since the first thing you do is just to write the 'in' typemap. - Well, the 'match' option solve the problem, and if you + Well, the 'match' option solves the problem, and if you write instead %typemap(in) SWIGTYPE * (int res) {..} diff --git a/SWIG/Examples/python/check.list b/SWIG/Examples/python/check.list index bc0303a04..0f969efd7 100644 --- a/SWIG/Examples/python/check.list +++ b/SWIG/Examples/python/check.list @@ -26,3 +26,5 @@ swigrun template varargs variables +java + diff --git a/SWIG/Examples/python/java/Example.java b/SWIG/Examples/python/java/Example.java new file mode 100644 index 000000000..91ddb1ac5 --- /dev/null +++ b/SWIG/Examples/python/java/Example.java @@ -0,0 +1,29 @@ +public class Example { + public int mPublicInt; + + public Example() { + mPublicInt = 0; + } + + public Example(int IntVal) { + mPublicInt = IntVal; + } + + + public int Add(int a, int b) { + return (a+b); + } + + public float Add(float a, float b) { + return (a+b); + } + + public String Add(String a, String b) { + return (a+b); + } + + public Example Add(Example a, Example b) { + return new Example(a.mPublicInt + b.mPublicInt); + } +} + diff --git a/SWIG/Examples/python/java/Makefile b/SWIG/Examples/python/java/Makefile new file mode 100644 index 000000000..6542a55b1 --- /dev/null +++ b/SWIG/Examples/python/java/Makefile @@ -0,0 +1,27 @@ +CXX = gcj +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = +TARGET = example +INTERFACE = example.i +LIBS = -lm + +all:: Example.class + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' CXX="gcj" CFLAGS="-fPIC" \ + CXXSHARED="gcj -fPIC -shared Example.class" DEFS='' python_cpp + + +clean:: + $(MAKE) -f $(TOP)/Makefile python_clean + rm -f $(TARGET).py + rm -f *.class Example.h + +check: all + + +Example.class: Example.java + gcj -v || exit 0 + gcj -fPIC -C -c -g Example.java + gcjh Example + diff --git a/SWIG/Examples/python/java/example.cxx b/SWIG/Examples/python/java/example.cxx new file mode 100644 index 000000000..e69de29bb diff --git a/SWIG/Examples/python/java/example.i b/SWIG/Examples/python/java/example.i new file mode 100644 index 000000000..eaf284a0a --- /dev/null +++ b/SWIG/Examples/python/java/example.i @@ -0,0 +1,11 @@ +%module example +%include + +%include + +%{ +#include "Example.h" +%} + + +%include Example.h diff --git a/SWIG/Examples/python/java/runme.py b/SWIG/Examples/python/java/runme.py new file mode 100644 index 000000000..0cec8a7cb --- /dev/null +++ b/SWIG/Examples/python/java/runme.py @@ -0,0 +1,16 @@ +from example import * + +JvCreateJavaVM(None) +JvAttachCurrentThread(None, None) + +e1 = Example(1) +e2 = Example(2) + +print e1.Add(1,2) +print e1.Add(1.0,2.0) +e3 = e1.Add(e1,e2) +print e3.mPublicInt + +print e1.Add("1","2") + +JvDetachCurrentThread() diff --git a/SWIG/Lib/gcj/cni.i b/SWIG/Lib/gcj/cni.i new file mode 100644 index 000000000..b12148e91 --- /dev/null +++ b/SWIG/Lib/gcj/cni.i @@ -0,0 +1,43 @@ +%{ +#include +%} + +%include + +extern jobject JvAllocObject (jclass cls); + +extern jobject JvAllocObject (jclass cls, jsize sz); + +extern void JvInitClass (jclass cls); + +extern jstring JvAllocString (jsize sz); + +extern jstring JvNewString (const jchar *chars, jsize len); + +extern jstring JvNewStringLatin1 (const char *bytes, jsize len); + +extern jstring JvNewStringLatin1 (const char *bytes); + +extern jchar* JvGetStringChars (jstring str); + +extern jsize JvGetStringUTFLength (jstring string); + +extern jsize JvGetStringUTFRegion (jstring str, jsize start, jsize len, char *buf); + +extern jstring JvNewStringUTF (const char *bytes); + +extern void *JvMalloc (jsize size); + +extern void JvFree (void *ptr); + +extern jint JvCreateJavaVM (void* vm_args); + +extern java::lang::Thread* JvAttachCurrentThread (jstring name, java::lang::ThreadGroup* group); + +extern java::lang::Thread* JvAttachCurrentThreadAsDaemon (jstring name, java::lang::ThreadGroup* group); + +extern jint JvDetachCurrentThread (void); + + +%include + diff --git a/SWIG/Lib/gcj/cni.swg b/SWIG/Lib/gcj/cni.swg new file mode 100644 index 000000000..68f329e23 --- /dev/null +++ b/SWIG/Lib/gcj/cni.swg @@ -0,0 +1,14 @@ +/* + Swig especial +*/ + +#ifdef SWIG + +#define __attribute__(...) +%ignore class$; +#pragma SWIG nowarn=313,402 + +%nodefaultdtor; + +#endif + diff --git a/SWIG/Lib/gcj/javaprims.i b/SWIG/Lib/gcj/javaprims.i new file mode 100644 index 000000000..12c92a793 --- /dev/null +++ b/SWIG/Lib/gcj/javaprims.i @@ -0,0 +1,422 @@ +%include + +typedef int8_t jbyte; +typedef int16_t jshort; +typedef int32_t jint; +typedef int64_t jlong; +typedef float jfloat; +typedef double jdouble; +typedef jint jsize; +typedef int8_t jboolean; + +extern "Java" +{ + namespace java + { + namespace io + { + class BufferedInputStream; + class BufferedOutputStream; + class BufferedReader; + class BufferedWriter; + class ByteArrayInputStream; + class ByteArrayOutputStream; + class CharArrayReader; + class CharArrayWriter; + class CharConversionException; + class DataInput; + class DataInputStream; + class DataOutput; + class DataOutputStream; + class EOFException; + class Externalizable; + class File; + class FileDescriptor; + class FileFilter; + class FileInputStream; + class FileNotFoundException; + class FileOutputStream; + class FilePermission; + class FileReader; + class FileWriter; + class FilenameFilter; + class FilterInputStream; + class FilterOutputStream; + class FilterReader; + class FilterWriter; + class IOException; + class InputStream; + class InputStreamReader; + class InterfaceComparator; + class InterruptedIOException; + class InvalidClassException; + class InvalidObjectException; + class LineNumberInputStream; + class LineNumberReader; + class MemberComparator; + class NotActiveException; + class NotSerializableException; + class ObjectInput; + class ObjectInputStream; + class ObjectInputStream$GetField; + class ObjectInputValidation; + class ObjectOutput; + class ObjectOutputStream; + class ObjectOutputStream$PutField; + class ObjectStreamClass; + class ObjectStreamConstants; + class ObjectStreamException; + class ObjectStreamField; + class OptionalDataException; + class OutputStream; + class OutputStreamWriter; + class PipedInputStream; + class PipedOutputStream; + class PipedReader; + class PipedWriter; + class PrintStream; + class PrintWriter; + class PushbackInputStream; + class PushbackReader; + class RandomAccessFile; + class Reader; + class SequenceInputStream; + class Serializable; + class SerializablePermission; + class StreamCorruptedException; + class StreamTokenizer; + class StringBufferInputStream; + class StringReader; + class StringWriter; + class SyncFailedException; + class UTFDataFormatException; + class UnsupportedEncodingException; + class VMObjectStreamClass; + class ValidatorAndPriority; + class WriteAbortedException; + class Writer; + } + + namespace lang + { + class AbstractMethodError; + class ArithmeticException; + class ArrayIndexOutOfBoundsException; + class ArrayStoreException; + class AssertionError; + class Boolean; + class Byte; + class CharSequence; + class Character; + class Character$Subset; + class Character$UnicodeBlock; + class Class; + class ClassCastException; + class ClassCircularityError; + class ClassFormatError; + class ClassLoader; + class ClassNotFoundException; + class CloneNotSupportedException; + class Cloneable; + class Comparable; + class Compiler; + class ConcreteProcess; + class Double; + class Error; + class Exception; + class ExceptionInInitializerError; + class Float; + class IllegalAccessError; + class IllegalAccessException; + class IllegalArgumentException; + class IllegalMonitorStateException; + class IllegalStateException; + class IllegalThreadStateException; + class IncompatibleClassChangeError; + class IndexOutOfBoundsException; + class InheritableThreadLocal; + class InstantiationError; + class InstantiationException; + class Integer; + class InternalError; + class InterruptedException; + class LinkageError; + class Long; + class Math; + class NegativeArraySizeException; + class NoClassDefFoundError; + class NoSuchFieldError; + class NoSuchFieldException; + class NoSuchMethodError; + class NoSuchMethodException; + class NullPointerException; + class Number; + class NumberFormatException; + class Object; + class OutOfMemoryError; + class Package; + class Process; + class Runnable; + class Runtime; + class RuntimeException; + class RuntimePermission; + class SecurityContext; + class SecurityException; + class SecurityManager; + class Short; + class StackOverflowError; + class StackTraceElement; + class StrictMath; + class String; + class String$CaseInsensitiveComparator; + class StringBuffer; + class StringIndexOutOfBoundsException; + class System; + class Thread; + class ThreadDeath; + class ThreadGroup; + class ThreadLocal; + class Throwable; + class UnknownError; + class UnsatisfiedLinkError; + class UnsupportedClassVersionError; + class UnsupportedOperationException; + class VMClassLoader; + class VMSecurityManager; + class VMThrowable; + class VerifyError; + class VirtualMachineError; + class Void; + namespace ref + { + class PhantomReference; + class Reference; + class ReferenceQueue; + class SoftReference; + class WeakReference; + } + + namespace reflect + { + class AccessibleObject; + class Array; + class Constructor; + class Field; + class InvocationHandler; + class InvocationTargetException; + class Member; + class Method; + class Modifier; + class Proxy; + class Proxy$ClassFactory; + class Proxy$ProxyData; + class Proxy$ProxySignature; + class Proxy$ProxyType; + class ReflectPermission; + class UndeclaredThrowableException; + } + } + + namespace util + { + class AbstractCollection; + class AbstractList; + class AbstractMap; + class AbstractMap$BasicMapEntry; + class AbstractSequentialList; + class AbstractSet; + class ArrayList; + class Arrays; + class Arrays$ArrayList; + class BitSet; + class Calendar; + class Collection; + class Collections; + class Collections$CopiesList; + class Collections$EmptyList; + class Collections$EmptyMap; + class Collections$EmptySet; + class Collections$ReverseComparator; + class Collections$SingletonList; + class Collections$SingletonMap; + class Collections$SingletonSet; + class Collections$SynchronizedCollection; + class Collections$SynchronizedIterator; + class Collections$SynchronizedList; + class Collections$SynchronizedListIterator; + class Collections$SynchronizedMap; + class Collections$SynchronizedMapEntry; + class Collections$SynchronizedRandomAccessList; + class Collections$SynchronizedSet; + class Collections$SynchronizedSortedMap; + class Collections$SynchronizedSortedSet; + class Collections$UnmodifiableCollection; + class Collections$UnmodifiableEntrySet; + class Collections$UnmodifiableIterator; + class Collections$UnmodifiableList; + class Collections$UnmodifiableListIterator; + class Collections$UnmodifiableMap; + class Collections$UnmodifiableRandomAccessList; + class Collections$UnmodifiableSet; + class Collections$UnmodifiableSortedMap; + class Collections$UnmodifiableSortedSet; + class Comparator; + class ConcurrentModificationException; + class Currency; + class Date; + class Dictionary; + class EmptyStackException; + class Enumeration; + class EventListener; + class EventListenerProxy; + class EventObject; + class GregorianCalendar; + class HashMap; + class HashMap$HashEntry; + class HashMap$HashIterator; + class HashSet; + class Hashtable; + class Hashtable$Enumerator; + class Hashtable$HashEntry; + class Hashtable$HashIterator; + class IdentityHashMap; + class IdentityHashMap$IdentityEntry; + class IdentityHashMap$IdentityIterator; + class Iterator; + class LinkedHashMap; + class LinkedHashMap$LinkedHashEntry; + class LinkedHashSet; + class LinkedList; + class LinkedList$Entry; + class LinkedList$LinkedListItr; + class List; + class ListIterator; + class ListResourceBundle; + class Locale; + class Map; + class Map$Entry; + class Map$Map; + class MissingResourceException; + class MyResources; + class NoSuchElementException; + class Observable; + class Observer; + class Properties; + class PropertyPermission; + class PropertyPermissionCollection; + class PropertyResourceBundle; + class Random; + class RandomAccess; + class RandomAccessSubList; + class ResourceBundle; + class Set; + class SimpleTimeZone; + class SortedMap; + class SortedSet; + class Stack; + class StringTokenizer; + class SubList; + class TimeZone; + class Timer; + class Timer$Scheduler; + class Timer$TaskQueue; + class TimerTask; + class TooManyListenersException; + class TreeMap; + class TreeMap$Node; + class TreeMap$SubMap; + class TreeMap$TreeIterator; + class TreeSet; + class Vector; + class WeakHashMap; + class WeakHashMap$WeakBucket; + class WeakHashMap$WeakEntry; + class WeakHashMap$WeakEntrySet; + namespace jar + { + class Attributes; + class Attributes$Name; + class JarEntry; + class JarException; + class JarFile; + class JarFile$JarEnumeration; + class JarInputStream; + class JarOutputStream; + class Manifest; + } + + namespace logging + { + class ConsoleHandler; + class ErrorManager; + class FileHandler; + class Filter; + class Formatter; + class Handler; + class Level; + class LogManager; + class LogRecord; + class Logger; + class LoggingPermission; + class MemoryHandler; + class SimpleFormatter; + class SocketHandler; + class StreamHandler; + class XMLFormatter; + } + + namespace prefs + { + class AbstractPreferences; + class BackingStoreException; + class InvalidPreferencesFormatException; + class NodeChangeEvent; + class NodeChangeListener; + class PreferenceChangeEvent; + class PreferenceChangeListener; + class Preferences; + class PreferencesFactory; + } + + namespace regex + { + class Matcher; + class Pattern; + class PatternSyntaxException; + } + + namespace zip + { + class Adler32; + class CRC32; + class CheckedInputStream; + class CheckedOutputStream; + class Checksum; + class DataFormatException; + class Deflater; + class DeflaterOutputStream; + class GZIPInputStream; + class GZIPOutputStream; + class Inflater; + class InflaterInputStream; + class ZipConstants; + class ZipEntry; + class ZipException; + class ZipFile; + class ZipFile$PartialInputStream; + class ZipFile$ZipEntryEnumeration; + class ZipInputStream; + class ZipOutputStream; + } + } + } +} + +typedef class java::lang::Object* jobject; +typedef class java::lang::Class* jclass; +typedef class java::lang::Throwable* jthrowable; +typedef class java::lang::String* jstring; + + +%include + diff --git a/SWIG/Lib/python/cni.i b/SWIG/Lib/python/cni.i new file mode 100644 index 000000000..0dbef9a98 --- /dev/null +++ b/SWIG/Lib/python/cni.i @@ -0,0 +1 @@ +%include diff --git a/SWIG/Lib/python/jstring.i b/SWIG/Lib/python/jstring.i new file mode 100644 index 000000000..02358483b --- /dev/null +++ b/SWIG/Lib/python/jstring.i @@ -0,0 +1,72 @@ +%include + +%fragment(SWIG_AsVal_frag(jstring),"header") { +SWIGINTERN int +SWIG_AsVal(jstring)(PyObject *obj, jstring *val) +{ + if (obj == Py_None) { + if (val) *val = 0; + return SWIG_OK; + } + + PyObject *tmp = 0; + int isunicode = PyUnicode_Check(obj); + if (!isunicode && PyString_Check(obj)) { + if (val) { + obj = tmp = PyUnicode_FromObject(obj); + } + isunicode = 1; + } + if (isunicode) { + if (val) { + if (sizeof(Py_UNICODE) == sizeof(jchar)) { + *val = JvNewString((const jchar *) PyUnicode_AS_UNICODE(obj),PyUnicode_GET_SIZE(obj)); + return SWIG_NEWOBJ; + } else { + int len = PyUnicode_GET_SIZE(obj); + Py_UNICODE *pchars = PyUnicode_AS_UNICODE(obj); + *val = JvAllocString (len); + jchar *jchars = JvGetStringChars (*val); + for (int i = 0; i < len; ++i) { + jchars[i] = pchars[i]; + } + return SWIG_NEWOBJ; + } + } + Py_XDECREF(tmp); + return SWIG_OK; + } + return SWIG_TypeError; +} +} + +%fragment(SWIG_From_frag(jstring),"header") { +SWIGINTERNINLINE PyObject * +SWIG_From(jstring)(jstring js) +{ + if (!js) { + return SWIG_Py_Void(); + } + if (sizeof(Py_UNICODE) == sizeof(jchar)) { + return PyUnicode_FromUnicode((const Py_UNICODE *) JvGetStringChars(js), + js->length()); + } else { + int len = js->length(); + Py_UNICODE pchars[len]; + jchar *jchars = JvGetStringChars(js); + + for (int i = 0; i < len; i++) { + pchars[i] = jchars[i]; + } + return PyUnicode_FromUnicode((const Py_UNICODE *) pchars, len); + } +} +} + +%typemaps_asvalfrom(%checkcode(STRING), + %arg(SWIG_AsVal(jstring)), + %arg(SWIG_From(jstring)), + %arg(SWIG_AsVal_frag(jstring)), + %arg(SWIG_From_frag(jstring)), + java::lang::String *); + diff --git a/SWIG/Makefile.in b/SWIG/Makefile.in index 121aeb2f8..294409465 100644 --- a/SWIG/Makefile.in +++ b/SWIG/Makefile.in @@ -328,7 +328,7 @@ install-main: @echo "Installing $(BIN_DIR)/$(TARGET)" @$(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(BIN_DIR)/$(TARGET) -lib-languages = typemaps tcl perl5 python guile java mzscheme ruby php4 ocaml \ +lib-languages = gcj typemaps tcl perl5 python guile java mzscheme ruby php4 ocaml \ pike chicken csharp modula3 allegrocl clisp lua cffi lib-modules = std