126 self prepareInvoke. |
126 self prepareInvoke. |
127 ]. |
127 ]. |
128 ^ self invokeFFIWithArguments:#() |
128 ^ self invokeFFIWithArguments:#() |
129 ! |
129 ! |
130 |
130 |
131 invokeVirtualOn:anInstance |
131 invokeCPPVirtualOn:anInstance |
132 self hasCode ifFalse:[ |
132 self hasCode ifFalse:[ |
133 self prepareInvoke. |
133 self prepareInvoke. |
134 ]. |
134 ]. |
135 ^ self invokeVirtualFFIOn:anInstance withArguments:#() |
135 ^ self invokeCPPVirtualFFIOn:anInstance withArguments:#() |
136 ! |
136 ! |
137 |
137 |
138 invokeVirtualOn:instance with:arg |
138 invokeCPPVirtualOn:instance with:arg |
139 self hasCode ifFalse:[ |
139 self hasCode ifFalse:[ |
140 self prepareInvoke. |
140 self prepareInvoke. |
141 ]. |
141 ]. |
142 ^ self invokeVirtualFFIOn:instance withArguments:(Array with:arg) |
142 ^ self invokeCPPVirtualFFIOn:instance withArguments:(Array with:arg) |
143 ! |
143 ! |
144 |
144 |
145 invokeVirtualOn:instance with:arg1 with:arg2 |
145 invokeCPPVirtualOn:instance with:arg1 with:arg2 |
146 self hasCode ifFalse:[ |
146 self hasCode ifFalse:[ |
147 self prepareInvoke. |
147 self prepareInvoke. |
148 ]. |
148 ]. |
149 ^ self invokeVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2) |
149 ^ self invokeCPPVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2) |
150 ! |
150 ! |
151 |
151 |
152 invokeVirtualOn:instance with:arg1 with:arg2 with:arg3 |
152 invokeCPPVirtualOn:instance with:arg1 with:arg2 with:arg3 |
153 self hasCode ifFalse:[ |
153 self hasCode ifFalse:[ |
154 self prepareInvoke. |
154 self prepareInvoke. |
155 ]. |
155 ]. |
156 ^ self invokeVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2 with:arg3) |
156 ^ self invokeCPPVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2 with:arg3) |
157 ! |
157 ! |
158 |
158 |
159 invokeVirtualOn:instance with:arg1 with:arg2 with:arg3 with:arg4 |
159 invokeCPPVirtualOn:instance with:arg1 with:arg2 with:arg3 with:arg4 |
160 self hasCode ifFalse:[ |
160 self hasCode ifFalse:[ |
161 self prepareInvoke. |
161 self prepareInvoke. |
162 ]. |
162 ]. |
163 ^ self invokeVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2 with:arg3 with:arg4) |
163 ^ self invokeCPPVirtualFFIOn:instance withArguments:(Array with:arg1 with:arg2 with:arg3 with:arg4) |
164 ! |
164 ! |
165 |
165 |
166 invokeWith:arg |
166 invokeWith:arg |
167 self hasCode ifFalse:[ |
167 self hasCode ifFalse:[ |
168 self prepareInvoke. |
168 self prepareInvoke. |
280 argumentTypes := argTypes. |
280 argumentTypes := argTypes. |
281 ! ! |
281 ! ! |
282 |
282 |
283 !ExternalLibraryFunction methodsFor:'private-invoking'! |
283 !ExternalLibraryFunction methodsFor:'private-invoking'! |
284 |
284 |
|
285 invokeCPPVirtualFFIOn:instance withArguments:arguments |
|
286 ^ self invokeFFIwithArguments:arguments forCPPInstance:instance virtual:true |
|
287 ! |
|
288 |
285 invokeFFIWithArguments:arguments |
289 invokeFFIWithArguments:arguments |
286 ^ self invokeFFIwithArguments:arguments virtualCallFor:nil |
290 ^ self invokeFFIwithArguments:arguments forCPPInstance:nil virtual:false |
287 ! |
291 ! |
288 |
292 |
289 invokeFFIwithArguments:arguments virtualCallFor:aCPlusPlusObjectOrNil |
293 invokeFFIwithArguments:arguments forCPPInstance:aCPlusPlusObjectOrNil virtual:virtual |
290 |argTypeSymbols returnTypeSymbol failureCode returnValue stClass vtOffset| |
294 |argTypeSymbols returnTypeSymbol failureCode returnValue stClass vtOffset| |
291 |
295 |
292 argumentTypes notNil ifTrue:[ |
296 argumentTypes notNil ifTrue:[ |
293 argTypeSymbols := argumentTypes collect:[:argType | self ffiTypeSymbolForType:argType]. |
297 argTypeSymbols := argumentTypes collect:[:argType | self ffiTypeSymbolForType:argType]. |
294 ]. |
298 ]. |
297 aCPlusPlusObjectOrNil notNil ifTrue:[ |
301 aCPlusPlusObjectOrNil notNil ifTrue:[ |
298 "/ it must be a kind of ExternalStructure !! |
302 "/ it must be a kind of ExternalStructure !! |
299 (aCPlusPlusObjectOrNil isKindOf:ExternalStructure) ifFalse:[ |
303 (aCPlusPlusObjectOrNil isKindOf:ExternalStructure) ifFalse:[ |
300 self primitiveFailed. |
304 self primitiveFailed. |
301 ]. |
305 ]. |
302 vtOffset := name. |
306 virtual ifTrue:[ |
303 (vtOffset between:0 and:10000) ifFalse:[ |
307 vtOffset := name. |
304 self primitiveFailed. |
308 (vtOffset between:0 and:10000) ifFalse:[ |
|
309 self primitiveFailed. |
|
310 ] |
305 ]. |
311 ]. |
306 ]. |
312 ]. |
307 |
313 |
308 %{ /* UNLIMITEDSTACK */ |
314 %{ /* UNLIMITEDSTACK */ |
309 #ifdef HAVE_FFI |
315 #ifdef HAVE_FFI |
422 } |
428 } |
423 __argValues[0].pointerVal = inst; |
429 __argValues[0].pointerVal = inst; |
424 __argValuePointersIncludingThis[0] = &(__argValues[0]); |
430 __argValuePointersIncludingThis[0] = &(__argValues[0]); |
425 __argTypes[0] = __get_ffi_type_pointer(); |
431 __argTypes[0] = __get_ffi_type_pointer(); |
426 |
432 |
427 codeAddress = inst->vTable[__intVal(vtOffset)]; |
|
428 printf("codeAddress: %x\n", codeAddress); |
|
429 __argValuePointers = &__argValuePointersIncludingThis[1]; |
433 __argValuePointers = &__argValuePointersIncludingThis[1]; |
430 __argTypes = &__argTypesIncludingThis[1]; |
434 __argTypes = &__argTypesIncludingThis[1]; |
431 __argValues = &__argValuesIncludingThis[1]; |
435 __argValues = &__argValuesIncludingThis[1]; |
432 __numArgsIncludingThis = __numArgs + 1; |
436 __numArgsIncludingThis = __numArgs + 1; |
|
437 |
|
438 if (virtual == true) { |
|
439 if (! __isSmallInteger(vtOffset)) { |
|
440 failureCode = @symbol(InvalidVTableIndex); |
|
441 goto getOutOfHere; |
|
442 } |
|
443 codeAddress = inst->vTable[__intVal(vtOffset)]; |
|
444 printf("codeAddress: %x\n", codeAddress); |
|
445 } |
433 } else { |
446 } else { |
434 __numArgsIncludingThis = __numArgs; |
447 __numArgsIncludingThis = __numArgs; |
435 } |
448 } |
436 |
449 |
437 /* |
450 /* |
703 ^ returnValue stringAt:1 |
716 ^ returnValue stringAt:1 |
704 ]. |
717 ]. |
705 ]. |
718 ]. |
706 |
719 |
707 ^ returnValue |
720 ^ returnValue |
708 ! |
|
709 |
|
710 invokeVirtualFFIOn:instance withArguments:arguments |
|
711 ^ self invokeFFIwithArguments:arguments virtualCallFor:instance |
|
712 ! ! |
721 ! ! |
713 |
722 |
714 !ExternalLibraryFunction class methodsFor:'documentation'! |
723 !ExternalLibraryFunction class methodsFor:'documentation'! |
715 |
724 |
716 version |
725 version |
717 ^ '$Header: /cvs/stx/stx/libbasic/ExternalLibraryFunction.st,v 1.20 2006-05-05 10:30:23 cg Exp $' |
726 ^ '$Header: /cvs/stx/stx/libbasic/ExternalLibraryFunction.st,v 1.21 2006-05-05 11:40:49 cg Exp $' |
718 ! ! |
727 ! ! |