--- a/ExternalLibraryFunction.st Fri Sep 29 23:48:47 2006 +0200
+++ b/ExternalLibraryFunction.st Wed Oct 04 11:10:37 2006 +0200
@@ -100,8 +100,8 @@
name:functionName module:moduleName returnType:returnType argumentTypes:argTypes
^ self new
- name:functionName module:moduleName
- returnType:returnType argumentTypes:argTypes
+ name:functionName module:moduleName
+ returnType:returnType argumentTypes:argTypes
"Created: / 01-08-2006 / 15:19:08 / cg"
! !
@@ -109,21 +109,26 @@
!ExternalLibraryFunction class methodsFor:'class initialization'!
initialize
- FLAG_VIRTUAL := 16r100. "/ a virtual c++ call
- FLAG_NONVIRTUAL := 16r200. "/ a non-virtual c++ call
- FLAG_UNLIMITEDSTACK := 16r400. "/ unlimitedstack under unix
- FLAG_ASYNC := 16r800. "/ async under win32
- FLAG_RETVAL_IS_CONST := 16r1000. "/ return value is not to be registered for finalization
+ "using inline access to corresponding c--defines to avoid duplicate places of knowledge"
+ 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 := 1. "/ WINAPI-call (win32 only)
- CALLTYPE_C := 2. "/ regular C-call (the default)
- CALLTYPE_V8 := 3. "/ v8 call (sparc only)
- CALLTYPE_V9 := 4. "/ v9 call (sparc only)
- CALLTYPE_UNIX64 := 5. "/ 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 := 16rFF.
+ CALLTYPE_MASK := %{ __MKSMALLINT(__EXTL_CALLTYPE_MASK) %}.
- "Modified: / 01-08-2006 / 15:09:36 / cg"
+ "
+ self initialize
+ "
+
+ "Modified: / 03-10-2006 / 21:27:47 / cg"
! !
!ExternalLibraryFunction class methodsFor:'constants'!
@@ -204,7 +209,7 @@
!
beConstReturnValue
- "specify that a pointer return value is not to be finalized
+ "specify that a pointer return value is not to be finalized
(i.e. points to static data or data which is freed by c)"
flags := (flags ? 0) bitOr: FLAG_RETVAL_IS_CONST.
@@ -273,7 +278,7 @@
!
isConstReturnValue
- "is the pointer return value not to be finalized
+ "is the pointer return value not to be finalized
(i.e. points to static data or data which is freed by c)"
^ (flags ? 0) bitTest: FLAG_RETVAL_IS_CONST.
@@ -318,35 +323,35 @@
invokeCPPVirtualOn:anInstance
self hasCode ifFalse:[
- self prepareInvoke.
+ self prepareInvoke.
].
^ self invokeCPPVirtualFFIOn:anInstance withArguments:#()
!
invokeCPPVirtualOn:instance with:arg
self hasCode ifFalse:[
- self prepareInvoke.
+ self prepareInvoke.
].
^ self invokeCPPVirtualFFIOn:instance withArguments:(Array with:arg)
!
invokeCPPVirtualOn:instance with:arg1 with:arg2
self hasCode ifFalse:[
- self prepareInvoke.
+ self prepareInvoke.
].
^ self invokeCPPVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2)
!
invokeCPPVirtualOn:instance with:arg1 with:arg2 with:arg3
self hasCode ifFalse:[
- self prepareInvoke.
+ self prepareInvoke.
].
^ self invokeCPPVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2 with:arg3)
!
invokeCPPVirtualOn:instance with:arg1 with:arg2 with:arg3 with:arg4
self hasCode ifFalse:[
- self prepareInvoke.
+ self prepareInvoke.
].
^ self invokeCPPVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2 with:arg3 with:arg4)
!
@@ -381,7 +386,7 @@
invokeWithArguments:argArray
self hasCode ifFalse:[
- self prepareInvoke.
+ self prepareInvoke.
].
^ self invokeFFIwithArguments:argArray forCPPInstance:nil
@@ -393,15 +398,15 @@
printOn:aStream
aStream nextPutAll:'<'.
self isCallTypeAPI ifTrue:[
- 'API:' printOn:aStream.
+ 'API:' printOn:aStream.
] ifFalse:[
- 'C:' printOn:aStream.
+ 'C:' printOn:aStream.
].
aStream nextPutAll:' '.
name printOn:aStream.
moduleName notNil ifTrue:[
- aStream nextPutAll:' module:'.
- moduleName printOn:aStream.
+ aStream nextPutAll:' module:'.
+ moduleName printOn:aStream.
].
aStream nextPutAll:'>'.
@@ -417,82 +422,121 @@
|handle moduleNameUsed functionName|
(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 := ObjectFileLoader loadDynamicObject:(moduleNameUsed asString).
- handle isNil ifTrue:[
- handle := ObjectFileLoader
- loadDynamicObject:(Filename currentDirectory construct:moduleNameUsed) pathName.
- handle isNil ifTrue:[
- self error:'Cannot load module: ', moduleNameUsed.
- ].
- ].
- moduleHandle := handle.
+ handle := ObjectFileLoader loadDynamicObject:(moduleNameUsed asString).
+ handle isNil ifTrue:[
+ handle := ObjectFileLoader
+ loadDynamicObject:(Filename currentDirectory construct:moduleNameUsed) pathName.
+ handle isNil ifTrue:[
+ self error:'Cannot load module: ', 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: / 01-08-2006 / 16:24:14 / cg"
!
prepareInvoke
- self hasCode ifFalse:[
- moduleHandle isNil ifTrue:[
- self linkToModule.
- ].
+ moduleHandle isNil ifTrue:[
+ self linkToModule.
+ self adjustTypes.
].
+!
+
+adjustTypes
+ argumentTypes notNil ifTrue:[
+ argumentTypes := argumentTypes collect:[:argType | self ffiTypeSymbolForType:argType].
+ ].
+ returnType := self ffiTypeSymbolForType:returnType.
! !
!ExternalLibraryFunction methodsFor:'private-accessing'!
ffiTypeSymbolForType:aType
+ "map type to one of the ffi-supported ones:
+ sint8, sint16, sint32, sint64
+ uint8, uint16, uint32, uint64
+ bool void handle
+ "
+
|t|
- "/ kludge for those who do not have the CType package...
- t := aType.
- t isSymbol ifTrue:[
- t == #int8 ifTrue:[^ #sint8 ].
- t == #int16 ifTrue:[^ #sint16 ].
- t == #int32 ifTrue:[^ #sint32 ].
- t == #int64 ifTrue:[^ #sint64 ].
- t == #bool ifTrue:[^ #boolean ].
- t == #voidPointer ifTrue:[^ #handle ].
- ^ t.
+ aType == #sint8 ifTrue:[^ aType ].
+ aType == #sint16 ifTrue:[^ aType ].
+ aType == #sint32 ifTrue:[^ aType ].
+ aType == #sint64 ifTrue:[^ aType ].
+ aType == #uint8 ifTrue:[^ aType ].
+ aType == #uint16 ifTrue:[^ aType ].
+ aType == #uint32 ifTrue:[^ aType ].
+ aType == #uint64 ifTrue:[^ aType ].
+ aType == #double ifTrue:[^ aType ].
+ aType == #float ifTrue:[^ aType ].
+ aType == #char ifTrue:[^ aType ].
+ aType == #void ifTrue:[^ aType ].
+ aType == #bool ifTrue:[^ aType ].
+ aType == #pointer ifTrue:[^ aType ].
+
+ aType == #int8 ifTrue:[^ #sint8 ].
+ aType == #int16 ifTrue:[^ #sint16 ].
+ aType == #int32 ifTrue:[^ #sint32 ].
+ aType == #int64 ifTrue:[^ #sint64 ].
+ aType == #voidPointer ifTrue:[^ #pointer ].
+
+ aType == #short ifTrue:[^ #int16 ].
+ aType == #long ifTrue:[^ #int32 ]. "/ TODO - care for 64bit machines
+ aType == #int ifTrue:[^ #int32 ]. "/ TODO - care for 64bit machines
+ aType == #ushort ifTrue:[^ #uint16 ].
+ aType == #unsignedShort ifTrue:[^ #uint16 ].
+ aType == #ulong ifTrue:[^ #uint32 ]. "/ TODO - care for 64bit machines
+ aType == #unsignedLong ifTrue:[^ #uint32 ]. "/ TODO - care for 64bit machines
+ aType == #uchar ifTrue:[^ #uint8 ].
+ aType == #unsignedChar ifTrue:[^ #uint8 ].
+ aType == #byte ifTrue:[^ #uint8 ].
+ aType == #dword ifTrue:[^ #uint32 ].
+ aType == #sdword ifTrue:[^ #int32 ].
+ aType == #word ifTrue:[^ #uint16 ].
+ aType == #sword ifTrue:[^ #int16 ].
+ aType == #handle ifTrue:[^ #pointer ].
+ aType == #lpstr ifTrue:[^ #charPointer ].
+ aType == #hresult ifTrue:[^ #uint32 ].
+ aType == #boolean ifTrue:[^ #bool ].
+ aType == #ulongReturn ifTrue:[^ #uint32 ]. "/ TODO - care for 64bit machines
+ aType == #none ifTrue:[^ #void ].
+ aType == #struct ifTrue:[^ #pointer ].
+ aType == #structIn ifTrue:[^ #pointer ].
+ aType == #structOut ifTrue:[^ #pointer ].
+
+ (aType isString or:[aType isSymbol]) ifFalse:[
+ CType isNil ifTrue:[
+ self error:'unknown type'.
+ ].
+ ^ aType typeSymbol.
].
- aType isString ifFalse:[
- CType isNil ifTrue:[
- self error:'unknown type'.
- ].
- t := aType typeSymbol.
- ].
- aType isString ifTrue:[
- self halt:'oops'
- ].
- t isSymbol ifFalse:[
- self error:'unknown type'.
- ].
-
- ^ t
+ ^ aType
!
name:functionNameOrVirtualIndex module:aModuleName returnType:aReturnType argumentTypes:argTypes
name := functionNameOrVirtualIndex.
functionNameOrVirtualIndex isNumber ifTrue:[
- self beVirtualCPP.
+ self beVirtualCPP.
].
moduleName := aModuleName.
returnType := aReturnType.
@@ -522,53 +566,51 @@
"Modified: / 01-08-2006 / 13:55:35 / cg"
!
-invokeFFIwithArguments:arguments forCPPInstance:aCPlusPlusObjectOrNil
- |argTypeSymbols returnTypeSymbol failureCode failureInfo returnValue stClass vtOffset
+invokeFFIwithArguments:arguments forCPPInstance:aCPlusPlusObjectOrNil
+ |argTypeSymbols returnTypeSymbol failureCode failureInfo returnValue stClass vtOffset
virtual async unlimitedStack callTypeNumber returnValueClass argValueClass|
- argumentTypes notNil ifTrue:[
- argTypeSymbols := argumentTypes collect:[:argType | self ffiTypeSymbolForType:argType].
- ].
- returnTypeSymbol := self ffiTypeSymbolForType:returnType.
+ argTypeSymbols := argumentTypes.
+ returnTypeSymbol := returnType.
- virtual := self isVirtualCPP.
+ 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.
callTypeNumber := self callTypeNumber.
%{ /* STACK: 100000 */
-#ifdef HAVE_FFI
+#ifdef HAVE_FFI
ffi_cif __cif;
ffi_type *__argTypesIncludingThis[MAX_ARGS+1];
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;
@@ -583,25 +625,25 @@
VOIDFUNC codeAddress = (VOIDFUNC)__INST(code_);
if (arguments == nil) {
- __numArgs = 0;
- if (argTypeSymbols != nil) {
- if (! __isArray(argTypeSymbols)
- || (__arraySize(argTypeSymbols) != __numArgs)) {
- failureCode = @symbol(ArgumentCountMismatch);
- goto getOutOfHere;
- }
- }
+ __numArgs = 0;
+ if (argTypeSymbols != nil) {
+ if (! __isArray(argTypeSymbols)
+ || (__arraySize(argTypeSymbols) != __numArgs)) {
+ failureCode = @symbol(ArgumentCountMismatch);
+ goto getOutOfHere;
+ }
+ }
} else {
- if (! __isArray(arguments)
- || ! __isArray(argTypeSymbols)
- || (__arraySize(argTypeSymbols) != (__numArgs = __arraySize(arguments)))) {
- failureCode = @symbol(ArgumentCountMismatch);
- goto getOutOfHere;
- }
+ if (! __isArray(arguments)
+ || ! __isArray(argTypeSymbols)
+ || (__arraySize(argTypeSymbols) != (__numArgs = __arraySize(arguments)))) {
+ failureCode = @symbol(ArgumentCountMismatch);
+ goto getOutOfHere;
+ }
}
if (__numArgs > MAX_ARGS) {
- failureCode = @symbol(TooManyArguments);
- goto getOutOfHere;
+ failureCode = @symbol(TooManyArguments);
+ goto getOutOfHere;
}
/*
@@ -610,133 +652,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(boolean)) {
- __returnType = __get_ffi_type_uint();
+ } else if (returnTypeSymbol == @symbol(bool)) {
+ __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
}
@@ -744,268 +786,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(arguments)->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(boolean)) {
- 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;
@@ -1014,54 +1056,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);
@@ -1070,42 +1112,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(boolean)) {
- RETURN ( __returnValue.iVal ? true : false );
+ if (returnTypeSymbol == @symbol(bool)) {
+ 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: ;
@@ -1114,34 +1156,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
@@ -1153,7 +1195,7 @@
!ExternalLibraryFunction class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/ExternalLibraryFunction.st,v 1.44 2006-09-20 10:10:43 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/ExternalLibraryFunction.st,v 1.45 2006-10-04 09:10:37 cg Exp $'
! !
ExternalLibraryFunction initialize!