Back to index

plt-scheme  4.2.1
Functions
java_raw_api.c File Reference
#include <ffi.h>
#include <ffi_common.h>
#include <stdlib.h>

Go to the source code of this file.

Functions

size_t ffi_java_raw_size (ffi_cif *cif)
void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args)
void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw)
static void ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
static void ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
void ffi_java_raw_call (ffi_cif *cif, void(*fn)(), void *rvalue, ffi_java_raw *raw)

Function Documentation

void ffi_java_ptrarray_to_raw ( ffi_cif *  cif,
void **  args,
ffi_java_raw *  raw 
)

Definition at line 146 of file java_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:
#if WORDS_BIGENDIAN
         *(UINT32*)(raw++) = *(UINT8*) (*args);
#else
         (raw++)->uint = *(UINT8*) (*args);
#endif
         break;

       case FFI_TYPE_SINT8:
#if WORDS_BIGENDIAN
         *(SINT32*)(raw++) = *(SINT8*) (*args);
#else
         (raw++)->sint = *(SINT8*) (*args);
#endif
         break;

       case FFI_TYPE_UINT16:
#if WORDS_BIGENDIAN
         *(UINT32*)(raw++) = *(UINT16*) (*args);
#else
         (raw++)->uint = *(UINT16*) (*args);
#endif
         break;

       case FFI_TYPE_SINT16:
#if WORDS_BIGENDIAN
         *(SINT32*)(raw++) = *(SINT16*) (*args);
#else
         (raw++)->sint = *(SINT16*) (*args);
#endif
         break;

       case FFI_TYPE_UINT32:
#if WORDS_BIGENDIAN
         *(UINT32*)(raw++) = *(UINT32*) (*args);
#else
         (raw++)->uint = *(UINT32*) (*args);
#endif
         break;

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

       case FFI_TYPE_FLOAT:
         (raw++)->flt = *(FLOAT32*) (*args);
         break;

#if FFI_SIZEOF_JAVA_RAW == 8
       case FFI_TYPE_UINT64:
       case FFI_TYPE_SINT64:
       case FFI_TYPE_DOUBLE:
         raw->uint = *(UINT64*) (*args);
         raw += 2;
         break;
#endif

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

       default:
#if FFI_SIZEOF_JAVA_RAW == 8
         FFI_ASSERT(0);     /* Should have covered all cases */
#else
         memcpy ((void*) raw->data, (void*)*args, (*tp)->size);
         raw +=
           ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
#endif
       }
    }
}
void ffi_java_raw_call ( ffi_cif *  cif,
void(*)()  fn,
void rvalue,
ffi_java_raw *  raw 
)

Definition at line 297 of file java_raw_api.c.

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

Here is the call graph for this function:

size_t ffi_java_raw_size ( ffi_cif *  cif)

Definition at line 44 of file java_raw_api.c.

{
  size_t result = 0;
  int i;

  ffi_type **at = cif->arg_types;

  for (i = cif->nargs-1; i >= 0; i--, at++)
    {
      switch((*at) -> type) {
       case FFI_TYPE_UINT64:
       case FFI_TYPE_SINT64:
       case FFI_TYPE_DOUBLE:
         result += 2 * FFI_SIZEOF_JAVA_RAW;
         break;
       case FFI_TYPE_STRUCT:
         /* No structure parameters in Java.     */
         abort();
       default:
         result += FFI_SIZEOF_JAVA_RAW;
      }
    }

  return result;
}
void ffi_java_raw_to_ptrarray ( ffi_cif *  cif,
ffi_java_raw *  raw,
void **  args 
)

Definition at line 72 of file java_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++) + 3);
         break;

       case FFI_TYPE_UINT16:
       case FFI_TYPE_SINT16:
         *args = (void*) ((char*)(raw++) + 2);
         break;

#if FFI_SIZEOF_JAVA_RAW == 8
       case FFI_TYPE_UINT64:
       case FFI_TYPE_SINT64:
       case FFI_TYPE_DOUBLE:
         *args = (void *)raw;
         raw += 2;
         break;
#endif

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

       default:
         *args = raw;
         raw +=
           ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
       }
    }

#else /* WORDS_BIGENDIAN */

#if !PDP

  /* then assume little endian */
  for (i = 0; i < cif->nargs; i++, tp++, args++)
    {
#if FFI_SIZEOF_JAVA_RAW == 8
      switch((*tp)->type) {
       case FFI_TYPE_UINT64:
       case FFI_TYPE_SINT64:
       case FFI_TYPE_DOUBLE:
         *args = (void*) raw;
         raw += 2;
         break;
       default:
         *args = (void*) raw++;
      }
#else /* FFI_SIZEOF_JAVA_RAW != 8 */
       *args = (void*) raw;
       raw +=
         ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
#endif /* FFI_SIZEOF_JAVA_RAW == 8 */
    }

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

#endif /* WORDS_BIGENDIAN */
}

Here is the caller graph for this function:

static void ffi_java_raw_to_rvalue ( ffi_cif *  cif,
void rvalue 
) [static]

Definition at line 263 of file java_raw_api.c.

{
#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8
  switch (cif->rtype->type)
    {
    case FFI_TYPE_UINT8:
    case FFI_TYPE_UINT16:
    case FFI_TYPE_UINT32:
      *(UINT64 *)rvalue >>= 32;
      break;

    case FFI_TYPE_SINT8:
    case FFI_TYPE_SINT16:
    case FFI_TYPE_SINT32:
    case FFI_TYPE_INT:
#if FFI_SIZEOF_JAVA_RAW == 4
    case FFI_TYPE_POINTER:
#endif
      *(SINT64 *)rvalue >>= 32;
      break;

    default:
      break;
    }
#endif
}
static void ffi_java_rvalue_to_raw ( ffi_cif *  cif,
void rvalue 
) [static]

Definition at line 235 of file java_raw_api.c.

{
#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8
  switch (cif->rtype->type)
    {
    case FFI_TYPE_UINT8:
    case FFI_TYPE_UINT16:
    case FFI_TYPE_UINT32:
      *(UINT64 *)rvalue <<= 32;
      break;

    case FFI_TYPE_SINT8:
    case FFI_TYPE_SINT16:
    case FFI_TYPE_SINT32:
    case FFI_TYPE_INT:
#if FFI_SIZEOF_JAVA_RAW == 4
    case FFI_TYPE_POINTER:
#endif
      *(SINT64 *)rvalue <<= 32;
      break;

    default:
      break;
    }
#endif
}

Here is the caller graph for this function: