Back to index

python3.2  3.2.2
Functions
raw_api.c File Reference
#include <ffi.h>
#include <ffi_common.h>

Go to the source code of this file.

Functions

size_t ffi_raw_size (ffi_cif *cif)
void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args)
void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw)
void ffi_raw_call (ffi_cif *cif, void(*fn)(void), void *rvalue, ffi_raw *raw)

Function Documentation

void ffi_ptrarray_to_raw ( ffi_cif cif,
void **  args,
ffi_raw raw 
)

Definition at line 129 of file raw_api.c.

{
  unsigned i;
  ffi_type **tp = cif->arg_types;

  for (i = 0; i < cif->nargs; i++, tp++, args++)
    {    
      switch ((*tp)->type)
       {
       case FFI_TYPE_UINT8:
         (raw++)->uint = *(UINT8*) (*args);
         break;

       case FFI_TYPE_SINT8:
         (raw++)->sint = *(SINT8*) (*args);
         break;

       case FFI_TYPE_UINT16:
         (raw++)->uint = *(UINT16*) (*args);
         break;

       case FFI_TYPE_SINT16:
         (raw++)->sint = *(SINT16*) (*args);
         break;

#if FFI_SIZEOF_ARG >= 4
       case FFI_TYPE_UINT32:
         (raw++)->uint = *(UINT32*) (*args);
         break;

       case FFI_TYPE_SINT32:
         (raw++)->sint = *(SINT32*) (*args);
         break;
#endif

#if !FFI_NO_STRUCTS
       case FFI_TYPE_STRUCT:
         (raw++)->ptr = *args;
         break;
#endif

       case FFI_TYPE_POINTER:
         (raw++)->ptr = **(void***) args;
         break;

       default:
         memcpy ((void*) raw->data, (void*)*args, (*tp)->size);
         raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
       }
    }
}
void ffi_raw_call ( ffi_cif cif,
void(*)(void fn,
void rvalue,
ffi_raw raw 
)

Definition at line 191 of file raw_api.c.

{
  void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
  ffi_raw_to_ptrarray (cif, raw, avalue);
  ffi_call (cif, fn, rvalue, avalue);
}

Definition at line 35 of file raw_api.c.

{
  size_t result = 0;
  int i;

  ffi_type **at = cif->arg_types;

  for (i = cif->nargs-1; i >= 0; i--, at++)
    {
#if !FFI_NO_STRUCTS
      if ((*at)->type == FFI_TYPE_STRUCT)
       result += ALIGN (sizeof (void*), FFI_SIZEOF_ARG);
      else
#endif
       result += ALIGN ((*at)->size, FFI_SIZEOF_ARG);
    }

  return result;
}
void ffi_raw_to_ptrarray ( ffi_cif cif,
ffi_raw raw,
void **  args 
)

Definition at line 57 of file raw_api.c.

{
  unsigned i;
  ffi_type **tp = cif->arg_types;

#if WORDS_BIGENDIAN

  for (i = 0; i < cif->nargs; i++, tp++, args++)
    {    
      switch ((*tp)->type)
       {
       case FFI_TYPE_UINT8:
       case FFI_TYPE_SINT8:
         *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1);
         break;
         
       case FFI_TYPE_UINT16:
       case FFI_TYPE_SINT16:
         *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2);
         break;

#if FFI_SIZEOF_ARG >= 4       
       case FFI_TYPE_UINT32:
       case FFI_TYPE_SINT32:
         *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4);
         break;
#endif
       
#if !FFI_NO_STRUCTS  
       case FFI_TYPE_STRUCT:
         *args = (raw++)->ptr;
         break;
#endif

       case FFI_TYPE_POINTER:
         *args = (void*) &(raw++)->ptr;
         break;
         
       default:
         *args = raw;
         raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
       }
    }

#else /* WORDS_BIGENDIAN */

#if !PDP

  /* then assume little endian */
  for (i = 0; i < cif->nargs; i++, tp++, args++)
    {    
#if !FFI_NO_STRUCTS
      if ((*tp)->type == FFI_TYPE_STRUCT)
       {
         *args = (raw++)->ptr;
       }
      else
#endif
       {
         *args = (void*) raw;
         raw += ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*);
       }
    }

#else
#error "pdp endian not supported"
#endif /* ! PDP */

#endif /* WORDS_BIGENDIAN */
}

Here is the caller graph for this function: