ExternalFunctionCallback.st
author Stefan Vogel <sv@exept.de>
Thu, 16 Apr 2020 16:57:05 +0200
changeset 25362 f1606835f9fb
parent 25087 6be980cf75e3
permissions -rw-r--r--
#TUNING by stefan class: Win32OperatingSystem class changed: #getProcessId cache my own process id
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24756
fca38270ff24 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 24338
diff changeset
     1
"{ Encoding: utf8 }"
fca38270ff24 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 24338
diff changeset
     2
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     3
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     4
 COPYRIGHT (c) 2007 by eXept Software AG
10610
44dcb48a04c7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10609
diff changeset
     5
	      All Rights Reserved
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     6
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     7
 This software is furnished under a license and may be used
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     8
 only in accordance with the terms of that license and with the
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    10
 be provided or otherwise made available to, or used by, any
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    11
 other person.  No title to or ownership of the software is
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    12
 hereby transferred.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    13
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    14
"{ Package: 'stx:libbasic' }"
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
20123
0b0dd12ddb6d #OTHER by mawalch
mawalch
parents: 14754
diff changeset
    16
"{ NameSpace: Smalltalk }"
0b0dd12ddb6d #OTHER by mawalch
mawalch
parents: 14754
diff changeset
    17
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
    18
ExternalFunction subclass:#ExternalFunctionCallback
10620
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
    19
	instanceVariableNames:'returnType argumentTypes flags action'
24070
85b7952e1260 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 24068
diff changeset
    20
	classVariableNames:'CallBackRegistry Verbose'
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'System-Support'
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!ExternalFunctionCallback primitiveDefinitions!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
%{
14754
f2511581c8a1 class: ExternalFunctionCallback
Stefan Vogel <sv@exept.de>
parents: 14659
diff changeset
    27
#include <stdlib.h>
10616
9a49511f6516 Make compilable under linux
Stefan Vogel <sv@exept.de>
parents: 10613
diff changeset
    28
#include <stdio.h>
9a49511f6516 Make compilable under linux
Stefan Vogel <sv@exept.de>
parents: 10613
diff changeset
    29
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    30
#define VERBOSE
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    31
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    32
#ifdef VERBOSE
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    33
#  define DEBUGCODE_IF(flag, code) if ((flag) == true) {  code }
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    34
# else
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    35
#  define DEBUG_IF(flag, code) /* nothing */
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    36
# endif
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    37
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
#ifdef HAVE_FFI
25087
6be980cf75e3 gcc fixes
Claus Gittinger <cg@exept.de>
parents: 24756
diff changeset
    39
# ifdef __osx__
6be980cf75e3 gcc fixes
Claus Gittinger <cg@exept.de>
parents: 24756
diff changeset
    40
#  include <ffi/ffi.h>
6be980cf75e3 gcc fixes
Claus Gittinger <cg@exept.de>
parents: 24756
diff changeset
    41
# else
6be980cf75e3 gcc fixes
Claus Gittinger <cg@exept.de>
parents: 24756
diff changeset
    42
#  include <ffi.h>
6be980cf75e3 gcc fixes
Claus Gittinger <cg@exept.de>
parents: 24756
diff changeset
    43
# endif
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
# define MAX_ARGS    128
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    46
# ifdef USE_STANDARD_FFI
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    47
#  define __get_ffi_type_sint() &ffi_type_sint
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    48
#  define __get_ffi_type_sint8() &ffi_type_sint8
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    49
#  define __get_ffi_type_sint16() &ffi_type_sint16
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    50
#  define __get_ffi_type_sint32() &ffi_type_sint32
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    51
#  define __get_ffi_type_sint64() &ffi_type_sint64
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    52
#  define __get_ffi_type_uint() &ffi_type_uint
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    53
#  define __get_ffi_type_uint8() &ffi_type_uint8
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    54
#  define __get_ffi_type_uint16() &ffi_type_uint16
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    55
#  define __get_ffi_type_uint32() &ffi_type_uint32
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    56
#  define __get_ffi_type_uint64() &ffi_type_uint64
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    57
#  define __get_ffi_type_float() &ffi_type_float
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    58
#  define __get_ffi_type_double() &ffi_type_double
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    59
#  define __get_ffi_type_void() &ffi_type_void
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    60
#  define __get_ffi_type_pointer() &ffi_type_pointer
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    61
# else
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    62
   extern ffi_type *__get_ffi_type_sint();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    63
   extern ffi_type *__get_ffi_type_sint8();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    64
   extern ffi_type *__get_ffi_type_sint16();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    65
   extern ffi_type *__get_ffi_type_sint32();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    66
   extern ffi_type *__get_ffi_type_sint64();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    67
   extern ffi_type *__get_ffi_type_uint();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    68
   extern ffi_type *__get_ffi_type_uint8();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    69
   extern ffi_type *__get_ffi_type_uint16();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    70
   extern ffi_type *__get_ffi_type_uint32();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    71
   extern ffi_type *__get_ffi_type_uint64();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    72
   extern ffi_type *__get_ffi_type_float();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    73
   extern ffi_type *__get_ffi_type_double();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    74
   extern ffi_type *__get_ffi_type_void();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
    75
   extern ffi_type *__get_ffi_type_pointer();
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
    76
# endif
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
#endif
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    80
#ifdef __osx__
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    81
# define NEW_FFI
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    82
#endif
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    83
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    84
#ifndef NEW_FFI
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    85
# define ffi_closure_alloc  malloc
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    86
# define ffi_closure_free   free
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    87
#endif
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
    88
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
%}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
!ExternalFunctionCallback primitiveFunctions!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
%{
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
10617
a9dc57b77568 Compile even if !defined(HAVE_FFI)
Stefan Vogel <sv@exept.de>
parents: 10616
diff changeset
    95
#ifdef HAVE_FFI
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
void
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    98
ExternalFunctionCallback__closure_wrapper_fn(ffi_cif* cif, void* resp, void** args, void* userdata)
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
{
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   100
    INT actionIndex = (INT)userdata;
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   101
    int i;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   102
    OBJ st_argVector = nil;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   103
    OBJ st_actionVector, st_callBack = nil, st_result;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   104
    OBJFUNC code;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   105
    ffi_type *retType;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   106
    INT sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   107
    unsigned INT uintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   108
    float floatResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   109
    double doubleResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   110
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   111
    if (@global(ExternalFunctionCallback:Verbose) == true) {
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   112
	fprintf(stderr, "ExternalFunctionCallback(wrapper): actionIndex=%"_ld_" resp*=%"_lx_"\n", actionIndex, (INT)resp);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   113
	fflush(stderr);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   114
	fprintf(stderr, "ExternalFunctionCallback(wrapper): nargs=%d\n", cif->nargs);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   115
	fflush(stderr);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   116
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   117
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   118
    st_argVector = __ARRAY_NEW_INT(cif->nargs);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   119
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   120
    for (i=0; i<cif->nargs; i++) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   121
	ffi_type *argType;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   122
	OBJ st_arg = nil;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   123
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   124
	__PROTECT__(st_argVector);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   125
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   126
	argType = cif->arg_types[i];
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   127
	if (argType == __get_ffi_type_sint()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   128
	    st_arg = __MKINT( *(int *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   129
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   130
	} else if (argType == __get_ffi_type_uint()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   131
	    st_arg = __MKUINT( *(unsigned int *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   132
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   133
	} else if (argType == __get_ffi_type_uint8()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   134
	    st_arg = __MKSMALLINT( *(unsigned char *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   135
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   136
	} else if (argType == __get_ffi_type_sint8()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   137
	    st_arg = __MKSMALLINT( *(char *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   138
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   139
	} else if (argType == __get_ffi_type_uint16()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   140
	    st_arg = __MKSMALLINT( *(unsigned short *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   141
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   142
	} else if (argType == __get_ffi_type_sint16()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   143
	    st_arg = __MKSMALLINT( *(short *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   144
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   145
	} else if (argType == __get_ffi_type_uint32()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   146
	    st_arg = __MKUINT( *(unsigned int *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   147
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   148
	} else if (argType == __get_ffi_type_sint32()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   149
	    st_arg = __MKINT( *(int *)(args[i]) );
24072
f859c1090bd6 borland fix
Claus Gittinger <cg@exept.de>
parents: 24071
diff changeset
   150
#ifndef __BORLANDC__
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   151
	} else if (argType == __get_ffi_type_uint64()) {
24073
f9d517f57178 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 24072
diff changeset
   152
	    st_arg = __MKUINT( *(unsigned long long *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   153
	} else if (argType == __get_ffi_type_sint64()) {
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   154
	    st_arg = __MKINT( *(long long *)(args[i]) );
24072
f859c1090bd6 borland fix
Claus Gittinger <cg@exept.de>
parents: 24071
diff changeset
   155
#endif
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   156
	} else if (argType == __get_ffi_type_float()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   157
	    st_arg = __MKSFLOAT( *(float *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   158
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   159
	} else if (argType == __get_ffi_type_double()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   160
	    st_arg = __MKFLOAT( *(double *)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   161
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   162
	} else if (argType == __get_ffi_type_pointer()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   163
	    st_arg = __MKEXTERNALADDRESS( *(void **)(args[i]) );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   164
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   165
	} else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   166
	    if (@global(ExternalFunctionCallback:Verbose) == true) {
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   167
		fprintf(stderr, "ExternalFunctionCallback(wrapper): invalid argument type %"_lx_" - arg %d\n", (INT)argType, i);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   168
	    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   169
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   170
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   171
	__UNPROTECT__(st_argVector);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   172
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   173
	if (@global(ExternalFunctionCallback:Verbose) == true) {
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   174
	    fprintf(stderr, "ExternalFunctionCallback(wrapper): st-arg for %"_lx_" is %"_lx_"\n", *(unsigned INT *)(args[i]), (INT)st_arg);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   175
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   176
	__ArrayInstPtr(st_argVector)->a_element[i] = st_arg; __STORE(st_argVector, st_arg);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   177
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   178
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   179
    /* the action ... */
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   180
    st_actionVector = @global(ExternalFunctionCallback:CallBackRegistry);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   181
    if (st_actionVector != nil) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   182
	OBJ cls = __Class(st_actionVector);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   183
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   184
	if ((cls == Array) || (cls==WeakArray)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   185
	    actionIndex += /* nInstVars */ __intVal(__ClassInstPtr(cls)->c_ninstvars);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   187
	    if (__arraySize(st_actionVector) <= actionIndex) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   188
		st_callBack = __ArrayInstPtr(st_actionVector)->a_element[actionIndex-1];
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   189
	    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   190
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   191
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   192
    if (st_callBack == nil) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   193
	if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   194
	    fprintf(stderr, "ExternalFunctionCallback(wrapper): ignored nil callback\n");
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   195
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   196
	*(void **)resp = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   197
	return;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   198
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   199
20291
869e75a7f66a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20123
diff changeset
   200
    if (@global(ExternalFunctionCallback:Verbose) == true) {
869e75a7f66a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20123
diff changeset
   201
	fprintf(stderr, "ExternalFunctionCallback(wrapper): sending value: to %"_lx_"..\n", (INT)st_callBack);
869e75a7f66a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20123
diff changeset
   202
    }
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   203
    {
20291
869e75a7f66a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20123
diff changeset
   204
	static struct inlineCache value_snd = __DUMMYILC1((@line+1));
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   205
	st_result = _SEND1(st_callBack, @symbol(callFromCWith:), nil, &value_snd, st_argVector);
20291
869e75a7f66a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20123
diff changeset
   206
    }
869e75a7f66a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20123
diff changeset
   207
    if (@global(ExternalFunctionCallback:Verbose) == true) {
869e75a7f66a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20123
diff changeset
   208
	fprintf(stderr, "ExternalFunctionCallback(wrapper): result is %"_lx_"\n", (INT)st_result);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   209
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   210
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   211
    retType = cif->rtype;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   212
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   213
    if (st_result == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   214
	sintResult = uintResult = 1;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   215
    } else if (st_result == false) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   216
	sintResult = uintResult = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   217
    } else if (st_result == nil) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   218
	sintResult = uintResult = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   219
    } else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   220
	sintResult = __signedLongIntVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   221
	uintResult = __unsignedLongIntVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   222
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   223
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   224
    if (retType == __get_ffi_type_sint()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   225
	*(int *)resp = sintResult;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   226
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   227
    } else if (retType == __get_ffi_type_uint()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   228
	*(int *)resp = uintResult;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   229
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   230
    } else if (retType == __get_ffi_type_uint8()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   231
	*(unsigned char *)resp = uintResult;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   232
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   233
    } else if (retType == __get_ffi_type_sint8()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   234
	*(char *)resp = sintResult;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   235
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   236
    } else if (retType == __get_ffi_type_uint16()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   237
	*(unsigned short *)resp = uintResult;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   238
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   239
    } else if (retType == __get_ffi_type_sint16()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   240
	*(short *)resp = sintResult;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   241
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   242
    } else if (retType == __get_ffi_type_uint32()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   243
	*(int *)resp = uintResult;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   244
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   245
    } else if (retType == __get_ffi_type_sint32()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   246
	*(int *)resp = sintResult;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   247
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   248
    } else if (retType == __get_ffi_type_float()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   249
	if (__isFloat(st_result)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   250
	    *(float *)resp = (float)__floatVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   251
	} else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   252
	    if (__isShortFloat(st_result)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   253
		*(float *)resp = __shortFloatVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   254
	    } else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   255
		*(float *)resp = (float)sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   256
	    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   257
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   258
    } else if (retType == __get_ffi_type_double()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   259
	if (__isFloat(st_result)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   260
	    *(double *)resp = __floatVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   261
	} else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   262
	    if (__isShortFloat(st_result)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   263
		*(double *)resp = (double)__shortFloatVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   264
	    } else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   265
		*(double *)resp = (double)sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   266
	    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   267
	}
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   268
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   269
    } else if (retType == __get_ffi_type_pointer()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   270
	*(void **)resp = (void *)__externalAddressVal( st_result );
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   271
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   272
    } else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   273
	if (@global(ExternalFunctionCallback:Verbose) == true) {
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   274
	    fprintf(stderr, "ExternalFunctionCallback(wrapper): invalid result type %"_ld_"\n", (INT)retType);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   275
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   276
	*(void **)resp = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   277
    }
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
void
20307
678da26adf03 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20291
diff changeset
   281
ExternalFunctionCallback__test_call_closure(INTLFUNC f)
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
{
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   283
    INT result = 0;
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   285
    printf("doCall_closure: calling closure %"_lx_"(123)...\n", (INT)f);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    result = (*f)(123);
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   287
    printf("doCall_closure: back; result is %"_lx_"...\n", (INT)result);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
}
10617
a9dc57b77568 Compile even if !defined(HAVE_FFI)
Stefan Vogel <sv@exept.de>
parents: 10616
diff changeset
   289
#endif /* HAVE_FFI */
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
%}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   294
!ExternalFunctionCallback class methodsFor:'documentation'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   295
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   296
copyright
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   297
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   298
 COPYRIGHT (c) 2007 by eXept Software AG
10610
44dcb48a04c7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10609
diff changeset
   299
	      All Rights Reserved
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   300
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   301
 This software is furnished under a license and may be used
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   302
 only in accordance with the terms of that license and with the
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   303
 inclusion of the above copyright notice.   This software may not
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   304
 be provided or otherwise made available to, or used by, any
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   305
 other person.  No title to or ownership of the software is
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   306
 hereby transferred.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   307
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   308
!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   309
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   310
documentation
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   311
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   312
    an ExternalFunctionCallback wraps a block into a C-callable function;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   313
    i.e. it creates a closure, which as seen from C-code looks like an ordinary
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   314
    function pointer, but when invoked evaluates a smalltalk block.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   315
10611
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   316
    A callback is created with:
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   317
       cb := ExternalFunctionCallback new.
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   318
    the arguments (as passed from the C-caller into ST)
10611
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   319
    and the returnValue (from ST to the C-caller) are specified with:
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   320
       cb returnType:#bool argumentTypes:#(uint).
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   321
    Then, the code is generated with:
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   322
       cb generateClosure.
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   323
20123
0b0dd12ddb6d #OTHER by mawalch
mawalch
parents: 14754
diff changeset
   324
    After that, the callBack-functions address can be acquired with:
10611
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   325
       cb address.  'can be passed to C'.
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   326
    and handed out to C. (you can also hand out the callBack directly - as it is a subclass of
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   327
    ExternalBytes.
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   328
    The actual action of the callback can be changed (at any time later) with:
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   329
	cb action:[:args | Transcript showCR:args. true].
10611
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   330
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   331
    Eventually, the callback MUST be released:
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   332
	cb release.
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   333
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   334
    [supported returnTypes:]
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   335
	int
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   336
	uint
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   337
	uint8
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   338
	uint16
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   339
	uint32
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   340
	uint64
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   341
	sint
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   342
	sint8
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   343
	sint16
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   344
	sint32
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   345
	sint64
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   346
	long    system dependent sint32 or sint64
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   347
	ulong   system dependent uint32 or uint64
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   348
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   349
	bool
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   350
	float
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   351
	double
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   352
	void
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   353
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   354
	pointer,
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   355
	handle,
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   356
	charPointer,
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   357
	bytePointer,
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   358
	floatPointer
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   359
	doublePointer
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   360
	intPointer
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   361
	shortPointer
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   362
	wcharPointer
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   363
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   364
	<name of subclass of ExternalAddress>
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   365
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   366
    [supported argumentTypes:]
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   367
	handle
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   368
	pointer
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   369
	voidPointer
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   370
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   371
	long, ulong - system dependent
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   372
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   373
	int,
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   374
	uint8, sint8, uint16, sint16,
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   375
	uint32, sint32,
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   376
	float, double
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   377
	void
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   378
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   379
	charPointer, floatPointer, doublePointer,
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   380
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   381
	<name of subclass of ExternalAddress>
10611
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   382
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   383
    [author:]
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   384
	Claus Gittinger
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   385
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   386
!
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
examples
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    |cb|
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
    cb := ExternalFunctionCallback new.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    cb returnType:#bool argumentTypes:#(uint).
10620
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   394
    cb beCallTypeWINAPI.
10611
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   395
    cb generateClosure.
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   396
    cb action:[:args | Transcript showCR:args. true].
22547
9f6dcf5af82b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22546
diff changeset
   397
    cb code.  'address can be passed to C'.
9f6dcf5af82b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22546
diff changeset
   398
    Transcript showCR:cb code.
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   399
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   400
    ExternalFunctionCallback testCall:cb withArgument:123.
10611
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   401
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   402
    cb action:[:args | Transcript show:'hello '; showCR:args. true].
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   403
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   404
    ExternalFunctionCallback testCall:cb withArgument:123.
0ca921c0a7a1 more documentation; removed leftover halt.
Claus Gittinger <cg@exept.de>
parents: 10610
diff changeset
   405
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   406
    cb release
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
13867
ed5b71c6e589 category of:
Claus Gittinger <cg@exept.de>
parents: 13574
diff changeset
   410
!ExternalFunctionCallback class methodsFor:'instance creation'!
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   411
11851
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   412
callbackFor:aBlock returnType:returnType argumentTypes:argumentTypes
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   413
    "generate a callback for the ErrorCallbackProc signature:
25087
6be980cf75e3 gcc fixes
Claus Gittinger <cg@exept.de>
parents: 24756
diff changeset
   414
	ErrorCallbackProc(HWND hWnd, int nErrID, LPTSTR lpErrorText)
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   415
     which, can be given to an external API call and which invokes the
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   416
     three arg block when clled.
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   417
     Do not forget to eventually release the callback to avoid a memory leak."
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   418
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   419
    |cb|
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   420
24756
fca38270ff24 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 24338
diff changeset
   421
    self assert:(aBlock argumentCount == argumentTypes size).
11851
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   422
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   423
    cb := ExternalFunctionCallback new.
11851
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   424
    cb returnType:returnType argumentTypes:argumentTypes.
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   425
    cb beCallTypeWINAPI.
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   426
    cb generateClosure.
11851
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   427
    cb action:aBlock.
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   428
    "/ ^ cb code.  'can be passed to C'.
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   429
    ^ cb
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   430
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   431
    "
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   432
     |cb|
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   433
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   434
     cb := self errorCallbackProcFor:[:a1 :a2 :a3 | Transcript showCR:('%1 %2 %3' bindWith:a1 with:a2 with:a3)].
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   435
     ExternalFunctionCallback testCall:cb withArguments:#(#[1 2 3] 456 'hello').
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   436
     cb release
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   437
    "
11851
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   438
!
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   439
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   440
errorCallbackProcFor:aThreeArgBlock
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   441
    "generate a callback for the ErrorCallbackProc signature:
13574
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   442
	ErrorCallbackProc(HWND hWnd, int nErrID, LPTSTR lpErrorText)
11851
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   443
     which, can be given to an external API call and which invokes the
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   444
     three arg block when clled.
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   445
     Do not forget to eventually release the callback to avoid a memory leak."
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   446
13574
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   447
    ^ self
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   448
	callbackFor:aThreeArgBlock
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   449
	returnType:#long
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   450
	argumentTypes:#(handle int charPointer)
11851
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   451
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   452
    "
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   453
     |cb|
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   454
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   455
     cb := self errorCallbackProcFor:[:a1 :a2 :a3 | Transcript showCR:('%1 %2 %3' bindWith:a1 with:a2 with:a3)].
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   456
     ExternalFunctionCallback testCall:cb withArguments:#(#[1 2 3] 456 'hello').
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   457
     cb release
adda395bb92e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11849
diff changeset
   458
    "
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   459
! !
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   460
10620
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   461
!ExternalFunctionCallback class methodsFor:'constants'!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   462
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   463
callTypeAPI
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   464
    ^ ExternalLibraryFunction callTypeAPI
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   465
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   466
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   467
callTypeC
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   468
    ^ ExternalLibraryFunction callTypeC
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   469
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   470
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   471
callTypeCDecl
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   472
    ^ ExternalLibraryFunction callTypeCDecl
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   473
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   474
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   475
callTypeMASK
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   476
    ^ ExternalLibraryFunction callTypeMASK
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   477
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   478
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   479
callTypeOLE
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   480
    ^ ExternalLibraryFunction callTypeOLE
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   481
!
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   482
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   483
callTypeUNIX64
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   484
    ^ ExternalLibraryFunction callTypeUNIX64
10620
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   485
! !
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   486
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   487
!ExternalFunctionCallback class methodsFor:'helpers'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   488
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   489
closureIndexFor:aCallBack
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   490
    CallBackRegistry isNil ifTrue:[
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   491
	CallBackRegistry := WeakArray with:aCallBack.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   492
    ] ifFalse:[
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   493
	CallBackRegistry := CallBackRegistry copyWith:aCallBack.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   494
    ].
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   495
    ^ CallBackRegistry size.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   496
!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   497
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   498
testCall:aCallback withArgument:arg
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   499
    "a simple test, if I can be called"
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   500
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   501
    self testCall:aCallback withArguments:(Array with:arg)
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   502
!
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   503
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   504
testCall:aCallback withArguments:args
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   505
    "a simple test, if I can be called"
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   506
%{
13574
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   507
#   define MAX_CALLBACK_ARGS 5
20307
678da26adf03 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20291
diff changeset
   508
    INTLFUNC f = __externalAddressVal(aCallback);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   509
    INT result;
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   510
    int i;
13574
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   511
    void *c_args[MAX_CALLBACK_ARGS];
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   512
21623
0fd2de531f9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20307
diff changeset
   513
    if (! __isArrayLike(args))
13574
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   514
	goto badArg;
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   515
    if (__arraySize(args) > MAX_CALLBACK_ARGS)
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   516
	goto badArg;
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   517
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   518
    for (i=0; i < __arraySize(args); i++) {
13574
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   519
	OBJ arg = __ArrayInstPtr(args)->a_element[i];
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   520
13574
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   521
	if (__isSmallInteger(arg)) {
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   522
	    c_args[i] = (void *)(__intVal(arg));
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   523
	} else if (arg == true) {
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   524
	    c_args[i] = (void *)1;
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   525
	} else if (arg == false) {
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   526
	    c_args[i] = (void *)0;
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   527
	} else if (__isStringLike(arg)) {
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   528
	    c_args[i] = (void *)__stringVal(arg);
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   529
	} else if (__isByteArrayLike(arg)) {
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   530
	    c_args[i] = (void *)__byteArrayVal(arg);
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   531
	} else
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   532
	    goto badArg;
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   533
    }
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   534
    fprintf(stderr, "ExternalFunctionCallback: calling callBack %"_lx_"(%"_lx_", %"_lx_")\n", (INT)f, (INT)(c_args[0]), (INT)(c_args[1]));
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   535
    result = (*f)(c_args[0], c_args[1], c_args[2], c_args[3], c_args[4]);
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   536
    fprintf(stderr, "ExternalFunctionCallback: result from callBack is %"_lx_"\n", (INT)result);
11849
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   537
    RETURN(true);
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   538
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   539
badArg: ;
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   540
%}.
9df0a07fbd13 fixed #release
Claus Gittinger <cg@exept.de>
parents: 10722
diff changeset
   541
    self error:'bad argument'
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   542
! !
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   543
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
!ExternalFunctionCallback methodsFor:'accessing'!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   546
action:aBlock
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   547
    "set the action-block, to be evaluated when C calls me.
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   548
     The C-arguments will be passed as arguments to the block.
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   549
     The value returned by the block will be returned to the C-caller."
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   550
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   551
    action := aBlock.
10620
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   552
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   553
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   554
beCallTypeAPI
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   555
    flags := (flags ? 0) bitOr: (self class callTypeAPI).
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   556
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   557
    "Created: / 01-08-2006 / 15:12:40 / cg"
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   558
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   559
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   560
beCallTypeC
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   561
    flags := (flags ? 0) bitOr: (self class callTypeC).
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   562
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   563
    "Created: / 01-08-2006 / 15:12:40 / cg"
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   564
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   565
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   566
beCallTypeOLE
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   567
    flags := (flags ? 0) bitOr: (self class callTypeOLE).
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   568
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   569
    "Created: / 01-08-2006 / 15:12:40 / cg"
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   570
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   571
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   572
beCallTypeUNIX64
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   573
    flags := (flags ? 0) bitOr: (self class callTypeUNIX64).
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   574
!
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   575
10620
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   576
beCallTypeWINAPI
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   577
    self beCallTypeAPI
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   578
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   579
    "Modified: / 01-08-2006 / 15:14:02 / cg"
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   580
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   581
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   582
callTypeNumber
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   583
    ^ (flags ? 0) bitAnd: (self class callTypeMASK)
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   584
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   585
    "Created: / 01-08-2006 / 15:12:10 / cg"
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   586
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   587
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   588
isCallTypeAPI
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   589
    ^ ((flags ? 0) bitAnd: (self class callTypeMASK)) == (self class callTypeAPI)
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   590
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   591
    "Created: / 01-08-2006 / 15:21:16 / cg"
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   592
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   593
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   594
isCallTypeC
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   595
    ^ ((flags ? 0) bitAnd: (self class callTypeMASK)) == (self class callTypeC)
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   596
!
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   597
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   598
isCallTypeOLE
c30c866d4b3d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10618
diff changeset
   599
    ^ ((flags ? 0) bitAnd: (self class callTypeMASK)) == (self class callTypeOLE)
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   600
! !
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   601
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   602
!ExternalFunctionCallback methodsFor:'callback'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   603
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   604
callFromCWith:argList
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   605
    "invoked by the C-code, to which we have given out the code-ptr.
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   606
     Because this is evaluated from C, we probably should not block or abort or do
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   607
     any other things which confuse C
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   608
     (its probably a good idea to write something into a queue here)"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   610
    action notNil ifTrue:[
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   611
	^ action valueWithArguments:argList
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   612
    ].
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   613
    ^ nil
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
!ExternalFunctionCallback methodsFor:'generation'!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   618
code
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   619
    self hasCode ifFalse:[
14626
7dc0ee28824f 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 13868
diff changeset
   620
	self generateClosure
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
    ].
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   622
    ^ super code
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
    "Created: / 11-06-2007 / 15:53:00 / cg"
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   625
!
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   626
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   627
getCode
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   628
    ^ super code
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   629
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   630
    "Created: / 03-03-2017 / 13:55:00 / cg"
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
!ExternalFunctionCallback methodsFor:'private-accessing'!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
returnType:aReturnType argumentTypes:argTypes
10722
ab6fbe61f116 changed #returnType:argumentTypes:
Claus Gittinger <cg@exept.de>
parents: 10621
diff changeset
   636
    "see generateClosure for valid return types"
ab6fbe61f116 changed #returnType:argumentTypes:
Claus Gittinger <cg@exept.de>
parents: 10621
diff changeset
   637
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
    returnType := aReturnType.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
    argumentTypes := argTypes.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
    "Created: / 11-06-2007 / 15:52:01 / cg"
10722
ab6fbe61f116 changed #returnType:argumentTypes:
Claus Gittinger <cg@exept.de>
parents: 10621
diff changeset
   642
    "Modified: / 19-09-2007 / 18:14:59 / cg"
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
!ExternalFunctionCallback methodsFor:'private-generation'!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
generateClosure
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   648
    |argTypeSymbols returnTypeSymbol failureCode failureInfo
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   649
     callTypeNumber returnValueClass argValueClass callBackIndex|
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   650
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   651
    argTypeSymbols := argumentTypes.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
    returnTypeSymbol := returnType.
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   653
    callBackIndex := self class closureIndexFor:self.
10621
5e6966b208f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10620
diff changeset
   654
    callTypeNumber := self callTypeNumber.
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   655
%{
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
#ifdef HAVE_FFI
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   657
    ffi_cif *pcif;
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   658
    ffi_type *__returnType = NULL;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
    static int null = 0;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
    int i;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
    ffi_abi __callType = FFI_DEFAULT_ABI;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
    int __numArgsWanted;
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   663
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   664
    struct closurePlusCIF {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   665
	ffi_closure closure;
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   666
	ffi_cif cif;
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   667
	ffi_type *argTypes[MAX_ARGS];
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   668
    } *closurePlusCIFp;
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
    ffi_closure *pcl;
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   670
    ffi_cif *cif;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   671
    ffi_type **argTypePtrs;
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   672
22548
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   673
    void* codePtr;
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   674
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   675
# ifndef NEW_FFI
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   676
    closurePlusCIFp = (struct closurePlusCIF *) malloc(sizeof(struct closurePlusCIF));
22548
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   677
    codePtr = &(closurePlusCIFp->closure);
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   678
    DEBUGCODE_IF( @global(Verbose), {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   679
	printf("old ffi\n");
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   680
    })
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   681
# else
22548
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   682
    closurePlusCIFp = (struct closurePlusCIF *) ffi_closure_alloc(sizeof(struct closurePlusCIF), &codePtr);
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   683
    DEBUGCODE_IF( @global(Verbose), {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   684
	printf("new ffi\n");
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   685
    })
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   686
# endif
22548
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   687
    pcl = &(closurePlusCIFp->closure);
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   688
    cif = &(closurePlusCIFp->cif);
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   689
    argTypePtrs = closurePlusCIFp->argTypes;
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   690
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   691
#   define __FAIL__(fcode) \
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   692
	{ \
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   693
	    failureCode = fcode; ffi_closure_free(closurePlusCIFp); goto getOutOfHere; \
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   694
	}
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   695
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
    if (argTypeSymbols == nil) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   697
	__numArgsWanted = 0;
21623
0fd2de531f9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20307
diff changeset
   698
    } else if (__isArrayLike(argTypeSymbols)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   699
	__numArgsWanted = __arraySize(argTypeSymbols);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
    } else {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   701
	__FAIL__(@symbol(BadArgumentTypeVector))
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
    if (__numArgsWanted > MAX_ARGS) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   705
	__FAIL__(@symbol(TooManyArguments))
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
    /*
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   709
     * validate the return type
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
     */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
    if (returnTypeSymbol == @symbol(voidPointer)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   712
	returnTypeSymbol = @symbol(handle);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
    if (returnTypeSymbol == @symbol(int)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   716
	__returnType = __get_ffi_type_sint();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
    } else if (returnTypeSymbol == @symbol(uint)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   718
	__returnType = __get_ffi_type_uint();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
    } else if (returnTypeSymbol == @symbol(uint8)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   720
	__returnType = __get_ffi_type_uint8();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
    } else if (returnTypeSymbol == @symbol(uint16)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   722
	__returnType = __get_ffi_type_uint16();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
    } else if (returnTypeSymbol == @symbol(uint32)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   724
	__returnType = __get_ffi_type_uint32();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
    } else if (returnTypeSymbol == @symbol(uint64)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   726
	__returnType = __get_ffi_type_uint64();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
    } else if (returnTypeSymbol == @symbol(sint)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   729
	__returnType = __get_ffi_type_sint();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
    } else if (returnTypeSymbol == @symbol(sint8)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   731
	__returnType = __get_ffi_type_sint8();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
    } else if (returnTypeSymbol == @symbol(sint16)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   733
	__returnType = __get_ffi_type_sint16();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
    } else if (returnTypeSymbol == @symbol(sint32)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   735
	__returnType = __get_ffi_type_sint32();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
    } else if (returnTypeSymbol == @symbol(sint64)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   737
	__returnType = __get_ffi_type_sint64();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
    } else if (returnTypeSymbol == @symbol(long)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   740
	if (sizeof(long) == 4) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   741
	   returnTypeSymbol = @symbol(sint32);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   742
	   __returnType = __get_ffi_type_sint32();
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   743
	} else if (sizeof(long) == 8) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   744
	   returnTypeSymbol = @symbol(sint64);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   745
	   __returnType = __get_ffi_type_sint64();
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   746
	} else {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   747
	    __FAIL__(@symbol(UnknownReturnType))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   748
	}
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
    } else if (returnTypeSymbol == @symbol(ulong)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   751
	if (sizeof(long) == 4) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   752
	   returnTypeSymbol = @symbol(uint32);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   753
	   __returnType = __get_ffi_type_uint32();
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   754
	}else if (sizeof(long) == 8) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   755
	   returnTypeSymbol = @symbol(uint64);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   756
	   __returnType = __get_ffi_type_uint64();
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   757
	} else {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   758
	    __FAIL__(@symbol(UnknownReturnType))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   759
	}
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
    } else if (returnTypeSymbol == @symbol(bool)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   762
	__returnType = __get_ffi_type_uint();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
    } else if (returnTypeSymbol == @symbol(float)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   765
	__returnType = __get_ffi_type_float();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
    } else if (returnTypeSymbol == @symbol(double)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   767
	__returnType = __get_ffi_type_double();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
    } else if (returnTypeSymbol == @symbol(void)) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   770
	__returnType = __get_ffi_type_void();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
    } else if ((returnTypeSymbol == @symbol(pointer))
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   772
	       || (returnTypeSymbol == @symbol(handle))
24071
d9537fdc5b9f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 24070
diff changeset
   773
	       || (returnTypeSymbol == @symbol(voidPointer))
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   774
	       || (returnTypeSymbol == @symbol(charPointer))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   775
	       || (returnTypeSymbol == @symbol(bytePointer))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   776
	       || (returnTypeSymbol == @symbol(floatPointer))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   777
	       || (returnTypeSymbol == @symbol(doublePointer))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   778
	       || (returnTypeSymbol == @symbol(intPointer))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   779
	       || (returnTypeSymbol == @symbol(shortPointer))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   780
	       || (returnTypeSymbol == @symbol(wcharPointer))) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   781
	__returnType = __get_ffi_type_pointer();
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
    } else {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   783
	if (__isSymbol(returnTypeSymbol)
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   784
	 && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   785
	    if (! __isBehaviorLike(returnValueClass)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   786
		__FAIL__(@symbol(NonBehaviorReturnType))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   787
	    }
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   788
	    if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   789
		__FAIL__(@symbol(NonExternalAddressReturnType))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   790
	    }
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   791
	    __returnType = __get_ffi_type_pointer();
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   792
	    returnTypeSymbol = @symbol(pointer);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   793
	} else {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   794
	    __FAIL__(@symbol(UnknownReturnType))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   795
	}
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
    }
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   797
    DEBUGCODE_IF( @global(Verbose), {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   798
	printf("__returnType: %p\n", __returnType);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   799
    })
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
    /*
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
     * setup arg-buffers
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
     */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
    for (i=0; i<__numArgsWanted; i++) {
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   805
	ffi_type *thisType;
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   806
	void *argValuePtr;
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   807
	OBJ typeSymbol;
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   809
	failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   811
	typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   813
	if (typeSymbol == @symbol(handle)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   814
	    typeSymbol = @symbol(pointer);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   815
	} else if (typeSymbol == @symbol(voidPointer)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   816
	    typeSymbol = @symbol(pointer);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   817
	}
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   819
	if (typeSymbol == @symbol(long)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   820
	    if (sizeof(long) == sizeof(int)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   821
		typeSymbol = @symbol(sint);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   822
	    } else {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   823
		if (sizeof(long) == 4) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   824
		    typeSymbol = @symbol(sint32);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   825
		} else if (sizeof(long) == 8) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   826
		    typeSymbol = @symbol(sint64);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   827
		}
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   828
	    }
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   829
	}
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   830
	if (typeSymbol == @symbol(ulong)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   831
	    if (sizeof(unsigned long) == sizeof(unsigned int)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   832
		typeSymbol = @symbol(uint);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   833
	    } else {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   834
		if (sizeof(long) == 4) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   835
		    typeSymbol = @symbol(uint32);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   836
		} else if (sizeof(long) == 8) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   837
		    typeSymbol = @symbol(uint64);
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   838
		}
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   839
	    }
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   840
	}
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   842
	if (typeSymbol == @symbol(int)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   843
	    thisType = __get_ffi_type_sint();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   844
	} else if (typeSymbol == @symbol(uint)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   845
	    thisType = __get_ffi_type_uint();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   846
	} else if (typeSymbol == @symbol(uint8)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   847
	    thisType = __get_ffi_type_uint8();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   848
	} else if (typeSymbol == @symbol(sint8)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   849
	    thisType = __get_ffi_type_sint8();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   850
	} else if (typeSymbol == @symbol(uint16)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   851
	    thisType = __get_ffi_type_uint16();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   852
	} else if (typeSymbol == @symbol(sint16)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   853
	    thisType = __get_ffi_type_sint16();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   854
	} else if (typeSymbol == @symbol(uint32)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   855
	    thisType = __get_ffi_type_uint32();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   856
	} else if (typeSymbol == @symbol(sint32)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   857
	    thisType = __get_ffi_type_sint32();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   858
	} else if (typeSymbol == @symbol(uint64)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   859
	    thisType = __get_ffi_type_uint64();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   860
	} else if (typeSymbol == @symbol(sint64)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   861
	    thisType = __get_ffi_type_sint64();
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   862
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   863
	} else if (typeSymbol == @symbol(float)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   864
	    thisType = __get_ffi_type_float();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   865
	} else if (typeSymbol == @symbol(double)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   866
	    thisType = __get_ffi_type_double();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   867
	} else if (typeSymbol == @symbol(void)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   868
	    thisType = __get_ffi_type_void();
24071
d9537fdc5b9f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 24070
diff changeset
   869
	} else if (typeSymbol == @symbol(voidPointer)) {
d9537fdc5b9f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 24070
diff changeset
   870
	    thisType = __get_ffi_type_pointer();
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   871
	} else if (typeSymbol == @symbol(charPointer)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   872
	    thisType = __get_ffi_type_pointer();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   873
	} else if (typeSymbol == @symbol(floatPointer)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   874
	    thisType = __get_ffi_type_pointer();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   875
	} else if (typeSymbol == @symbol(doublePointer)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   876
	    thisType = __get_ffi_type_pointer();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   877
	} else if (typeSymbol == @symbol(intPointer)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   878
	    thisType = __get_ffi_type_pointer();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   879
	} else if (typeSymbol == @symbol(bytePointer)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   880
	    thisType = __get_ffi_type_pointer();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   881
	} else if (typeSymbol == @symbol(shortPointer)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   882
	    thisType = __get_ffi_type_pointer();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   883
	} else if (typeSymbol == @symbol(wcharPointer)) {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   884
	    thisType = __get_ffi_type_pointer();
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   885
	} else if (typeSymbol == @symbol(pointer)) {
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   886
commonPointerTypeArg: ;
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   887
	    thisType = __get_ffi_type_pointer();
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   888
	} else if (typeSymbol == @symbol(bool)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   889
	    thisType = __get_ffi_type_uint();
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   890
	} else if (__isSymbol(typeSymbol)
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   891
	     && ((argValueClass = __GLOBAL_GET(typeSymbol)) != nil)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   892
	    if (! __isBehaviorLike(argValueClass)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   893
		__FAIL__(@symbol(NonBehaviorArgumentType))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   894
	    }
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   895
	    if (! __qIsSubclassOfExternalAddress(argValueClass)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   896
		__FAIL__(@symbol(NonExternalAddressArgumentType))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   897
	    }
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   898
	    goto commonPointerTypeArg; /* sorry */
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   899
	} else {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   900
	    __FAIL__(@symbol(UnknownArgumentType))
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   901
	}
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   902
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   903
	argTypePtrs[i] = thisType;
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   904
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   905
    failureInfo = nil;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   906
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   907
    DEBUGCODE_IF( @global(Verbose), {
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   908
	printf("got argTypes\n");
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   909
    })
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   910
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   911
    __callType = FFI_DEFAULT_ABI;
22546
4f467704d94e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22545
diff changeset
   912
#ifndef __osx__
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   913
    if (callTypeNumber != nil) {
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   914
# ifdef CALLTYPE_FFI_STDCALL
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   915
	if (callTypeNumber == @global(ExternalLibraryFunction:CALLTYPE_API)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   916
	    __callType = CALLTYPE_FFI_STDCALL;
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   917
	}
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   918
# endif
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   919
# ifdef CALLTYPE_FFI_V8
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   920
	if (callTypeNumber == @global(ExternalLibraryFunction:CALLTYPE_V8)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   921
	    __callType = CALLTYPE_FFI_V8;
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   922
	}
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   923
# endif
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   924
# ifdef CALLTYPE_FFI_V9
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   925
	if (callTypeNumber == @global(ExternalLibraryFunction:CALLTYPE_V9)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   926
	    __callType = CALLTYPE_FFI_V9;
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   927
	}
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   928
# endif
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   929
# ifdef CALLTYPE_FFI_UNIX64
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   930
	if (callTypeNumber == @global(ExternalLibraryFunction:CALLTYPE_UNIX64)) {
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   931
	    __callType = CALLTYPE_FFI_UNIX64;
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   932
	}
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   933
# endif
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   934
    }
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   935
#endif
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   936
    if (@global(ExternalFunctionCallback:Verbose) == true) {
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   937
	printf("prep_cif callType:%d cif-ptr=%p\n", __callType, (void*)cif);
22545
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   938
    }
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   939
d5b6e2585870 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 21623
diff changeset
   940
    if (ffi_prep_cif(cif, __callType, __numArgsWanted, __returnType, argTypePtrs) != FFI_OK) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   941
	__FAIL__(@symbol(FFIPrepareFailed))
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   942
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   943
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   944
    if (@global(ExternalFunctionCallback:Verbose) == true) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   945
	printf("closure is 0x%"_lx_" (%d bytes)\n", (INT)pcl, (int)sizeof(ffi_closure));
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   946
	printf("index is %"_ld_"\n", __intVal(callBackIndex));
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   947
    }
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   948
#ifndef NEW_FFI
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   949
    if (ffi_prep_closure(pcl, cif, ExternalFunctionCallback__closure_wrapper_fn, (void *)(__intVal(callBackIndex)) /* userdata */) != FFI_OK) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   950
	__FAIL__(@symbol(FFIPrepareClosureFailed))
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   951
    }
22548
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   952
#else
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   953
    if (ffi_prep_closure_loc(pcl, cif, ExternalFunctionCallback__closure_wrapper_fn, (void *)(__intVal(callBackIndex)), codePtr) != FFI_OK) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   954
	__FAIL__(@symbol(FFIPrepareClosureFailed))
22548
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   955
    }
b21c9fcf892d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22547
diff changeset
   956
#endif
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   957
    if (@global(ExternalFunctionCallback:Verbose) == true) {
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   958
	printf("pcl->cif is 0x%"_lx_"\n", (INT)(pcl->cif));
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   959
	printf("pcl->fun is 0x%"_lx_"\n", (INT)(pcl->fun));
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   960
	printf("pcl code at %"_lx_" is:\n", (INT)pcl);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   961
	printf("  %02x %02x %02x %02x\n", ((unsigned char *)pcl)[0],((unsigned char *)pcl)[1],((unsigned char *)pcl)[2],((unsigned char *)pcl)[3]);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   962
	printf("  %02x %02x %02x %02x\n", ((unsigned char *)pcl)[4],((unsigned char *)pcl)[5],((unsigned char *)pcl)[6],((unsigned char *)pcl)[7]);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   963
	printf("  %02x %02x %02x %02x\n", ((unsigned char *)pcl)[8],((unsigned char *)pcl)[9],((unsigned char *)pcl)[10],((unsigned char *)pcl)[11]);
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   964
	printf("  %02x %02x %02x %02x\n", ((unsigned char *)pcl)[12],((unsigned char *)pcl)[13],((unsigned char *)pcl)[14],((unsigned char *)pcl)[15]);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   965
    }
14659
410089913ca1 allow use of the standard (system) ffi
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   966
    __INST(code_) = (OBJ)pcl;
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   967
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   968
#if 0
20307
678da26adf03 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 20291
diff changeset
   969
    ExternalFunctionCallback__test_call_closure((INTLFUNC)pcl);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   970
#endif
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   971
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   972
#else /* no FFI support */
10618
343d0bf4646a Now can compile even #ifndef HAVE_FFI
Stefan Vogel <sv@exept.de>
parents: 10617
diff changeset
   973
    failureCode = @symbol(FFINotSupported);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   974
#endif /* HAVE_FFI */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   975
getOutOfHere: ;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   976
%}.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   977
    failureCode notNil ifTrue:[
22552
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   978
	self primitiveFailed:(failureCode->failureInfo).   "see failureCode and failureInfo for details"
b14b3b47197e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22551
diff changeset
   979
	^ nil
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   980
    ].
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   981
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   982
    "Created: / 11-06-2007 / 21:53:02 / cg"
24068
3add4c42c177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 22552
diff changeset
   983
    "Modified: / 12-04-2019 / 11:26:53 / Claus Gittinger"
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   984
! !
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   985
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   986
!ExternalFunctionCallback methodsFor:'private-releasing'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   987
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   988
release
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   989
    |idx|
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   990
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   991
    idx := CallBackRegistry identityIndexOf:self.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   992
    CallBackRegistry at:idx put:nil.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   993
%{
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   994
    void *pcl = (void *)__INST(code_);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   995
10613
12d012eeb755 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10611
diff changeset
   996
    __INST(code_) = 0;
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   997
    if (pcl) {
22551
cb0a07454324 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22548
diff changeset
   998
	ffi_closure_free(pcl);
13574
58e5a69da7aa MAX_ARGS confusion
Claus Gittinger <cg@exept.de>
parents: 12475
diff changeset
   999
	RETURN(self);
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1000
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1001
%}.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1002
    self invalidateReference.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1003
! !
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1004
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1005
!ExternalFunctionCallback class methodsFor:'documentation'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1006
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1007
version
20123
0b0dd12ddb6d #OTHER by mawalch
mawalch
parents: 14754
diff changeset
  1008
    ^ '$Header$'
12461
8dc128473734 __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 11851
diff changeset
  1009
!
8dc128473734 __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 11851
diff changeset
  1010
8dc128473734 __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 11851
diff changeset
  1011
version_CVS
20123
0b0dd12ddb6d #OTHER by mawalch
mawalch
parents: 14754
diff changeset
  1012
    ^ '$Header$'
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
  1013
! !