home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / kaffevm / external.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  75 lines

  1. /*
  2.  * external.h
  3.  * Handle method calls to other languages.
  4.  *
  5.  * Copyright (c) 1996 Systems Architecture Research Centre,
  6.  *           City University, London, UK.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, February 1996.
  12.  */
  13.  
  14. #ifndef __external_h
  15. #define __external_h
  16.  
  17. #define    MAXSTUBLEN    1024
  18. #define    MAXLIBPATH    1024
  19. #define    MAXLIBS        16
  20.  
  21. /* Default library info. */
  22. #define    LIBRARYPATH    "LD_LIBRARY_PATH"
  23. #define    NATIVELIBRARY    "libkaffe_native"
  24.  
  25. /*
  26.  * Define the Kaffe function call routine.
  27.  *  'func' is a pointer to the method block.
  28.  *  'obj' is the object. 
  29.  *  'nargs' is the number of arguments.
  30.  *  'argptr' is a pointer to the arguments.
  31.  */
  32. #if defined(INTERPRETER)
  33.  
  34. #if !defined(HAVE_MEMCPY)
  35. void bcopy(void*, void*, size_t);
  36. #define memcpy(d, s, n) bcopy ((s), (d), (n))
  37. #endif
  38.  
  39. #define    CALL_KAFFE_FUNCTION_VARARGS(func, obj, nargs, argptr)        \
  40.     {                                \
  41.         int i;                            \
  42.         va_list ap;                        \
  43.         slots* kargs;                        \
  44.         memcpy(&ap, &(argptr), sizeof(va_list));        \
  45.         kargs = alloca(sizeof(slots) * ((nargs) + 1));        \
  46.         for (i = 0; i < (nargs); i++) {                \
  47.             kargs[(nargs)-i-1].v.tint = va_arg(ap, jint);    \
  48.         }                            \
  49.         kargs[(nargs)].v.tint = (jint)obj;            \
  50.         virtualMachine((func), kargs);                \
  51.     }
  52.  
  53. #define    CALL_KAFFE_FUNCTION(func, obj)                    \
  54.     {                                \
  55.         slots kargs[1];                        \
  56.         kargs[0].v.tint = (jint)obj;                \
  57.         virtualMachine((func), kargs);                \
  58.     }
  59. #endif
  60.  
  61. /*
  62.  * If we don't define a simple function call macro, use the vararg version.
  63.  */
  64. #if !defined(CALL_KAFFE_FUNCTION)
  65. #define    CALL_KAFFE_FUNCTION(f, o)    CALL_KAFFE_FUNCTION_VARARGS(f, o, 0, 0)
  66. #endif
  67.  
  68. struct _methods;
  69.  
  70. void    initNative(void);
  71. int    loadNativeLibrary(char*);
  72. void    native(struct _methods*);
  73.  
  74. #endif
  75.