ExternalLibraryFunction.st
changeset 9347 31adc57e6954
parent 9346 a95e2cf0e56f
child 9365 9003f8432516
equal deleted inserted replaced
9346:a95e2cf0e56f 9347:31adc57e6954
   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 ! !