ExternalLibraryFunction.st
changeset 14625 290463096ff5
parent 14516 359e4d2234af
child 14632 6fe0dc1d5377
--- a/ExternalLibraryFunction.st	Wed Jan 02 13:35:40 2013 +0100
+++ b/ExternalLibraryFunction.st	Wed Jan 02 13:45:06 2013 +0100
@@ -44,7 +44,7 @@
 extern ffi_type *__get_ffi_type_pointer();
 
 #else
-#error "HAVE_FFI not defined!"
+# error "HAVE_FFI not defined!"
 #endif
 
 %}
@@ -71,50 +71,50 @@
     instances of me are used to interface to external library functions (as found in a dll/shared object).
 
     Inside a method, when a special external-call pragma such as:
-        <api: bool MessageBeep(uint)>
+	<api: bool MessageBeep(uint)>
 
     is encountered by the parser, the compiler generates a call via
-        <correspondingExternalLibraryFunctionObject> invokeWithArguments: argumentArray.
+	<correspondingExternalLibraryFunctionObject> invokeWithArguments: argumentArray.
 
     In the invoke method, the library is checked to be loaded (and loaded if not already),
     the arguments are converted to C and pushed onto the C-stack, the function is called,
     and finally, the return value is converted back from C to a smalltalk object.
 
     The parser supports the call-syntax of various other smalltalk dialects:
-        Squeak / ST-X:
-            <cdecl:   [async] [virtual|nonVirtual][const] returnType functionNameStringOrIndex ( argType1..argTypeN ) module: moduleName > 
-            <apicall: [async] [virtual|nonVirtual][const] returnType functionNameStringOrIndex ( argType1..argTypeN ) module: moduleName >
+	Squeak / ST-X:
+	    <cdecl:   [async] [virtual|nonVirtual][const] returnType functionNameStringOrIndex ( argType1..argTypeN ) module: moduleName >
+	    <apicall: [async] [virtual|nonVirtual][const] returnType functionNameStringOrIndex ( argType1..argTypeN ) module: moduleName >
 
-        Dolphin:
-            <stdcall: [virtual|nonVirtual][const] returnType functionNameStringOrIndex argType1..argTypeN>
-            <cdecl:   [virtual|nonVirtual][const] returnType functionNameStringOrIndex argType1..argTypeN> 
+	Dolphin:
+	    <stdcall: [virtual|nonVirtual][const] returnType functionNameStringOrIndex argType1..argTypeN>
+	    <cdecl:   [virtual|nonVirtual][const] returnType functionNameStringOrIndex argType1..argTypeN>
 
-        ST/V:
-            <api: functionName argType1 .. argTypeN returnType> 
-            <ccall: functionName argType1 .. argTypeN returnType> 
-            <ole: vFunctionIndex argType1 .. argTypeN returnType>
+	ST/V:
+	    <api: functionName argType1 .. argTypeN returnType>
+	    <ccall: functionName argType1 .. argTypeN returnType>
+	    <ole: vFunctionIndex argType1 .. argTypeN returnType>
 
-        VisualWorks:
-            <c: ...>
-            <c: #define NAME value>
+	VisualWorks:
+	    <c: ...>
+	    <c: #define NAME value>
 "
 !
 
 example
 "
-                                                                [exBegin]
-        |f|
+								[exBegin]
+	|f|
 
-        f := ExternalLibraryFunction new.
-        f beCallTypeWINAPI.
+	f := ExternalLibraryFunction new.
+	f beCallTypeWINAPI.
 
-        f name:'MessageBeep'
-          module:'user32.dll'
-          returnType:#boolean
-          argumentTypes:#(uint).
+	f name:'MessageBeep'
+	  module:'user32.dll'
+	  returnType:#boolean
+	  argumentTypes:#(uint).
 
-        f invokeWith:1.
-                                                                [exEnd]
+	f invokeWith:1.
+								[exEnd]
 
   Synchronous vs. Asynchronous calls:
 
@@ -122,41 +122,41 @@
     (that is by purpose,ībecause most C-code is not prepared for being interrupted, and also, normal
      code is not prepared for a garbage collector to move objects around, while another C thread might
      access the data...).
-    Therefore, the following will block all ST/X activity for 10 seconds 
+    Therefore, the following will block all ST/X activity for 10 seconds
     (try interacting with the launcher while the Sleep is performing):
 
-                                                                [exBegin]
-        |f|
+								[exBegin]
+	|f|
 
-        f := ExternalLibraryFunction new.
-        f beCallTypeWINAPI.
+	f := ExternalLibraryFunction new.
+	f beCallTypeWINAPI.
 
-        f name:'Sleep'
-          module:'kernel32.dll'
-          returnType:#void
-          argumentTypes:#(uint).
+	f name:'Sleep'
+	  module:'kernel32.dll'
+	  returnType:#void
+	  argumentTypes:#(uint).
 
-        f invokeWith:10000.
-                                                                [exEnd]
+	f invokeWith:10000.
+								[exEnd]
 
     if you know what you do and you do not pass any possibly moving objects (such as strings) as argument,
     the call can be made asynchronous. In that case, ONLY the calling thread will be blocked; all other smalltalk
     threads wil continue to execute.
     (try interacting now with the launcher while the Sleep is performing):
-                                                                [exBegin]
-        |f|
+								[exBegin]
+	|f|
 
-        f := ExternalLibraryFunction new.
-        f beCallTypeWINAPI.
-        f beAsync.
+	f := ExternalLibraryFunction new.
+	f beCallTypeWINAPI.
+	f beAsync.
 
-        f name:'Sleep'
-          module:'kernel32.dll'
-          returnType:#void
-          argumentTypes:#(uint).
+	f name:'Sleep'
+	  module:'kernel32.dll'
+	  returnType:#void
+	  argumentTypes:#(uint).
 
-        f invokeWith:10000.
-                                                                [exEnd]
+	f invokeWith:10000.
+								[exEnd]
 
 "
 ! !
@@ -187,15 +187,15 @@
 dllMapping
     "allows for dll's to be replaced,
      for example, if you want to use the mozilla sqlite dll
-        C:\Program Files\Mozilla Firefox\mozsqlite3.dll
+	C:\Program Files\Mozilla Firefox\mozsqlite3.dll
      for the sqlite3, execute:
-        ExternalLibraryFunction 
-            dllMapping at:'sqlite3'
-            put: 'C:\Program Files\Mozilla Firefox\mozsqlite3.dll'
+	ExternalLibraryFunction
+	    dllMapping at:'sqlite3'
+	    put: 'C:\Program Files\Mozilla Firefox\mozsqlite3.dll'
     "
 
     DllMapping isNil ifTrue:[
-        DllMapping := Dictionary new.
+	DllMapping := Dictionary new.
     ].
     ^ DllMapping
 
@@ -214,20 +214,20 @@
     "using inline access to corresponding c--defines to avoid duplicate places of knowledge"
 
     DLLPATH isNil ifTrue:[
-        DLLPATH := #('.').
-        FLAG_VIRTUAL := %{ __MKSMALLINT(__EXTL_FLAG_VIRTUAL) %}.                "/ a virtual c++ call
-        FLAG_NONVIRTUAL := %{ __MKSMALLINT(__EXTL_FLAG_NONVIRTUAL) %}.          "/ a non-virtual c++ call
-        FLAG_UNLIMITEDSTACK := %{ __MKSMALLINT(__EXTL_FLAG_UNLIMITEDSTACK) %}.  "/ unlimitedstack under unix
-        FLAG_ASYNC := %{ __MKSMALLINT(__EXTL_FLAG_ASYNC) %}.                    "/ async under win32
-        FLAG_RETVAL_IS_CONST := %{ __MKSMALLINT(__EXTL_FLAG_RETVAL_IS_CONST) %}."/ return value is not to be registered for finalization
+	DLLPATH := #('.').
+	FLAG_VIRTUAL := %{ __MKSMALLINT(__EXTL_FLAG_VIRTUAL) %}.                "/ a virtual c++ call
+	FLAG_NONVIRTUAL := %{ __MKSMALLINT(__EXTL_FLAG_NONVIRTUAL) %}.          "/ a non-virtual c++ call
+	FLAG_UNLIMITEDSTACK := %{ __MKSMALLINT(__EXTL_FLAG_UNLIMITEDSTACK) %}.  "/ unlimitedstack under unix
+	FLAG_ASYNC := %{ __MKSMALLINT(__EXTL_FLAG_ASYNC) %}.                    "/ async under win32
+	FLAG_RETVAL_IS_CONST := %{ __MKSMALLINT(__EXTL_FLAG_RETVAL_IS_CONST) %}."/ return value is not to be registered for finalization
 
-        CALLTYPE_API := %{ __MKSMALLINT(__EXTL_CALLTYPE_API) %}.                "/ WINAPI-call (win32 only)
-        CALLTYPE_C := %{ __MKSMALLINT(__EXTL_CALLTYPE_C) %}.                    "/ regular C-call (the default)
-        CALLTYPE_V8 := %{ __MKSMALLINT(__EXTL_CALLTYPE_V8) %}.                  "/ v8 call (sparc only)
-        CALLTYPE_V9 := %{ __MKSMALLINT(__EXTL_CALLTYPE_V9) %}.                  "/ v9 call (sparc only)
-        CALLTYPE_UNIX64 := %{ __MKSMALLINT(__EXTL_CALLTYPE_UNIX64) %}.          "/ unix64 call (alpha only)
+	CALLTYPE_API := %{ __MKSMALLINT(__EXTL_CALLTYPE_API) %}.                "/ WINAPI-call (win32 only)
+	CALLTYPE_C := %{ __MKSMALLINT(__EXTL_CALLTYPE_C) %}.                    "/ regular C-call (the default)
+	CALLTYPE_V8 := %{ __MKSMALLINT(__EXTL_CALLTYPE_V8) %}.                  "/ v8 call (sparc only)
+	CALLTYPE_V9 := %{ __MKSMALLINT(__EXTL_CALLTYPE_V9) %}.                  "/ v9 call (sparc only)
+	CALLTYPE_UNIX64 := %{ __MKSMALLINT(__EXTL_CALLTYPE_UNIX64) %}.          "/ unix64 call (alpha only)
 
-        CALLTYPE_MASK := %{ __MKSMALLINT(__EXTL_CALLTYPE_MASK) %}.
+	CALLTYPE_MASK := %{ __MKSMALLINT(__EXTL_CALLTYPE_MASK) %}.
     ].
 
     "
@@ -570,23 +570,23 @@
 printOn:aStream
     aStream nextPutAll:'<'.
     self isCallTypeAPI ifTrue:[
-        'API:' printOn:aStream.
+	'API:' printOn:aStream.
     ] ifFalse:[
-        self isCallTypeOLE ifTrue:[
-            'OLE:' printOn:aStream.
-        ] ifFalse:[
-            self isCallTypeC ifTrue:[
-                'C:' printOn:aStream.
-            ] ifFalse:[
-                self error.
-            ].
-        ].
+	self isCallTypeOLE ifTrue:[
+	    'OLE:' printOn:aStream.
+	] ifFalse:[
+	    self isCallTypeC ifTrue:[
+		'C:' printOn:aStream.
+	    ] ifFalse:[
+		self error.
+	    ].
+	].
     ].
     aStream nextPutAll:' '.
     name printOn:aStream.
     moduleName notNil ifTrue:[
-        aStream nextPutAll:' module:'.
-        moduleName printOn:aStream.
+	aStream nextPutAll:' module:'.
+	moduleName printOn:aStream.
     ].
     aStream nextPutAll:'>'.
 
@@ -609,37 +609,37 @@
     |handle moduleNameUsed functionName|
 
     name isNumber ifTrue:[
-        self isCPPFunction ifTrue:[
-            "/ no need to load a dll.
-            ^ self
-        ]
+	self isCPPFunction ifTrue:[
+	    "/ no need to load a dll.
+	    ^ self
+	]
     ].
 
     "/ in some other smalltalks, there is no moduleName in the ffi-spec;
     "/ instead, the class provides the libraryName...
     (moduleNameUsed := moduleName) isNil ifTrue:[
-        owningClass isNil ifTrue:[
-            self error:'Missing moduleName'.
-        ].
-        moduleNameUsed := owningClass theNonMetaclass libraryName asSymbol.
+	owningClass isNil ifTrue:[
+	    self error:'Missing moduleName'.
+	].
+	moduleNameUsed := owningClass theNonMetaclass libraryName asSymbol.
     ].
     moduleHandle isNil ifTrue:[
-        handle := self loadLibrary:moduleNameUsed.
-        handle isNil ifTrue:[
-            self error:('Cannot find or load dll/module: "%1"' bindWith: moduleNameUsed).
-        ].
-        moduleHandle := handle.
+	handle := self loadLibrary:moduleNameUsed.
+	handle isNil ifTrue:[
+	    self error:('Cannot find or load dll/module: "%1"' bindWith: moduleNameUsed).
+	].
+	moduleHandle := handle.
     ].
     name isNumber ifFalse:[
-        functionName := name.
-        (moduleHandle getFunctionAddress:functionName into:self) isNil ifTrue:[
-            functionName := ('_', functionName) asSymbol.
+	functionName := name.
+	(moduleHandle getFunctionAddress:functionName into:self) isNil ifTrue:[
+	    functionName := ('_', functionName) asSymbol.
 
-            (moduleHandle getFunctionAddress:functionName into:self) isNil ifTrue:[
-                moduleHandle := nil.
-                self error:'Missing function: ', name, ' in module: ', moduleNameUsed.
-            ].
-        ].
+	    (moduleHandle getFunctionAddress:functionName into:self) isNil ifTrue:[
+		moduleHandle := nil.
+		self error:'Missing function: ', name, ' in module: ', moduleNameUsed.
+	    ].
+	].
     ].
 
     "Modified: / 10-04-2012 / 12:12:44 / cg"
@@ -650,7 +650,7 @@
 
     filename := dllName.
     DllMapping notNil ifTrue:[
-        filename := DllMapping at:filename ifAbsent:[ filename ]
+	filename := DllMapping at:filename ifAbsent:[ filename ]
     ].
 
     filename := filename asFilename.
@@ -661,25 +661,25 @@
     handle notNil ifTrue:[^ handle ].
 
     filename isAbsolute ifFalse:[
-        "First ask the class defining the ExternalFunction for the location of the dlls ..."
-        owningClass notNil ifTrue:[
-            owningClass dllPath do:[:eachDirectory |
-                handle := ObjectFileLoader
-                            loadDynamicObject:(eachDirectory asFilename construct:nameString) pathName.
-                handle notNil ifTrue:[^ handle ].
-            ].
-        ].
-        ".. then ask the system"
-        self class dllPath do:[:eachDirectory |
-            handle := ObjectFileLoader
-                        loadDynamicObject:(eachDirectory asFilename construct:nameString) pathName.
-            handle notNil ifTrue:[^ handle ].
-        ].
+	"First ask the class defining the ExternalFunction for the location of the dlls ..."
+	owningClass notNil ifTrue:[
+	    owningClass dllPath do:[:eachDirectory |
+		handle := ObjectFileLoader
+			    loadDynamicObject:(eachDirectory asFilename construct:nameString) pathName.
+		handle notNil ifTrue:[^ handle ].
+	    ].
+	].
+	".. then ask the system"
+	self class dllPath do:[:eachDirectory |
+	    handle := ObjectFileLoader
+			loadDynamicObject:(eachDirectory asFilename construct:nameString) pathName.
+	    handle notNil ifTrue:[^ handle ].
+	].
     ].
 
     filename suffix isEmpty ifTrue:[
-        "/ try again with the OS-specific dll-extension
-        ^ self loadLibrary:(filename withSuffix:ObjectFileLoader sharedLibrarySuffix)
+	"/ try again with the OS-specific dll-extension
+	^ self loadLibrary:(filename withSuffix:ObjectFileLoader sharedLibrarySuffix)
     ].
 
     ^ nil
@@ -698,9 +698,9 @@
 
 ffiTypeSymbolForType:aType
     "map type to one of the ffi-supported ones:
-        sint8, sint16, sint32, sint64
-        uint8, uint16, uint32, uint64
-        bool void pointer handle
+	sint8, sint16, sint32, sint64
+	uint8, uint16, uint32, uint64
+	bool void pointer handle
     "
 
     aType == #sint8           ifTrue:[^ aType ].
@@ -760,17 +760,17 @@
     aType == #unsigned        ifTrue:[^ #uint ].
 
     (aType isString or:[aType isSymbol]) ifFalse:[
-        CType isNil ifTrue:[
-            self error:'unknown type'.
-        ].
-        ^ aType typeSymbol.
+	CType isNil ifTrue:[
+	    self error:'unknown type'.
+	].
+	^ aType typeSymbol.
     ].
 
     (aType endsWith:'*') ifTrue:[
-        ^ #pointer.
+	^ #pointer.
     ].
     (aType endsWith:'Pointer') ifTrue:[
-        ^ #pointer.
+	^ #pointer.
     ].
     ^ aType
 
@@ -835,26 +835,26 @@
 
     virtual := self isVirtualCPP.
     (virtual "or:[self isNonVirtualCPP]") ifTrue:[
-        aCPlusPlusObjectOrNil isNil ifTrue:[
-            "/ must have a c++ object instance
-            self primitiveFailed.
-        ].
+	aCPlusPlusObjectOrNil isNil ifTrue:[
+	    "/ must have a c++ object instance
+	    self primitiveFailed.
+	].
 
-        "/ and it must be a kind of ExternalStructure !!
-        (aCPlusPlusObjectOrNil isKindOf:ExternalStructure) ifFalse:[
-            self primitiveFailed.
-        ].
-        virtual ifTrue:[
-            vtOffset := name.
-            (vtOffset between:0 and:10000) ifFalse:[
-                self primitiveFailed.
-            ]
-        ].
+	"/ and it must be a kind of ExternalStructure !!
+	(aCPlusPlusObjectOrNil isKindOf:ExternalStructure) ifFalse:[
+	    self primitiveFailed.
+	].
+	virtual ifTrue:[
+	    vtOffset := name.
+	    (vtOffset between:0 and:10000) ifFalse:[
+		self primitiveFailed.
+	    ]
+	].
     ] ifFalse:[
-        aCPlusPlusObjectOrNil notNil ifTrue:[
-            "/ must NOT have a c++ object instance
-            self primitiveFailed.
-        ].
+	aCPlusPlusObjectOrNil notNil ifTrue:[
+	    "/ must NOT have a c++ object instance
+	    self primitiveFailed.
+	].
     ].
     async := self isAsync.
     unlimitedStack := self isUnlimitedStack.
@@ -876,17 +876,17 @@
     ffi_type *__returnType = NULL;
 
     union u {
-        int iVal;
-        float fVal;
-        double dVal;
-        void *pointerVal;
+	int iVal;
+	float fVal;
+	double dVal;
+	void *pointerVal;
 # if defined(HAS_LONGLONG)
-        long long longLongVal;
+	long long longLongVal;
 # else
 #  ifdef HAS_INT64
-        __int64__ longLongVal;
+	__int64__ longLongVal;
 #  else
-        struct ll { long low; long hi; } longLongVal;
+	struct ll { long low; long hi; } longLongVal;
 #  endif
 # endif
     };
@@ -905,29 +905,29 @@
 
 #   define __FAIL__(fcode) \
     { \
-        failureCode = fcode; goto getOutOfHere; \
+	failureCode = fcode; goto getOutOfHere; \
     }
 
     if (argumentsOrNil == nil) {
-        __numArgs = 0;
+	__numArgs = 0;
     } else if (__isArray(argumentsOrNil)) {
-        __numArgs = __arraySize(argumentsOrNil);
+	__numArgs = __arraySize(argumentsOrNil);
     } else {
-        __FAIL__(@symbol(BadArgumentVector))
+	__FAIL__(@symbol(BadArgumentVector))
     }
     if (argTypeSymbols == nil) {
-        __numArgsWanted = 0;
+	__numArgsWanted = 0;
     } else if (__isArray(argTypeSymbols)) {
-        __numArgsWanted = __arraySize(argTypeSymbols);
+	__numArgsWanted = __arraySize(argTypeSymbols);
     } else {
-        __FAIL__(@symbol(BadArgumentTypeVector))
+	__FAIL__(@symbol(BadArgumentTypeVector))
     }
 
     if (__numArgs != __numArgsWanted) {
-        __FAIL__(@symbol(ArgumentCountMismatch))
+	__FAIL__(@symbol(ArgumentCountMismatch))
     }
     if (__numArgs > MAX_ARGS) {
-        __FAIL__(@symbol(TooManyArguments))
+	__FAIL__(@symbol(TooManyArguments))
     }
 
     /*
@@ -936,130 +936,130 @@
     __returnValuePointer = &__returnValue;
 
     if (returnTypeSymbol == @symbol(voidPointer)) {
-        returnTypeSymbol = @symbol(handle);
+	returnTypeSymbol = @symbol(handle);
     }
 
     if (returnTypeSymbol == @symbol(int)) {
-        __returnType = __get_ffi_type_sint();
+	__returnType = __get_ffi_type_sint();
     } else if (returnTypeSymbol == @symbol(uint)) {
-        __returnType = __get_ffi_type_uint();
+	__returnType = __get_ffi_type_uint();
     } else if (returnTypeSymbol == @symbol(uint8)) {
-        __returnType = __get_ffi_type_uint8();
+	__returnType = __get_ffi_type_uint8();
     } else if (returnTypeSymbol == @symbol(uint16)) {
-        __returnType = __get_ffi_type_uint16();
+	__returnType = __get_ffi_type_uint16();
     } else if (returnTypeSymbol == @symbol(uint32)) {
-        __returnType = __get_ffi_type_uint32();
+	__returnType = __get_ffi_type_uint32();
     } else if (returnTypeSymbol == @symbol(uint64)) {
-        __returnType = __get_ffi_type_uint64();
+	__returnType = __get_ffi_type_uint64();
 
     } else if (returnTypeSymbol == @symbol(sint)) {
-        __returnType = __get_ffi_type_sint();
+	__returnType = __get_ffi_type_sint();
     } else if (returnTypeSymbol == @symbol(sint8)) {
-        __returnType = __get_ffi_type_sint8();
+	__returnType = __get_ffi_type_sint8();
     } else if (returnTypeSymbol == @symbol(sint16)) {
-        __returnType = __get_ffi_type_sint16();
+	__returnType = __get_ffi_type_sint16();
     } else if (returnTypeSymbol == @symbol(sint32)) {
-        __returnType = __get_ffi_type_sint32();
+	__returnType = __get_ffi_type_sint32();
     } else if (returnTypeSymbol == @symbol(sint64)) {
-        __returnType = __get_ffi_type_sint64();
+	__returnType = __get_ffi_type_sint64();
 
     } else if (returnTypeSymbol == @symbol(long)) {
-        if (sizeof(long) == 4) {
-           returnTypeSymbol = @symbol(sint32);
-           __returnType = __get_ffi_type_sint32();
-        } else if (sizeof(long) == 8) {
-           returnTypeSymbol = @symbol(sint64);
-           __returnType = __get_ffi_type_sint64();
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (sizeof(long) == 4) {
+	   returnTypeSymbol = @symbol(sint32);
+	   __returnType = __get_ffi_type_sint32();
+	} else if (sizeof(long) == 8) {
+	   returnTypeSymbol = @symbol(sint64);
+	   __returnType = __get_ffi_type_sint64();
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
 
     } else if (returnTypeSymbol == @symbol(ulong)) {
-        if (sizeof(long) == 4) {
-           returnTypeSymbol = @symbol(uint32);
-           __returnType = __get_ffi_type_uint32();
-        }else if (sizeof(long) == 8) {
-           returnTypeSymbol = @symbol(uint64);
-           __returnType = __get_ffi_type_uint64();
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (sizeof(long) == 4) {
+	   returnTypeSymbol = @symbol(uint32);
+	   __returnType = __get_ffi_type_uint32();
+	}else if (sizeof(long) == 8) {
+	   returnTypeSymbol = @symbol(uint64);
+	   __returnType = __get_ffi_type_uint64();
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
 
     } else if (returnTypeSymbol == @symbol(bool)) {
-        __returnType = __get_ffi_type_uint();
+	__returnType = __get_ffi_type_uint();
 
     } else if (returnTypeSymbol == @symbol(float)) {
-        __returnType = __get_ffi_type_float();
+	__returnType = __get_ffi_type_float();
     } else if (returnTypeSymbol == @symbol(double)) {
-        __returnType = __get_ffi_type_double();
+	__returnType = __get_ffi_type_double();
 
     } else if (returnTypeSymbol == @symbol(void)) {
-        __returnType = __get_ffi_type_void();
-        __returnValuePointer = NULL;
+	__returnType = __get_ffi_type_void();
+	__returnValuePointer = NULL;
     } else if ((returnTypeSymbol == @symbol(pointer))
-               || (returnTypeSymbol == @symbol(handle))
-               || (returnTypeSymbol == @symbol(charPointer))
-               || (returnTypeSymbol == @symbol(bytePointer))
-               || (returnTypeSymbol == @symbol(floatPointer))
-               || (returnTypeSymbol == @symbol(doublePointer))
-               || (returnTypeSymbol == @symbol(intPointer))
-               || (returnTypeSymbol == @symbol(shortPointer))
-               || (returnTypeSymbol == @symbol(wcharPointer))) {
-        __returnType = __get_ffi_type_pointer();
+	       || (returnTypeSymbol == @symbol(handle))
+	       || (returnTypeSymbol == @symbol(charPointer))
+	       || (returnTypeSymbol == @symbol(bytePointer))
+	       || (returnTypeSymbol == @symbol(floatPointer))
+	       || (returnTypeSymbol == @symbol(doublePointer))
+	       || (returnTypeSymbol == @symbol(intPointer))
+	       || (returnTypeSymbol == @symbol(shortPointer))
+	       || (returnTypeSymbol == @symbol(wcharPointer))) {
+	__returnType = __get_ffi_type_pointer();
     } else {
-        if (__isSymbol(returnTypeSymbol)
-         && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
-            if (! __isBehaviorLike(returnValueClass)) {
-                __FAIL__(@symbol(NonBehaviorReturnType))
-            }
-            if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
-                __FAIL__(@symbol(NonExternalAddressReturnType))
-            }
-            __returnType = __get_ffi_type_pointer();
-            returnTypeSymbol = @symbol(pointer);
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (__isSymbol(returnTypeSymbol)
+	 && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
+	    if (! __isBehaviorLike(returnValueClass)) {
+		__FAIL__(@symbol(NonBehaviorReturnType))
+	    }
+	    if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
+		__FAIL__(@symbol(NonExternalAddressReturnType))
+	    }
+	    __returnType = __get_ffi_type_pointer();
+	    returnTypeSymbol = @symbol(pointer);
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
     }
 
     /*
      * validate the c++ object
      */
     if (aCPlusPlusObjectOrNil != nil) {
-        struct cPlusPlusInstance {
-            void **vTable;
-        };
-        struct cPlusPlusInstance *inst;
+	struct cPlusPlusInstance {
+	    void **vTable;
+	};
+	struct cPlusPlusInstance *inst;
 
-        if (__isExternalAddressLike(aCPlusPlusObjectOrNil)) {
-            inst = (void *)(__externalAddressVal(aCPlusPlusObjectOrNil));
-        } else if (__isExternalBytesLike(aCPlusPlusObjectOrNil)) {
-            inst = (void *)(__externalBytesVal(aCPlusPlusObjectOrNil));
-        } else {
-            __FAIL__(@symbol(InvalidInstance))
-        }
-        __argValues[0].pointerVal = inst;
-        __argValuePointersIncludingThis[0] = &(__argValues[0]);
-        __argTypes[0] = __get_ffi_type_pointer();
+	if (__isExternalAddressLike(aCPlusPlusObjectOrNil)) {
+	    inst = (void *)(__externalAddressVal(aCPlusPlusObjectOrNil));
+	} else if (__isExternalBytesLike(aCPlusPlusObjectOrNil)) {
+	    inst = (void *)(__externalBytesVal(aCPlusPlusObjectOrNil));
+	} else {
+	    __FAIL__(@symbol(InvalidInstance))
+	}
+	__argValues[0].pointerVal = inst;
+	__argValuePointersIncludingThis[0] = &(__argValues[0]);
+	__argTypes[0] = __get_ffi_type_pointer();
 
-        __argValuePointers = &__argValuePointersIncludingThis[1];
-        __argTypes = &__argTypesIncludingThis[1];
-        __argValues = &__argValuesIncludingThis[1];
-        __numArgsIncludingThis = __numArgs + 1;
+	__argValuePointers = &__argValuePointersIncludingThis[1];
+	__argTypes = &__argTypesIncludingThis[1];
+	__argValues = &__argValuesIncludingThis[1];
+	__numArgsIncludingThis = __numArgs + 1;
 
-        if (virtual == true) {
-            if (! __isSmallInteger(vtOffset)) {
-                __FAIL__(@symbol(InvalidVTableIndex))
-            }
-            codeAddress = inst->vTable[__intVal(vtOffset)];
+	if (virtual == true) {
+	    if (! __isSmallInteger(vtOffset)) {
+		__FAIL__(@symbol(InvalidVTableIndex))
+	    }
+	    codeAddress = inst->vTable[__intVal(vtOffset)];
 # ifdef VERBOSE
-            printf("virtual codeAddress: %x\n", codeAddress);
+	    printf("virtual codeAddress: %x\n", codeAddress);
 # endif
-        }
+	}
     } else {
-        __numArgsIncludingThis = __numArgs;
+	__numArgsIncludingThis = __numArgs;
 # ifdef VERBOSE
-        printf("codeAddress: %x\n", codeAddress);
+	printf("codeAddress: %x\n", codeAddress);
 # endif
     }
 
@@ -1067,339 +1067,339 @@
      * validate all arg types and setup arg-buffers
      */
     for (i=0; i<__numArgs; i++) {
-        ffi_type *thisType;
-        void *argValuePtr;
-        OBJ typeSymbol;
-        OBJ arg;
+	ffi_type *thisType;
+	void *argValuePtr;
+	OBJ typeSymbol;
+	OBJ arg;
 
-        failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
+	failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
 
-        typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
-        arg = __ArrayInstPtr(argumentsOrNil)->a_element[i];
+	typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
+	arg = __ArrayInstPtr(argumentsOrNil)->a_element[i];
 
-        if (typeSymbol == @symbol(handle)) {
-            typeSymbol = @symbol(pointer);
-        } else if (typeSymbol == @symbol(voidPointer)) {
-            typeSymbol = @symbol(pointer);
-        }
+	if (typeSymbol == @symbol(handle)) {
+	    typeSymbol = @symbol(pointer);
+	} else if (typeSymbol == @symbol(voidPointer)) {
+	    typeSymbol = @symbol(pointer);
+	}
 
-        if (typeSymbol == @symbol(long)) {
-            if (sizeof(long) == sizeof(int)) {
-                typeSymbol = @symbol(sint);
-            } else {
-                if (sizeof(long) == 4) {
-                    typeSymbol = @symbol(sint32);
-                } else if (sizeof(long) == 8) {
-                    typeSymbol = @symbol(sint64);
-                }
-            }
-        }
-        if (typeSymbol == @symbol(ulong)) {
-            if (sizeof(unsigned long) == sizeof(unsigned int)) {
-                typeSymbol = @symbol(uint);
-            } else {
-                if (sizeof(long) == 4) {
-                    typeSymbol = @symbol(uint32);
-                } else if (sizeof(long) == 8) {
-                    typeSymbol = @symbol(uint64);
-                }
-            }
-        }
+	if (typeSymbol == @symbol(long)) {
+	    if (sizeof(long) == sizeof(int)) {
+		typeSymbol = @symbol(sint);
+	    } else {
+		if (sizeof(long) == 4) {
+		    typeSymbol = @symbol(sint32);
+		} else if (sizeof(long) == 8) {
+		    typeSymbol = @symbol(sint64);
+		}
+	    }
+	}
+	if (typeSymbol == @symbol(ulong)) {
+	    if (sizeof(unsigned long) == sizeof(unsigned int)) {
+		typeSymbol = @symbol(uint);
+	    } else {
+		if (sizeof(long) == 4) {
+		    typeSymbol = @symbol(uint32);
+		} else if (sizeof(long) == 8) {
+		    typeSymbol = @symbol(uint64);
+		}
+	    }
+	}
 
-        if (typeSymbol == @symbol(int) || typeSymbol == @symbol(sint)) {
-            thisType = __get_ffi_type_sint();
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __signedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
+	if (typeSymbol == @symbol(int) || typeSymbol == @symbol(sint)) {
+	    thisType = __get_ffi_type_sint();
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __signedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
 
-        } else if (typeSymbol == @symbol(uint)) {
-            thisType = __get_ffi_type_uint();
+	} else if (typeSymbol == @symbol(uint)) {
+	    thisType = __get_ffi_type_uint();
 
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
 
-        } else if (typeSymbol == @symbol(uint8)) {
-            thisType = __get_ffi_type_uint8();
-            if (! __isSmallInteger(arg)) {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((unsigned)(__argValues[i].iVal)) > 0xFF) {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
+	} else if (typeSymbol == @symbol(uint8)) {
+	    thisType = __get_ffi_type_uint8();
+	    if (! __isSmallInteger(arg)) {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((unsigned)(__argValues[i].iVal)) > 0xFF) {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
 
-        } else if (typeSymbol == @symbol(sint8)) {
-            thisType = __get_ffi_type_sint8();
-            if (! __isSmallInteger(arg)) {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((__argValues[i].iVal) < -0x80) || ((__argValues[i].iVal) > 0x7F))  {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
+	} else if (typeSymbol == @symbol(sint8)) {
+	    thisType = __get_ffi_type_sint8();
+	    if (! __isSmallInteger(arg)) {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((__argValues[i].iVal) < -0x80) || ((__argValues[i].iVal) > 0x7F))  {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
 
-        } else if (typeSymbol == @symbol(uint16)) {
-            thisType = __get_ffi_type_uint16();
-            if (! __isSmallInteger(arg)) {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((unsigned)(__argValues[i].iVal)) > 0xFFFF) {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
+	} else if (typeSymbol == @symbol(uint16)) {
+	    thisType = __get_ffi_type_uint16();
+	    if (! __isSmallInteger(arg)) {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((unsigned)(__argValues[i].iVal)) > 0xFFFF) {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
 
-        } else if (typeSymbol == @symbol(sint16)) {
-            thisType = __get_ffi_type_sint16();
-            if (! __isSmallInteger(arg)) {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((__argValues[i].iVal) < -0x8000) || ((__argValues[i].iVal) > 0x7FFF))  {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
+	} else if (typeSymbol == @symbol(sint16)) {
+	    thisType = __get_ffi_type_sint16();
+	    if (! __isSmallInteger(arg)) {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((__argValues[i].iVal) < -0x8000) || ((__argValues[i].iVal) > 0x7FFF))  {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
 
-        } else if ((typeSymbol == @symbol(uint32)) || (typeSymbol == @symbol(sint32))) {
-            thisType = __get_ffi_type_uint32();
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
+	} else if ((typeSymbol == @symbol(uint32)) || (typeSymbol == @symbol(sint32))) {
+	    thisType = __get_ffi_type_uint32();
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
 
-        } else if (typeSymbol == @symbol(float)) {
-            thisType = __get_ffi_type_float();
-            if (__isSmallInteger(arg)) {
-                __argValues[i].fVal = (float)(__intVal(arg));
-            } else if (__isFloat(arg)) {
-                __argValues[i].fVal = (float)(__floatVal(arg));
-            } else if (__isShortFloat(arg)) {
-                __argValues[i].fVal = (float)(__shortFloatVal(arg));
-            } else {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].fVal);
+	} else if (typeSymbol == @symbol(float)) {
+	    thisType = __get_ffi_type_float();
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].fVal = (float)(__intVal(arg));
+	    } else if (__isFloat(arg)) {
+		__argValues[i].fVal = (float)(__floatVal(arg));
+	    } else if (__isShortFloat(arg)) {
+		__argValues[i].fVal = (float)(__shortFloatVal(arg));
+	    } else {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].fVal);
 
-        } else if (typeSymbol == @symbol(double)) {
-            thisType = __get_ffi_type_double();
-            if (__isSmallInteger(arg)) {
-                __argValues[i].dVal = (double)(__intVal(arg));
-            } else if (__isFloat(arg)) {
-                __argValues[i].dVal = (double)(__floatVal(arg));
-            } else if (__isShortFloat(arg)) {
-                __argValues[i].dVal = (double)(__shortFloatVal(arg));
-            } else {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].dVal);
+	} else if (typeSymbol == @symbol(double)) {
+	    thisType = __get_ffi_type_double();
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].dVal = (double)(__intVal(arg));
+	    } else if (__isFloat(arg)) {
+		__argValues[i].dVal = (double)(__floatVal(arg));
+	    } else if (__isShortFloat(arg)) {
+		__argValues[i].dVal = (double)(__shortFloatVal(arg));
+	    } else {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].dVal);
 
-        } else if (typeSymbol == @symbol(void)) {
-            thisType = __get_ffi_type_void();
-            argValuePtr = &null;
+	} else if (typeSymbol == @symbol(void)) {
+	    thisType = __get_ffi_type_void();
+	    argValuePtr = &null;
 
-        } else if (typeSymbol == @symbol(charPointer)) {
-            thisType = __get_ffi_type_pointer();
-            if (__isStringLike(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__stringVal(arg));
-            } else if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
+	} else if (typeSymbol == @symbol(charPointer)) {
+	    thisType = __get_ffi_type_pointer();
+	    if (__isStringLike(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__stringVal(arg));
+	    } else if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
 
-        } else if (typeSymbol == @symbol(wcharPointer)) {
-            thisType = __get_ffi_type_pointer();
-            if (__isUnicode16String(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__unicode16StringVal(arg));
-            } else if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
+	} else if (typeSymbol == @symbol(wcharPointer)) {
+	    thisType = __get_ffi_type_pointer();
+	    if (__isUnicode16String(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__unicode16StringVal(arg));
+	    } else if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
 
-        } else if (typeSymbol == @symbol(floatPointer)) {
-            thisType = __get_ffi_type_pointer();
-            if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isFloats(arg)) {
-                char *p = (char *)(__FloatArrayInstPtr(arg)->f_element);
-                int nInstBytes;
-                OBJ cls;
+	} else if (typeSymbol == @symbol(floatPointer)) {
+	    thisType = __get_ffi_type_pointer();
+	    if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isFloats(arg)) {
+		char *p = (char *)(__FloatArrayInstPtr(arg)->f_element);
+		int nInstBytes;
+		OBJ cls;
 
-                if (async == true) goto badArgForAsyncCall;
-                cls = __qClass(arg);
-                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-                p = p + nInstBytes;
-                __argValues[i].pointerVal = p;
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
+		if (async == true) goto badArgForAsyncCall;
+		cls = __qClass(arg);
+		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+		p = p + nInstBytes;
+		__argValues[i].pointerVal = p;
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
 
-        } else if (typeSymbol == @symbol(doublePointer)) {
-            thisType = __get_ffi_type_pointer();
-            if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isDoubles(arg)) {
-                char *p = (char *)(__DoubleArrayInstPtr(arg)->d_element);
-                int nInstBytes;
-                OBJ cls;
+	} else if (typeSymbol == @symbol(doublePointer)) {
+	    thisType = __get_ffi_type_pointer();
+	    if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isDoubles(arg)) {
+		char *p = (char *)(__DoubleArrayInstPtr(arg)->d_element);
+		int nInstBytes;
+		OBJ cls;
 
-                if (async == true) goto badArgForAsyncCall;
-                cls = __qClass(arg);
-                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-                p = p + nInstBytes;
+		if (async == true) goto badArgForAsyncCall;
+		cls = __qClass(arg);
+		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+		p = p + nInstBytes;
 # ifdef __NEED_DOUBLE_ALIGN
-                if ((INT)pFirst & (__DOUBLE_ALIGN-1)) {
-                    int delta = __DOUBLE_ALIGN - ((INT)p & (__DOUBLE_ALIGN-1));
+		if ((INT)(__DoubleArrayInstPtr(arg)->d_element) & (__DOUBLE_ALIGN-1)) {
+		    int delta = __DOUBLE_ALIGN - ((INT)p & (__DOUBLE_ALIGN-1));
 
-                    p += delta;
-                }
+		    p += delta;
+		}
 # endif
-                __argValues[i].pointerVal = p;
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
+		__argValues[i].pointerVal = p;
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
 
-        } else if (typeSymbol == @symbol(pointer)) {
+	} else if (typeSymbol == @symbol(pointer)) {
 commonPointerTypeArg: ;
-            thisType = __get_ffi_type_pointer();
-            if (arg == nil) {
-                __argValues[i].pointerVal = NULL;
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isByteArrayLike(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isWordArray(arg) || __isSignedWordArray(arg)
-                    || __isIntegerArray(arg) || __isSignedIntegerArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__integerArrayVal(arg));
-            } else if (__isFloatArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__FloatArrayInstPtr(arg)->f_element);
-            } else if (__isDoubleArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__DoubleArrayInstPtr(arg)->d_element);
-            } else if (__isStringLike(arg)) {
-                if (async == true) {
+	    thisType = __get_ffi_type_pointer();
+	    if (arg == nil) {
+		__argValues[i].pointerVal = NULL;
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isByteArrayLike(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isWordArray(arg) || __isSignedWordArray(arg)
+		    || __isIntegerArray(arg) || __isSignedIntegerArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__integerArrayVal(arg));
+	    } else if (__isFloatArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__FloatArrayInstPtr(arg)->f_element);
+	    } else if (__isDoubleArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__DoubleArrayInstPtr(arg)->d_element);
+	    } else if (__isStringLike(arg)) {
+		if (async == true) {
 badArgForAsyncCall: ;
-                    __FAIL__(@symbol(BadArgForAsyncCall))
-                }
-                __argValues[i].pointerVal = (void *)(__stringVal(arg));
-            } else if (__isBytes(arg) || __isWords(arg) || __isLongs(arg)) {
-                char *p = (char *)(__byteArrayVal(arg));
-                int nInstBytes;
-                OBJ cls;
+		    __FAIL__(@symbol(BadArgForAsyncCall))
+		}
+		__argValues[i].pointerVal = (void *)(__stringVal(arg));
+	    } else if (__isBytes(arg) || __isWords(arg) || __isLongs(arg)) {
+		char *p = (char *)(__byteArrayVal(arg));
+		int nInstBytes;
+		OBJ cls;
 
-                if (async == true) goto badArgForAsyncCall;
-                cls = __qClass(arg);
-                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-                __argValues[i].pointerVal = p + nInstBytes;
-            } else {
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
+		if (async == true) goto badArgForAsyncCall;
+		cls = __qClass(arg);
+		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+		__argValues[i].pointerVal = p + nInstBytes;
+	    } else {
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
 
-        } else if (typeSymbol == @symbol(bool)) {
-            thisType = __get_ffi_type_uint();
+	} else if (typeSymbol == @symbol(bool)) {
+	    thisType = __get_ffi_type_uint();
 
-            if (arg == true) {
-                __argValues[i].iVal = 1;
-            } else if (arg == false) {
-                __argValues[i].iVal = 0;
-            } else if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-        } else {
-            if (__isSymbol(typeSymbol)
-             && ((argValueClass = __GLOBAL_GET(typeSymbol)) != nil)) {
-                if (! __isBehaviorLike(argValueClass)) {
-                    __FAIL__(@symbol(NonBehaviorArgumentType))
-                }
-                if (! __qIsSubclassOfExternalAddress(argValueClass)) {
-                    __FAIL__(@symbol(NonExternalAddressArgumentType))
-                }
-                goto commonPointerTypeArg; /* sorry */
-            } else {
-                __FAIL__(@symbol(UnknownArgumentType))
-            }
-        }
+	    if (arg == true) {
+		__argValues[i].iVal = 1;
+	    } else if (arg == false) {
+		__argValues[i].iVal = 0;
+	    } else if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+	} else {
+	    if (__isSymbol(typeSymbol)
+	     && ((argValueClass = __GLOBAL_GET(typeSymbol)) != nil)) {
+		if (! __isBehaviorLike(argValueClass)) {
+		    __FAIL__(@symbol(NonBehaviorArgumentType))
+		}
+		if (! __qIsSubclassOfExternalAddress(argValueClass)) {
+		    __FAIL__(@symbol(NonExternalAddressArgumentType))
+		}
+		goto commonPointerTypeArg; /* sorry */
+	    } else {
+		__FAIL__(@symbol(UnknownArgumentType))
+	    }
+	}
 
-        __argTypes[i] = thisType;
-        __argValuePointers[i] = argValuePtr;
+	__argTypes[i] = thisType;
+	__argValuePointers[i] = argValuePtr;
 
 # ifdef VERBOSE
-        printf("arg%d: %x\n", i, __argValues[i].iVal);
+	printf("arg%d: %x\n", i, __argValues[i].iVal);
 # endif
     }
     failureInfo = nil;
@@ -1408,53 +1408,53 @@
 
 # ifdef CALLTYPE_FFI_STDCALL
     if (callTypeNumber == @global(CALLTYPE_API)) {
-        __callType = CALLTYPE_FFI_STDCALL;
+	__callType = CALLTYPE_FFI_STDCALL;
     }
 # endif
 # ifdef CALLTYPE_FFI_V8
     if (callTypeNumber == @global(CALLTYPE_V8)) {
-        __callType = CALLTYPE_FFI_V8;
+	__callType = CALLTYPE_FFI_V8;
     }
 # endif
 # ifdef CALLTYPE_FFI_V9
     if (callTypeNumber == @global(CALLTYPE_V9)) {
-        __callType = CALLTYPE_FFI_V9;
+	__callType = CALLTYPE_FFI_V9;
     }
 # endif
 # ifdef CALLTYPE_FFI_UNIX64
     if (callTypeNumber == @global(CALLTYPE_UNIX64)) {
-        __callType = CALLTYPE_FFI_UNIX64;
+	__callType = CALLTYPE_FFI_UNIX64;
     }
 # endif
 
     if (ffi_prep_cif(&__cif, __callType, __numArgsIncludingThis, __returnType, __argTypesIncludingThis) != FFI_OK) {
-        __FAIL__(@symbol(FFIPrepareFailed))
+	__FAIL__(@symbol(FFIPrepareFailed))
     }
     if (async == true) {
 # ifdef VERBOSE
-        printf("async call 0x%x\n", codeAddress);
+	printf("async call 0x%x\n", codeAddress);
 # endif
 # ifdef WIN32
-        __STX_C_CALL4( "ffi_call", ffi_call, &__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	__STX_C_CALL4( "ffi_call", ffi_call, &__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
 # else
-        __BEGIN_INTERRUPTABLE__
-        ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
-        __END_INTERRUPTABLE__
+	__BEGIN_INTERRUPTABLE__
+	ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	__END_INTERRUPTABLE__
 # endif
     } else {
-        if (unlimitedStack == true) {
+	if (unlimitedStack == true) {
 # ifdef VERBOSE
-            printf("UNLIMITEDSTACKCALL call 0x%x\n", codeAddress);
+	    printf("UNLIMITEDSTACKCALL call 0x%x\n", codeAddress);
 # endif
 # if 0
-            __UNLIMITEDSTACKCALL__(ffi_call, &__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	    __UNLIMITEDSTACKCALL__(ffi_call, &__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
 # endif
-        } else {
+	} else {
 # ifdef VERBOSE
-            printf("call 0x%x\n", codeAddress);
+	    printf("call 0x%x\n", codeAddress);
 # endif
-            ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
-        }
+	    ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	}
     }
 # ifdef VERBOSE
     printf("retval is %d (0x%x)\n", __returnValue.iVal, __returnValue.iVal);
@@ -1464,54 +1464,54 @@
      || (returnTypeSymbol == @symbol(sint8))
      || (returnTypeSymbol == @symbol(sint16))
      || (returnTypeSymbol == @symbol(sint32))) {
-        RETURN ( __MKINT(__returnValue.iVal) );
+	RETURN ( __MKINT(__returnValue.iVal) );
     }
     if ((returnTypeSymbol == @symbol(uint))
      || (returnTypeSymbol == @symbol(uint8))
      || (returnTypeSymbol == @symbol(uint16))
      || (returnTypeSymbol == @symbol(uint32))) {
-        RETURN ( __MKUINT(__returnValue.iVal) );
+	RETURN ( __MKUINT(__returnValue.iVal) );
     }
     if (returnTypeSymbol == @symbol(bool)) {
-        RETURN ( __returnValue.iVal ? true : false );
+	RETURN ( __returnValue.iVal ? true : false );
     }
     if (returnTypeSymbol == @symbol(float)) {
-        RETURN ( __MKFLOAT(__returnValue.fVal ));
+	RETURN ( __MKFLOAT(__returnValue.fVal ));
     }
     if (returnTypeSymbol == @symbol(double)) {
-        RETURN ( __MKFLOAT(__returnValue.dVal ));
+	RETURN ( __MKFLOAT(__returnValue.dVal ));
     }
     if (returnTypeSymbol == @symbol(void)) {
-        RETURN ( nil );
+	RETURN ( nil );
     }
     if (returnTypeSymbol == @symbol(char)) {
-        RETURN ( __MKCHARACTER(__returnValue.iVal & 0xFF) );
+	RETURN ( __MKCHARACTER(__returnValue.iVal & 0xFF) );
     }
     if (returnTypeSymbol == @symbol(wchar)) {
-        RETURN ( __MKUCHARACTER(__returnValue.iVal & 0xFFFF) );
+	RETURN ( __MKUCHARACTER(__returnValue.iVal & 0xFFFF) );
     }
     if (returnTypeSymbol == @symbol(sint64)) {
-        RETURN ( __MKINT64(&__returnValue.longLongVal) );
+	RETURN ( __MKINT64(&__returnValue.longLongVal) );
     }
     if (returnTypeSymbol == @symbol(uint64)) {
-        RETURN ( __MKUINT64(&__returnValue.longLongVal) );
+	RETURN ( __MKUINT64(&__returnValue.longLongVal) );
     }
 
 # ifdef VERBOSE
     printf("%x\n", __returnValue.pointerVal);
 # endif
     if (returnTypeSymbol == @symbol(handle)) {
-        returnValue = __MKEXTERNALADDRESS(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALADDRESS(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(pointer)) {
-        returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(bytePointer)) {
-        returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(charPointer)) {
-        returnValue = __MKSTRING(__returnValue.pointerVal);
+	returnValue = __MKSTRING(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(wcharPointer)) {
-        returnValue = __MKU16STRING(__returnValue.pointerVal);
+	returnValue = __MKU16STRING(__returnValue.pointerVal);
     } else {
-        __FAIL__(@symbol(UnknownReturnType2))
+	__FAIL__(@symbol(UnknownReturnType2))
     }
 #else /* no FFI support */
     failureCode = @symbol(FFINotSupported);
@@ -1519,46 +1519,46 @@
 getOutOfHere: ;
 %}.
     failureCode notNil ifTrue:[
-        (failureCode == #UnknownReturnType or:[ failureCode == #UnknownArgumentType ]) ifTrue:[
-            oldReturnType := returnType.
-            oldArgumentTypes := argumentTypes.
-            self adjustTypes.
-            ((oldReturnType ~= returnType) or:[oldArgumentTypes ~= argumentTypes]) ifTrue:[
-                thisContext restart
-            ].
-        ].
-        (failureCode == #BadArgForAsyncCall) ifTrue:[
-            ^ self tryAgainWithAsyncSafeArguments:argumentsOrNil forCPPInstance:aCPlusPlusObjectOrNil
-        ].
+	(failureCode == #UnknownReturnType or:[ failureCode == #UnknownArgumentType ]) ifTrue:[
+	    oldReturnType := returnType.
+	    oldArgumentTypes := argumentTypes.
+	    self adjustTypes.
+	    ((oldReturnType ~= returnType) or:[oldArgumentTypes ~= argumentTypes]) ifTrue:[
+		thisContext restart
+	    ].
+	].
+	(failureCode == #BadArgForAsyncCall) ifTrue:[
+	    ^ self tryAgainWithAsyncSafeArguments:argumentsOrNil forCPPInstance:aCPlusPlusObjectOrNil
+	].
 
-        self primitiveFailed.   "see failureCode and failureInfo for details"
-        ^ nil
+	self primitiveFailed.   "see failureCode and failureInfo for details"
+	^ nil
     ].
 
     returnType isSymbol ifTrue:[
-        returnValueClass notNil ifTrue:[
-            self isConstReturnValue ifTrue:[
-                returnValue changeClassTo:returnValueClass.
-                ^ returnValue
-            ].
-            ^ returnValueClass fromExternalAddress:returnValue.
-        ].
+	returnValueClass notNil ifTrue:[
+	    self isConstReturnValue ifTrue:[
+		returnValue changeClassTo:returnValueClass.
+		^ returnValue
+	    ].
+	    ^ returnValueClass fromExternalAddress:returnValue.
+	].
     ] ifFalse:[
-        returnType isCPointer ifTrue:[
-            returnType baseType isCStruct ifTrue:[
-                stClass := Smalltalk classNamed:returnType baseType name.
-                stClass notNil ifTrue:[
-                    self isConstReturnValue ifTrue:[
-                        returnValue changeClassTo:returnValueClass.
-                        ^ returnValue
-                    ].
-                    ^ stClass fromExternalAddress:returnValue.
-                ].
-            ].
-            returnType baseType isCChar ifTrue:[
-                ^ returnValue stringAt:1
-            ].
-        ].
+	returnType isCPointer ifTrue:[
+	    returnType baseType isCStruct ifTrue:[
+		stClass := Smalltalk classNamed:returnType baseType name.
+		stClass notNil ifTrue:[
+		    self isConstReturnValue ifTrue:[
+			returnValue changeClassTo:returnValueClass.
+			^ returnValue
+		    ].
+		    ^ stClass fromExternalAddress:returnValue.
+		].
+	    ].
+	    returnType baseType isCChar ifTrue:[
+		^ returnValue stringAt:1
+	    ].
+	].
     ].
 
     ^ returnValue
@@ -1575,50 +1575,50 @@
     |saveArguments anyBadArg result originalToSaveArgMapping|
 
     argumentsOrNil isNil ifTrue:[
-        ^ self primitiveFailed
+	^ self primitiveFailed
     ].
     thisContext isRecursive ifTrue: [^self primitiveFailed].
 
     anyBadArg := false.
     originalToSaveArgMapping := IdentityDictionary new.
 
-    saveArguments := argumentsOrNil 
-                        collect:[:eachArg |
-                            |saveArg|
+    saveArguments := argumentsOrNil
+			collect:[:eachArg |
+			    |saveArg|
 
-                            (originalToSaveArgMapping includesKey:eachArg) ifTrue:[
-                                saveArg := originalToSaveArgMapping at:eachArg
-                            ] ifFalse:[
-                                eachArg isString ifTrue:[
-                                    saveArg := (ExternalBytes fromString:eachArg) register.
-                                    anyBadArg := true.
-                                    originalToSaveArgMapping at:eachArg put:saveArg.
-                                ] ifFalse:[
-                                    eachArg isByteCollection ifTrue:[
-                                        saveArg := (ExternalBytes from:eachArg) register.
-                                        originalToSaveArgMapping at:eachArg put:saveArg.
-                                        anyBadArg := true.
-                                    ] ifFalse:[
-                                        saveArg := eachArg
-                                    ]
-                                ].
-                            ].
-                            saveArg
-                        ].
+			    (originalToSaveArgMapping includesKey:eachArg) ifTrue:[
+				saveArg := originalToSaveArgMapping at:eachArg
+			    ] ifFalse:[
+				eachArg isString ifTrue:[
+				    saveArg := (ExternalBytes fromString:eachArg) register.
+				    anyBadArg := true.
+				    originalToSaveArgMapping at:eachArg put:saveArg.
+				] ifFalse:[
+				    eachArg isByteCollection ifTrue:[
+					saveArg := (ExternalBytes from:eachArg) register.
+					originalToSaveArgMapping at:eachArg put:saveArg.
+					anyBadArg := true.
+				    ] ifFalse:[
+					saveArg := eachArg
+				    ]
+				].
+			    ].
+			    saveArg
+			].
 
     anyBadArg ifFalse:[
-        "avoid recursion..."
-        ^ self primitiveFailed
+	"avoid recursion..."
+	^ self primitiveFailed
     ].
 
     result := self invokeFFIwithArguments:saveArguments forCPPInstance:aCPlusPlusObjectOrNil.
 
     "/ copy back !!
     originalToSaveArgMapping keysAndValuesDo:[:arg :saveArg |
-        arg isSymbol ifFalse:[
-            arg replaceFrom:1 to:(arg size) with:saveArg startingAt:1.
-        ].
-        saveArg free.
+	arg isSymbol ifFalse:[
+	    arg replaceFrom:1 to:(arg size) with:saveArg startingAt:1.
+	].
+	saveArg free.
     ].
     ^ result.
 
@@ -1639,7 +1639,7 @@
 !ExternalLibraryFunction class methodsFor:'documentation'!
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/ExternalLibraryFunction.st,v 1.90 2012-11-16 09:27:00 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ExternalLibraryFunction.st,v 1.91 2013-01-02 12:45:06 cg Exp $'
 !
 
 version_SVN