ExternalLibraryFunction.st
changeset 10440 b643af58f8bf
parent 10279 60c42983fdd4
child 10481 b3526180579f
--- a/ExternalLibraryFunction.st	Tue Mar 06 17:01:12 2007 +0100
+++ b/ExternalLibraryFunction.st	Wed Mar 07 17:19:25 2007 +0100
@@ -324,16 +324,16 @@
 
 invoke
     self hasCode ifFalse:[
-	self prepareInvoke.
+        self prepareInvoke.
     ].
-    ^ self invokeFFIWithArguments:#()
+    ^ self invokeFFIWithArguments:nil
 !
 
 invokeCPPVirtualOn:anInstance
     self hasCode ifFalse:[
-	self prepareInvoke.
+        self prepareInvoke.
     ].
-    ^ self invokeCPPVirtualFFIOn:anInstance withArguments:#()
+    ^ self invokeCPPVirtualFFIOn:anInstance withArguments:nil
 !
 
 invokeCPPVirtualOn:instance with:arg
@@ -589,7 +589,7 @@
     "Modified: / 01-08-2006 / 13:55:35 / cg"
 !
 
-invokeFFIwithArguments:arguments forCPPInstance:aCPlusPlusObjectOrNil
+invokeFFIwithArguments:argumentsOrNil forCPPInstance:aCPlusPlusObjectOrNil
     |argTypeSymbols returnTypeSymbol failureCode failureInfo returnValue stClass vtOffset
      virtual async unlimitedStack callTypeNumber returnValueClass argValueClass|
 
@@ -598,26 +598,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.
@@ -630,10 +630,10 @@
     ffi_type **__argTypes = __argTypesIncludingThis;
     ffi_type *__returnType = NULL;
     union u {
-	int iVal;
-	float fVal;
-	double dVal;
-	void *pointerVal;
+        int iVal;
+        float fVal;
+        double dVal;
+        void *pointerVal;
     };
     union u __argValuesIncludingThis[MAX_ARGS+1];
     union u *__argValues = __argValuesIncludingThis;
@@ -646,27 +646,32 @@
     int i;
     ffi_abi __callType = FFI_DEFAULT_ABI;
     VOIDFUNC codeAddress = (VOIDFUNC)__INST(code_);
+    int __numArgsWanted;
 
-    if (arguments == nil) {
-	__numArgs = 0;
-	if (argTypeSymbols != nil) {
-	    if (! __isArray(argTypeSymbols)
-	     || (__arraySize(argTypeSymbols) != __numArgs)) {
-		failureCode = @symbol(ArgumentCountMismatch);
-		goto getOutOfHere;
-	    }
-	}
+    if (argumentsOrNil == nil) {
+        __numArgs = 0;
+    } else if (__isArray(argumentsOrNil)) {
+        __numArgs = __arraySize(argumentsOrNil);
     } else {
-	if (! __isArray(arguments)
-	 || ! __isArray(argTypeSymbols)
-	 || (__arraySize(argTypeSymbols) != (__numArgs = __arraySize(arguments)))) {
-	    failureCode = @symbol(ArgumentCountMismatch);
-	    goto getOutOfHere;
-	}
+        failureCode = @symbol(BadArgumentVector);
+        goto getOutOfHere;
+    }
+    if (argTypeSymbols == nil) {
+        __numArgsWanted = 0;
+    } else if (__isArray(argTypeSymbols)) {
+        __numArgsWanted = __arraySize(argTypeSymbols);
+    } else {
+        failureCode = @symbol(BadArgumentTypeVector);
+        goto getOutOfHere;
+    }
+
+    if (__numArgs != __numArgsWanted) {
+        failureCode = @symbol(ArgumentCountMismatch);
+        goto getOutOfHere;
     }
     if (__numArgs > MAX_ARGS) {
-	failureCode = @symbol(TooManyArguments);
-	goto getOutOfHere;
+        failureCode = @symbol(TooManyArguments);
+        goto getOutOfHere;
     }
 
     /*
@@ -675,133 +680,133 @@
     __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 {
-	    failureCode = @symbol(UnknownReturnType);
-	    goto getOutOfHere;
-	}
+        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 {
+            failureCode = @symbol(UnknownReturnType);
+            goto getOutOfHere;
+        }
 
     } 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 {
-	    failureCode = @symbol(UnknownReturnType);
-	    goto getOutOfHere;
-	}
+        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 {
+            failureCode = @symbol(UnknownReturnType);
+            goto getOutOfHere;
+        }
 
     } 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))) {
-	__returnType = __get_ffi_type_pointer();
+        __returnType = __get_ffi_type_pointer();
     } else if (returnTypeSymbol == @symbol(charPointer)) {
-	__returnType = __get_ffi_type_pointer();
+        __returnType = __get_ffi_type_pointer();
     } else if (returnTypeSymbol == @symbol(wcharPointer)) {
-	__returnType = __get_ffi_type_pointer();
+        __returnType = __get_ffi_type_pointer();
     } else {
-	if (__isSymbol(returnTypeSymbol)
-	 && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
-	    if (! __isBehaviorLike(returnValueClass)) {
-		failureCode = @symbol(NonBehaviorReturnType);
-		goto getOutOfHere;
-	    }
-	    if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
-		failureCode = @symbol(NonExternalAddressReturnType);
-		goto getOutOfHere;
-	    }
-	    __returnType = __get_ffi_type_pointer();
-	    returnTypeSymbol = @symbol(pointer);
-	} else {
-	    failureCode = @symbol(UnknownReturnType);
-	    goto getOutOfHere;
-	}
+        if (__isSymbol(returnTypeSymbol)
+         && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
+            if (! __isBehaviorLike(returnValueClass)) {
+                failureCode = @symbol(NonBehaviorReturnType);
+                goto getOutOfHere;
+            }
+            if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
+                failureCode = @symbol(NonExternalAddressReturnType);
+                goto getOutOfHere;
+            }
+            __returnType = __get_ffi_type_pointer();
+            returnTypeSymbol = @symbol(pointer);
+        } else {
+            failureCode = @symbol(UnknownReturnType);
+            goto getOutOfHere;
+        }
     }
 
     /*
      * 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 {
-	    failureCode = @symbol(InvalidInstance);
-	    goto getOutOfHere;
-	}
-	__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 {
+            failureCode = @symbol(InvalidInstance);
+            goto getOutOfHere;
+        }
+        __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)) {
-		failureCode = @symbol(InvalidVTableIndex);
-		goto getOutOfHere;
-	    }
-	    codeAddress = inst->vTable[__intVal(vtOffset)];
+        if (virtual == true) {
+            if (! __isSmallInteger(vtOffset)) {
+                failureCode = @symbol(InvalidVTableIndex);
+                goto getOutOfHere;
+            }
+            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
     }
 
@@ -809,268 +814,268 @@
      * 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(arguments)->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)) {
-	    thisType = __get_ffi_type_sint();
-	    if (__isSmallInteger(arg)) {
-		__argValues[i].iVal = __intVal(arg);
-	    } else {
-		__argValues[i].iVal = __signedLongIntVal(arg);
-		if (__argValues[i].iVal == 0) {
-		    failureCode = @symbol(InvalidArgument);
-		    goto getOutOfHere;
-		}
-	    }
-	    argValuePtr = &(__argValues[i].iVal);
+        if (typeSymbol == @symbol(int)) {
+            thisType = __get_ffi_type_sint();
+            if (__isSmallInteger(arg)) {
+                __argValues[i].iVal = __intVal(arg);
+            } else {
+                __argValues[i].iVal = __signedLongIntVal(arg);
+                if (__argValues[i].iVal == 0) {
+                    failureCode = @symbol(InvalidArgument);
+                    goto getOutOfHere;
+                }
+            }
+            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) {
-		    failureCode = @symbol(InvalidArgument);
-		    goto getOutOfHere;
-		}
-	    }
-	    argValuePtr = &(__argValues[i].iVal);
+            if (__isSmallInteger(arg)) {
+                __argValues[i].iVal = __intVal(arg);
+            } else {
+                __argValues[i].iVal = __unsignedLongIntVal(arg);
+                if (__argValues[i].iVal == 0) {
+                    failureCode = @symbol(InvalidArgument);
+                    goto getOutOfHere;
+                }
+            }
+            argValuePtr = &(__argValues[i].iVal);
 
-	} else if (typeSymbol == @symbol(uint8)) {
-	    thisType = __get_ffi_type_uint8();
-	    if (! __isSmallInteger(arg)) {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    __argValues[i].iVal = __intVal(arg);
-	    if (((unsigned)(__argValues[i].iVal)) > 0xFF) {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    argValuePtr = &(__argValues[i].iVal);
+        } else if (typeSymbol == @symbol(uint8)) {
+            thisType = __get_ffi_type_uint8();
+            if (! __isSmallInteger(arg)) {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            __argValues[i].iVal = __intVal(arg);
+            if (((unsigned)(__argValues[i].iVal)) > 0xFF) {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            argValuePtr = &(__argValues[i].iVal);
 
-	} else if (typeSymbol == @symbol(sint8)) {
-	    thisType = __get_ffi_type_sint8();
-	    if (! __isSmallInteger(arg)) {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    __argValues[i].iVal = __intVal(arg);
-	    if (((__argValues[i].iVal) < -0x80) || ((__argValues[i].iVal) > 0x7F))  {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    argValuePtr = &(__argValues[i].iVal);
+        } else if (typeSymbol == @symbol(sint8)) {
+            thisType = __get_ffi_type_sint8();
+            if (! __isSmallInteger(arg)) {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            __argValues[i].iVal = __intVal(arg);
+            if (((__argValues[i].iVal) < -0x80) || ((__argValues[i].iVal) > 0x7F))  {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            argValuePtr = &(__argValues[i].iVal);
 
-	} else if (typeSymbol == @symbol(uint16)) {
-	    thisType = __get_ffi_type_uint16();
-	    if (! __isSmallInteger(arg)) {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    __argValues[i].iVal = __intVal(arg);
-	    if (((unsigned)(__argValues[i].iVal)) > 0xFFFF) {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    argValuePtr = &(__argValues[i].iVal);
+        } else if (typeSymbol == @symbol(uint16)) {
+            thisType = __get_ffi_type_uint16();
+            if (! __isSmallInteger(arg)) {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            __argValues[i].iVal = __intVal(arg);
+            if (((unsigned)(__argValues[i].iVal)) > 0xFFFF) {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            argValuePtr = &(__argValues[i].iVal);
 
-	} else if (typeSymbol == @symbol(sint16)) {
-	    thisType = __get_ffi_type_sint16();
-	    if (! __isSmallInteger(arg)) {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    __argValues[i].iVal = __intVal(arg);
-	    if (((__argValues[i].iVal) < -0x8000) || ((__argValues[i].iVal) > 0x7FFF))  {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    argValuePtr = &(__argValues[i].iVal);
+        } else if (typeSymbol == @symbol(sint16)) {
+            thisType = __get_ffi_type_sint16();
+            if (! __isSmallInteger(arg)) {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            __argValues[i].iVal = __intVal(arg);
+            if (((__argValues[i].iVal) < -0x8000) || ((__argValues[i].iVal) > 0x7FFF))  {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            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) {
-		    failureCode = @symbol(InvalidArgument);
-		    goto getOutOfHere;
-		}
-	    }
-	    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) {
+                    failureCode = @symbol(InvalidArgument);
+                    goto getOutOfHere;
+                }
+            }
+            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 {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    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 {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            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 {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    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 {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            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 (__isString(arg) || __isSymbol(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 (arg == nil) {
-			__argValues[i].pointerVal = (void *)0;
-		    } else {
-			failureCode = @symbol(InvalidArgument);
-			goto getOutOfHere;
-		    }
-		}
-	    }
-	    argValuePtr = &(__argValues[i].pointerVal);;
+        } else if (typeSymbol == @symbol(charPointer)) {
+            thisType = __get_ffi_type_pointer();
+            if (__isString(arg) || __isSymbol(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 (arg == nil) {
+                        __argValues[i].pointerVal = (void *)0;
+                    } else {
+                        failureCode = @symbol(InvalidArgument);
+                        goto getOutOfHere;
+                    }
+                }
+            }
+            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 (__isByteArray(arg)) {
-		if (async == true) goto badArgForAsyncCall;
-		__argValues[i].pointerVal = (void *)(__byteArrayVal(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 (__isString(arg) || __isSymbol(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 (__isByteArray(arg)) {
+                if (async == true) goto badArgForAsyncCall;
+                __argValues[i].pointerVal = (void *)(__byteArrayVal(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 (__isString(arg) || __isSymbol(arg)) {
+                if (async == true) {
 badArgForAsyncCall: ;
-		    failureCode = @symbol(BadArgForAsyncCall);
-		    goto getOutOfHere;
-		}
-		__argValues[i].pointerVal = (void *)(__stringVal(arg));
-	    } else if (__isBytes(arg)) {
-		char *p = (char *)(__byteArrayVal(arg));
-		int nInstBytes;
-		OBJ cls;
+                    failureCode = @symbol(BadArgForAsyncCall);
+                    goto getOutOfHere;
+                }
+                __argValues[i].pointerVal = (void *)(__stringVal(arg));
+            } else if (__isBytes(arg)) {
+                char *p = (char *)(__byteArrayVal(arg));
+                int nInstBytes;
+                OBJ cls;
 
-		cls = __qClass(arg);
-		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-		__argValues[i].pointerVal = p + nInstBytes;
-	    } else {
-		failureCode = @symbol(InvalidArgument);
-		goto getOutOfHere;
-	    }
-	    argValuePtr = &(__argValues[i].pointerVal);;
+                cls = __qClass(arg);
+                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+                __argValues[i].pointerVal = p + nInstBytes;
+            } else {
+                failureCode = @symbol(InvalidArgument);
+                goto getOutOfHere;
+            }
+            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) {
-		    failureCode = @symbol(InvalidArgument);
-		    goto getOutOfHere;
-		}
-	    }
-	    argValuePtr = &(__argValues[i].iVal);
-	} else {
-	    if (__isSymbol(typeSymbol)
-	     && ((argValueClass = __GLOBAL_GET(typeSymbol)) != nil)) {
-		if (! __isBehaviorLike(argValueClass)) {
-		    failureCode = @symbol(NonBehaviorArgumentType);
-		    goto getOutOfHere;
-		}
-		if (! __qIsSubclassOfExternalAddress(argValueClass)) {
-		    failureCode = @symbol(NonExternalAddressArgumentType);
-		    goto getOutOfHere;
-		}
-		goto commonPointerTypeArg; /* sorry */
-	    } else {
-		failureCode = @symbol(UnknownArgumentType);
-		goto getOutOfHere;
-	    }
-	}
+            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) {
+                    failureCode = @symbol(InvalidArgument);
+                    goto getOutOfHere;
+                }
+            }
+            argValuePtr = &(__argValues[i].iVal);
+        } else {
+            if (__isSymbol(typeSymbol)
+             && ((argValueClass = __GLOBAL_GET(typeSymbol)) != nil)) {
+                if (! __isBehaviorLike(argValueClass)) {
+                    failureCode = @symbol(NonBehaviorArgumentType);
+                    goto getOutOfHere;
+                }
+                if (! __qIsSubclassOfExternalAddress(argValueClass)) {
+                    failureCode = @symbol(NonExternalAddressArgumentType);
+                    goto getOutOfHere;
+                }
+                goto commonPointerTypeArg; /* sorry */
+            } else {
+                failureCode = @symbol(UnknownArgumentType);
+                goto getOutOfHere;
+            }
+        }
 
-	__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;
@@ -1079,54 +1084,54 @@
 
 #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) {
-	failureCode = @symbol(FFIPrepareFailed);
-	goto getOutOfHere;
+        failureCode = @symbol(FFIPrepareFailed);
+        goto getOutOfHere;
     }
     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);
@@ -1135,42 +1140,42 @@
      || (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(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(charPointer)) {
-	returnValue = __MKSTRING(__returnValue.pointerVal);
+        returnValue = __MKSTRING(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(wcharPointer)) {
-	returnValue = __MKU16STRING(__returnValue.pointerVal);
+        returnValue = __MKU16STRING(__returnValue.pointerVal);
     } else {
-	failureCode = @symbol(UnknownReturnType2);
+        failureCode = @symbol(UnknownReturnType2);
     }
 getOutOfHere: ;
 
@@ -1179,34 +1184,34 @@
 #endif /* HAVE_FFI */
 %}.
     failureCode notNil ifTrue:[
-	self primitiveFailed.
-	^ nil
+        self primitiveFailed.
+        ^ 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
@@ -1218,7 +1223,7 @@
 !ExternalLibraryFunction class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/ExternalLibraryFunction.st,v 1.48 2006-12-21 06:29:00 ca Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ExternalLibraryFunction.st,v 1.49 2007-03-07 16:19:25 fm Exp $'
 ! !
 
 ExternalLibraryFunction initialize!