ExternalFunctionCallback.st
author Claus Gittinger <cg@exept.de>
Wed, 13 Jun 2007 23:13:25 +0200
changeset 10609 fa629d528330
parent 10607 9f42b83e653a
child 10610 44dcb48a04c7
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     1
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     2
 COPYRIGHT (c) 2007 by eXept Software AG
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     3
              All Rights Reserved
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     4
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     5
 This software is furnished under a license and may be used
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     6
 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
     7
 inclusion of the above copyright notice.   This software may not
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     8
 be provided or otherwise made available to, or used by, any
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
     9
 other person.  No title to or ownership of the software is
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    10
 hereby transferred.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    11
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    12
"{ Package: 'stx:libbasic' }"
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
ExternalBytes subclass:#ExternalFunctionCallback
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:'returnType argumentTypes action'
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    16
	classVariableNames:'CallBackRegistry Verbose'
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	category:'System-Support'
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!ExternalFunctionCallback primitiveDefinitions!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
%{
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
#ifdef HAVE_FFI
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
# include <ffi.h>
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
# define MAX_ARGS    128
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
extern ffi_type *__get_ffi_type_sint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
extern ffi_type *__get_ffi_type_sint8();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
extern ffi_type *__get_ffi_type_sint16();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
extern ffi_type *__get_ffi_type_sint32();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
extern ffi_type *__get_ffi_type_sint64();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
extern ffi_type *__get_ffi_type_uint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
extern ffi_type *__get_ffi_type_uint8();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
extern ffi_type *__get_ffi_type_uint16();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
extern ffi_type *__get_ffi_type_uint32();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
extern ffi_type *__get_ffi_type_uint64();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
extern ffi_type *__get_ffi_type_float();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
extern ffi_type *__get_ffi_type_double();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
extern ffi_type *__get_ffi_type_void();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
extern ffi_type *__get_ffi_type_pointer();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
#endif
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
%}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
!ExternalFunctionCallback primitiveFunctions!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
%{
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    51
#define xxVERBOSE
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
void
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    54
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
    55
{
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    56
    int actionIndex = (int)userdata;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    57
    int i;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    58
    OBJ st_argVector = nil;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    59
    OBJ st_actionVector, st_callBack = nil, st_result;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    60
    OBJFUNC code;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    61
    ffi_type *retType;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    62
    INT sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    63
    unsigned INT uintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    64
    float floatResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    65
    double doubleResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    66
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    67
    if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    68
	fprintf(stderr, "ExternalFunctionCallback(wrapper): actionIndex=%d resp*=%x\n", actionIndex, resp);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    69
	fflush(stderr);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    70
	fprintf(stderr, "ExternalFunctionCallback(wrapper): nargs=%d\n", cif->nargs);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    71
	fflush(stderr);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    72
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    73
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    74
    st_argVector = __ARRAY_NEW_INT(cif->nargs);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    75
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    76
    for (i=0; i<cif->nargs; i++) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    77
	ffi_type *argType;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    78
	OBJ st_arg = nil;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    79
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    80
	__PROTECT__(st_argVector);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    81
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    82
	argType = cif->arg_types[i];
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    83
	if (argType == __get_ffi_type_sint()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    84
	    st_arg = __MKINT( *(int *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    85
	} else if (argType == __get_ffi_type_uint()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    86
	    st_arg = __MKUINT( *(unsigned int *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    87
	} else if (argType == __get_ffi_type_uint8()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    88
	    st_arg = __MKSMALLINT( *(unsigned char *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    89
	} else if (argType == __get_ffi_type_sint8()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    90
	    st_arg = __MKSMALLINT( *(char *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    91
	} else if (argType == __get_ffi_type_uint16()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    92
	    st_arg = __MKSMALLINT( *(unsigned short *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    93
	} else if (argType == __get_ffi_type_sint16()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    94
	    st_arg = __MKSMALLINT( *(short *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    95
	} else if (argType == __get_ffi_type_uint32()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    96
	    st_arg = __MKUINT( *(unsigned int *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    97
	} else if (argType == __get_ffi_type_sint32()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    98
	    st_arg = __MKINT( *(int *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
    99
	} else if (argType == __get_ffi_type_float()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   100
	    st_arg = __MKSFLOAT( *(float *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   101
	} else if (argType == __get_ffi_type_double()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   102
	    st_arg = __MKFLOAT( *(double *)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   103
	} else if (argType == __get_ffi_type_pointer()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   104
	    st_arg = __MKEXTERNALADDRESS( *(void **)(args[i]) );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   105
	} else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   106
	    if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   107
		fprintf(stderr, "ExternalFunctionCallback(wrapper): invalid argument type %d - arg %d\n", argType, i);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   108
	    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   109
	}
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
	__UNPROTECT__(st_argVector);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   112
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   113
	if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   114
	    fprintf(stderr, "ExternalFunctionCallback(wrapper): st-arg for %x is %x\n", *(unsigned int *)(args[i]), st_arg);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   115
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   116
	__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
   117
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   118
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   119
    /* the action ... */
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   120
    st_actionVector = @global(ExternalFunctionCallback:CallBackRegistry);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   121
    if (st_actionVector != nil) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   122
	OBJ cls = __Class(st_actionVector);
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
	if ((cls == Array) || (cls==WeakArray)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   125
	    actionIndex += /* nInstVars */ __intVal(__ClassInstPtr(cls)->c_ninstvars);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   127
	    if (__arraySize(st_actionVector) <= actionIndex) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   128
		st_callBack = __ArrayInstPtr(st_actionVector)->a_element[actionIndex-1];
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   129
	    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   130
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   131
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   132
    if (st_callBack == nil) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   133
	if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   134
	    fprintf(stderr, "ExternalFunctionCallback(wrapper): ignored nil callback\n");
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   135
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   136
	*(void **)resp = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   137
	return;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   138
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   139
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   140
    {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   141
	static struct inlineCache value_snd = _DUMMYILC1;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   142
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   143
	if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   144
	    fprintf(stderr, "ExternalFunctionCallback(wrapper): sending value: to %x..\n", st_callBack);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   145
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   146
	st_result = _SEND1(st_callBack, @symbol(value:), nil, &value_snd, st_argVector);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   147
	if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   148
	    fprintf(stderr, "ExternalFunctionCallback(wrapper): result is %x\n", st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   149
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   150
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   151
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   152
    retType = cif->rtype;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   153
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   154
    if (st_result == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   155
	sintResult = uintResult = 1;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   156
    } else if (st_result == false) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   157
	sintResult = uintResult = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   158
    } else if (st_result == nil) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   159
	sintResult = uintResult = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   160
    } else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   161
	sintResult = __signedLongIntVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   162
	uintResult = __unsignedLongIntVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   163
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   164
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   165
    if (retType == __get_ffi_type_sint()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   166
	*(int *)resp = sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   167
    } else if (retType == __get_ffi_type_uint()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   168
	*(int *)resp = uintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   169
    } else if (retType == __get_ffi_type_uint8()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   170
	*(unsigned char *)resp = uintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   171
    } else if (retType == __get_ffi_type_sint8()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   172
	*(char *)resp = sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   173
    } else if (retType == __get_ffi_type_uint16()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   174
	*(unsigned short *)resp = uintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   175
    } else if (retType == __get_ffi_type_sint16()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   176
	*(short *)resp = sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   177
    } else if (retType == __get_ffi_type_uint32()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   178
	*(int *)resp = uintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   179
    } else if (retType == __get_ffi_type_sint32()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   180
	*(int *)resp = sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   181
    } else if (retType == __get_ffi_type_float()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   182
	if (__isFloat(st_result)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   183
	    *(float *)resp = (float)__floatVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   184
	} else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   185
	    if (__isShortFloat(st_result)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   186
		*(float *)resp = __shortFloatVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   187
	    } else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   188
		*(float *)resp = (float)sintResult;
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
    } else if (retType == __get_ffi_type_double()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   192
	if (__isFloat(st_result)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   193
	    *(double *)resp = __floatVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   194
	} else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   195
	    if (__isShortFloat(st_result)) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   196
		*(double *)resp = (double)__shortFloatVal(st_result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   197
	    } else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   198
		*(double *)resp = (double)sintResult;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   199
	    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   200
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   201
    } else if (retType == __get_ffi_type_pointer()) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   202
	*(void **)resp = (void *)__externalAddressVal( st_result );
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   203
    } else {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   204
	if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   205
	    fprintf(stderr, "ExternalFunctionCallback(wrapper): invalid result type %d\n", retType, i);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   206
	}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   207
	*(void **)resp = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   208
    }
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
void
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   212
ExternalFunctionCallback__test_call_closure(INTFUNC f)
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
{
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    int result = 0;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    printf("doCall_closure: calling closure %x(123)...\n", f);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    result = (*f)(123);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
    printf("doCall_closure: back; result is %x...\n", result);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
%}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   224
!ExternalFunctionCallback class methodsFor:'documentation'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   225
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   226
copyright
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   227
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   228
 COPYRIGHT (c) 2007 by eXept Software AG
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   229
              All Rights Reserved
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   230
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   231
 This software is furnished under a license and may be used
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   232
 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
   233
 inclusion of the above copyright notice.   This software may not
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   234
 be provided or otherwise made available to, or used by, any
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   235
 other person.  No title to or ownership of the software is
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   236
 hereby transferred.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   237
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   238
!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   239
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   240
documentation
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   241
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   242
    an ExternalFunctionCallback wraps a block into a C-callable function;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   243
    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
   244
    function pointer, but when invoked evaluates a smalltalk block.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   245
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   246
    [author:]
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   247
        Claus Gittinger
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   248
"
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   249
!
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
examples
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
    |cb|
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
    cb := ExternalFunctionCallback new.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
    cb returnType:#bool argumentTypes:#(uint).
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   257
    cb action:[:args | Transcript showCR:args. true].
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
    cb generateClosure.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   260
    cb address.  'can be passed to C'.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   261
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   262
    ExternalFunctionCallback testCall:cb withArgument:123.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   263
    cb release
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   267
!ExternalFunctionCallback class methodsFor:'helpers'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   268
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   269
closureIndexFor:aCallBack
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   270
    CallBackRegistry isNil ifTrue:[
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   271
	CallBackRegistry := WeakArray with:aCallBack.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   272
    ] ifFalse:[
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   273
	CallBackRegistry := CallBackRegistry copyWith:aCallBack.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   274
    ].
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   275
    ^ CallBackRegistry size.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   276
!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   277
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   278
testCall:aCallback withArgument:arg
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   279
%{
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   280
    INTFUNC f = __externalAddressVal(aCallback);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   281
    INT result;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   282
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   283
    fprintf(stderr, "calling callBack %x(%d)\n", f, __intVal(arg));
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   284
    result = (*f)(__intVal(arg));
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   285
    fprintf(stderr, "result from callBack is %x\n", result);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   286
%}
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   287
! !
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   288
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
!ExternalFunctionCallback methodsFor:'accessing'!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   291
action:aOneArgBlock
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   292
    action := aOneArgBlock.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   293
! !
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   294
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   295
!ExternalFunctionCallback methodsFor:'callback'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   296
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   297
value:argList
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   298
    "because this is evaluated from C, we probably should not block or abort or do
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   299
     any other things which confuse C
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   300
     (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
   301
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   302
self halt.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   303
    action notNil ifTrue:[
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   304
	^ action valueWithArguments:argList
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   305
    ].
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   306
    ^ nil
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
!ExternalFunctionCallback methodsFor:'generation'!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
address
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
    self isValid ifFalse:[
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
	self generate
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
    ].
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
    ^ super address
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
    "Created: / 11-06-2007 / 15:53:00 / cg"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
generate
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
    |code|
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
    code := nil
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
    "Created: / 11-06-2007 / 14:50:57 / cg"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
generate0
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
    |code|
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    code := #[
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
		"/ mov ecx, closureIndex
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
		16rB9
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
		    16r00  16r00  16r00  16r01
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
		"/ mov eax, doClosureC
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
		16rB8
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
		    16r00  16r00  16r00  16r02
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
		"/ call *eax
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
		16rFF  16rD0
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
		"/ ret
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
		16rC3
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
	    ].
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
    self allocateBytes:(code size).
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
    "Created: / 11-06-2007 / 15:29:33 / cg"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
!ExternalFunctionCallback methodsFor:'private-accessing'!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
returnType:aReturnType argumentTypes:argTypes
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    returnType := aReturnType.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    argumentTypes := argTypes.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
    "Created: / 11-06-2007 / 15:52:01 / cg"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
! !
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   358
!ExternalFunctionCallback methodsFor:'private-debugging'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   359
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   360
debugCall:args
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   361
    self halt.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   362
    ^ nil
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   363
! !
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   364
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
!ExternalFunctionCallback methodsFor:'private-generation'!
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
generateClosure
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   368
    |argTypeSymbols returnTypeSymbol failureCode failureInfo
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   369
     callTypeNumber returnValueClass argValueClass callBackIndex|
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    argTypeSymbols := argumentTypes.
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
    returnTypeSymbol := returnType.
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   373
    callBackIndex := self class closureIndexFor:self.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   374
%{
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
#ifdef HAVE_FFI
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   376
    ffi_cif *pcif;
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
    ffi_type *__returnType = NULL;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    static int null = 0;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
    int i;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
    ffi_abi __callType = FFI_DEFAULT_ABI;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
    int __numArgsWanted;
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   382
    struct closurePlusCIF {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   383
	ffi_closure closure;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   384
	ffi_cif cif;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   385
	ffi_type *argTypes[MAX_ARGS];
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   386
    } *closurePlusCIFp;
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
    ffi_closure *pcl;
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   388
    ffi_cif *cif;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   389
    ffi_type **argTypePtrs;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   390
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   391
    closurePlusCIFp = (struct closurePlusCIF *) malloc(sizeof(struct closurePlusCIF));
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   392
    cif = &(closurePlusCIFp->cif);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   393
    argTypePtrs = closurePlusCIFp->argTypes;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   394
    pcl = &(closurePlusCIFp->closure);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
#define __FAIL__(fcode) \
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
    { \
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   398
	failureCode = fcode; free(closurePlusCIFp); goto getOutOfHere; \
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
    if (argTypeSymbols == nil) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
	__numArgsWanted = 0;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
    } else if (__isArray(argTypeSymbols)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
	__numArgsWanted = __arraySize(argTypeSymbols);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
    } else {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
	__FAIL__(@symbol(BadArgumentTypeVector))
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
    if (__numArgsWanted > MAX_ARGS) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
	__FAIL__(@symbol(TooManyArguments))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
    /*
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
     * validate the return type
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
     */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
    if (returnTypeSymbol == @symbol(voidPointer)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
	returnTypeSymbol = @symbol(handle);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
    if (returnTypeSymbol == @symbol(int)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
	__returnType = __get_ffi_type_sint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
    } else if (returnTypeSymbol == @symbol(uint)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
	__returnType = __get_ffi_type_uint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
    } else if (returnTypeSymbol == @symbol(uint8)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
	__returnType = __get_ffi_type_uint8();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
    } else if (returnTypeSymbol == @symbol(uint16)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
	__returnType = __get_ffi_type_uint16();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
    } else if (returnTypeSymbol == @symbol(uint32)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
	__returnType = __get_ffi_type_uint32();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
    } else if (returnTypeSymbol == @symbol(uint64)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
	__returnType = __get_ffi_type_uint64();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
    } else if (returnTypeSymbol == @symbol(sint)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
	__returnType = __get_ffi_type_sint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    } else if (returnTypeSymbol == @symbol(sint8)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
	__returnType = __get_ffi_type_sint8();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    } else if (returnTypeSymbol == @symbol(sint16)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
	__returnType = __get_ffi_type_sint16();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
    } else if (returnTypeSymbol == @symbol(sint32)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
	__returnType = __get_ffi_type_sint32();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
    } else if (returnTypeSymbol == @symbol(sint64)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
	__returnType = __get_ffi_type_sint64();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
    } else if (returnTypeSymbol == @symbol(long)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
	if (sizeof(long) == 4) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
	   returnTypeSymbol = @symbol(sint32);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
	   __returnType = __get_ffi_type_sint32();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
	} else if (sizeof(long) == 8) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
	   returnTypeSymbol = @symbol(sint64);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
	   __returnType = __get_ffi_type_sint64();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
	} else {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
	    __FAIL__(@symbol(UnknownReturnType))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
    } else if (returnTypeSymbol == @symbol(ulong)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
	if (sizeof(long) == 4) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
	   returnTypeSymbol = @symbol(uint32);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
	   __returnType = __get_ffi_type_uint32();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
	}else if (sizeof(long) == 8) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
	   returnTypeSymbol = @symbol(uint64);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
	   __returnType = __get_ffi_type_uint64();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
	} else {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
	    __FAIL__(@symbol(UnknownReturnType))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
    } else if (returnTypeSymbol == @symbol(bool)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
	__returnType = __get_ffi_type_uint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
    } else if (returnTypeSymbol == @symbol(float)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
	__returnType = __get_ffi_type_float();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
    } else if (returnTypeSymbol == @symbol(double)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
	__returnType = __get_ffi_type_double();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
    } else if (returnTypeSymbol == @symbol(void)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
	__returnType = __get_ffi_type_void();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
    } else if ((returnTypeSymbol == @symbol(pointer))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
	       || (returnTypeSymbol == @symbol(handle))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
	       || (returnTypeSymbol == @symbol(charPointer))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
	       || (returnTypeSymbol == @symbol(bytePointer))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
	       || (returnTypeSymbol == @symbol(floatPointer))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
	       || (returnTypeSymbol == @symbol(doublePointer))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
	       || (returnTypeSymbol == @symbol(intPointer))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
	       || (returnTypeSymbol == @symbol(shortPointer))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
	       || (returnTypeSymbol == @symbol(wcharPointer))) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
	__returnType = __get_ffi_type_pointer();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
    } else {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
	if (__isSymbol(returnTypeSymbol)
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
	 && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
	    if (! __isBehaviorLike(returnValueClass)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
		__FAIL__(@symbol(NonBehaviorReturnType))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
	    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
	    if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
		__FAIL__(@symbol(NonExternalAddressReturnType))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
	    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
	    __returnType = __get_ffi_type_pointer();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
	    returnTypeSymbol = @symbol(pointer);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
	} else {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
	    __FAIL__(@symbol(UnknownReturnType))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
    /*
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
     * setup arg-buffers
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
     */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
    for (i=0; i<__numArgsWanted; i++) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
	ffi_type *thisType;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
	void *argValuePtr;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
	OBJ typeSymbol;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
	failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
	typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
	if (typeSymbol == @symbol(handle)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
	    typeSymbol = @symbol(pointer);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
	} else if (typeSymbol == @symbol(voidPointer)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
	    typeSymbol = @symbol(pointer);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
	if (typeSymbol == @symbol(long)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
	    if (sizeof(long) == sizeof(int)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
		typeSymbol = @symbol(sint);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
	    } else {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
		if (sizeof(long) == 4) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
		    typeSymbol = @symbol(sint32);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
		} else if (sizeof(long) == 8) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
		    typeSymbol = @symbol(sint64);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
		}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   529
	    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   530
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   531
	if (typeSymbol == @symbol(ulong)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   532
	    if (sizeof(unsigned long) == sizeof(unsigned int)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   533
		typeSymbol = @symbol(uint);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   534
	    } else {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   535
		if (sizeof(long) == 4) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
		    typeSymbol = @symbol(uint32);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
		} else if (sizeof(long) == 8) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
		    typeSymbol = @symbol(uint64);
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
		}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
	    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
	if (typeSymbol == @symbol(int)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
	    thisType = __get_ffi_type_sint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
	} else if (typeSymbol == @symbol(uint)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
	    thisType = __get_ffi_type_uint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
	} else if (typeSymbol == @symbol(uint8)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
	    thisType = __get_ffi_type_uint8();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
	} else if (typeSymbol == @symbol(sint8)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
	    thisType = __get_ffi_type_sint8();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
	} else if (typeSymbol == @symbol(uint16)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
	    thisType = __get_ffi_type_uint16();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
	} else if (typeSymbol == @symbol(sint16)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
	    thisType = __get_ffi_type_sint16();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
	} else if ((typeSymbol == @symbol(uint32)) || (typeSymbol == @symbol(sint32))) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
	    thisType = __get_ffi_type_uint32();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
	} else if (typeSymbol == @symbol(float)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
	    thisType = __get_ffi_type_float();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
	} else if (typeSymbol == @symbol(double)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
	    thisType = __get_ffi_type_double();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
	} else if (typeSymbol == @symbol(void)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
	    thisType = __get_ffi_type_void();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
	} else if (typeSymbol == @symbol(charPointer)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
	    thisType = __get_ffi_type_pointer();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
	} else if (typeSymbol == @symbol(floatPointer)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
	    thisType = __get_ffi_type_pointer();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
	} else if (typeSymbol == @symbol(doublePointer)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   568
	    thisType = __get_ffi_type_pointer();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
	} else if (typeSymbol == @symbol(pointer)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   570
commonPointerTypeArg: ;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   571
	    thisType = __get_ffi_type_pointer();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
	} else if (typeSymbol == @symbol(bool)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
	    thisType = __get_ffi_type_uint();
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
	} else if (__isSymbol(typeSymbol)
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
	     && ((argValueClass = __GLOBAL_GET(typeSymbol)) != nil)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   576
	    if (! __isBehaviorLike(argValueClass)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
		__FAIL__(@symbol(NonBehaviorArgumentType))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
	    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
	    if (! __qIsSubclassOfExternalAddress(argValueClass)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
		__FAIL__(@symbol(NonExternalAddressArgumentType))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
	    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
	    goto commonPointerTypeArg; /* sorry */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
	} else {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
	    __FAIL__(@symbol(UnknownArgumentType))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   587
	closurePlusCIFp->argTypes[i] = thisType;
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
    }
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
    failureInfo = nil;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
    __callType = FFI_DEFAULT_ABI;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
    if (callTypeNumber != nil) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
#ifdef CALLTYPE_FFI_STDCALL
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
	if (callTypeNumber == @global(ExternalLibraryFunction:CALLTYPE_API)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
	    __callType = CALLTYPE_FFI_STDCALL;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
#endif
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
#ifdef CALLTYPE_FFI_V8
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   600
	if (callTypeNumber == @global(ExternalLibraryFunction:CALLTYPE_V8)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
	    __callType = CALLTYPE_FFI_V8;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
#endif
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
#ifdef CALLTYPE_FFI_V9
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
	if (callTypeNumber == @global(ExternalLibraryFunction:CALLTYPE_V9)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
	    __callType = CALLTYPE_FFI_V9;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
#endif
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
#ifdef CALLTYPE_FFI_UNIX64
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
	if (callTypeNumber == @global(ExternalLibraryFunction:CALLTYPE_UNIX64)) {
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
	    __callType = CALLTYPE_FFI_UNIX64;
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
	}
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   613
#endif
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
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   616
    if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   617
	printf("prep_cif cif-ptr=%x\n", cif);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   618
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   619
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   620
    if (ffi_prep_cif(cif, __callType, __numArgsWanted, __returnType, argTypePtrs) != FFI_OK) {
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
	__FAIL__(@symbol(FFIPrepareFailed))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
    }
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   623
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   624
    if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   625
	printf("closure is 0x%x (%d bytes)\n", pcl, sizeof(ffi_closure));
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   626
	printf("index is %d\n", __intVal(callBackIndex));
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   627
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   628
    if (ffi_prep_closure(pcl, cif, ExternalFunctionCallback__closure_wrapper_fn, (void *)(__intVal(callBackIndex)) /* userdata */) != FFI_OK) {
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
	__FAIL__(@symbol(FFIPrepareClosureFailed))
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
    }
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   631
    if (@global(ExternalFunctionCallback:Verbose) == true) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   632
	printf("pcl->cif is 0x%x\n", pcl->cif);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   633
	printf("pcl->fun is 0x%x\n", pcl->fun);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   634
	printf("pcl code at %x is:\n", pcl);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   635
	printf("  %02x %02x %02x %02x\n", ((unsigned char *)pcl)[0],((unsigned char *)pcl)[1],((unsigned char *)pcl)[2],((unsigned char *)pcl)[3]);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   636
	printf("  %02x %02x %02x %02x\n", ((unsigned char *)pcl)[4],((unsigned char *)pcl)[5],((unsigned char *)pcl)[6],((unsigned char *)pcl)[7]);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   637
	printf("  %02x %02x %02x %02x\n", ((unsigned char *)pcl)[8],((unsigned char *)pcl)[9],((unsigned char *)pcl)[10],((unsigned char *)pcl)[11]);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   638
	printf("  %02x %02x %02x %02x\n", ((unsigned char *)pcl)[12],((unsigned char *)pcl)[13],((unsigned char *)pcl)[14],((unsigned char *)pcl)[15]);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   639
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   640
    __INST(address_) = pcl;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   641
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   642
#if 0
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   643
    ExternalFunctionCallback__test_call_closure((INTFUNC)pcl);
10607
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
#endif
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
#else /* no FFI support */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
    __FAIL__(@symbol(FFINotSupported));
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
#endif /* HAVE_FFI */
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
getOutOfHere: ;
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
    failureCode notNil ifTrue:[
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
	self primitiveFailed:(failureCode->failureInfo).   "see failureCode and failureInfo for details"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   653
	^ nil
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
    ].
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   655
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
    "Created: / 11-06-2007 / 21:53:02 / cg"
9f42b83e653a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   657
! !
10609
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   658
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   659
!ExternalFunctionCallback methodsFor:'private-releasing'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   660
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   661
release
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   662
    |idx|
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   663
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   664
    idx := CallBackRegistry identityIndexOf:self.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   665
    CallBackRegistry at:idx put:nil.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   666
%{
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   667
    ffi_closure *pcl = (ffi_closure *)__INST(address_);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   668
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   669
    __INST(address_) = 0;
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   670
    if (pcl) {
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   671
	free(pcl);
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   672
    }
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   673
%}.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   674
    self invalidateReference.
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   675
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   676
! !
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   677
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   678
!ExternalFunctionCallback class methodsFor:'documentation'!
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   679
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   680
version
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   681
    ^ '$Header: /cvs/stx/stx/libbasic/ExternalFunctionCallback.st,v 1.2 2007-06-13 21:13:25 cg Exp $'
fa629d528330 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10607
diff changeset
   682
! !