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.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  5KB  |  245 lines

  1. /*
  2.  * external.c
  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. #define    DBG(s)
  15.  
  16. #include "config.h"
  17. #if defined(HAVE_WTYPES_H)
  18. #include <wtypes.h>
  19. #endif
  20. #include <stdio.h>
  21. #include <assert.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #if defined(HAVE_WINBASE_H)
  25. #include <winbase.h>
  26. #endif
  27. #if defined(MACH_O_RLD_H)
  28. #include <mach-o/rld.h>
  29. #endif
  30. #include "gtypes.h"
  31. #include "access.h"
  32. #include "object.h"
  33. #include "constants.h"
  34. #include "classMethod.h"
  35. #include "slots.h"
  36. #include "external.h"
  37. #include "errors.h"
  38. #include "exception.h"
  39. #include "slib.h"
  40. #include "paths.h"
  41. #if defined(NO_SHARED_LIBRARIES)
  42. #include "../lib/external_wrappers.h"
  43. #endif
  44.  
  45. #if defined(NO_SHARED_LIBRARIES)
  46. #define    STUB_PREFIX        ""
  47. #define    STUB_PREFIX_LEN        0
  48. #define    STUB_POSTFIX        ""
  49.  
  50. /*
  51.  * Some version of dlsym need an underscore, some don't.
  52.  */
  53. #elif defined(INTERPRETER)
  54.  
  55. #if defined(HAVE_DYN_UNDERSTORE)
  56. #define    STUB_PREFIX        "_Kaffe_"
  57. #define    STUB_PREFIX_LEN        7
  58. #else
  59. #define    STUB_PREFIX        "Kaffe_"
  60. #define    STUB_PREFIX_LEN        6
  61. #endif
  62. #define    STUB_POSTFIX        "_stub"
  63.  
  64. #elif defined(TRANSLATOR)
  65.  
  66. #if defined(HAVE_DYN_UNDERSTORE)
  67. #define    STUB_PREFIX        "_"
  68. #define    STUB_PREFIX_LEN        1
  69. #else
  70. #define    STUB_PREFIX        ""
  71. #define    STUB_PREFIX_LEN        0
  72. #endif
  73. #define    STUB_POSTFIX        ""
  74.  
  75. #endif
  76.  
  77. static void* libHandle[MAXLIBS];
  78. char libraryPath[MAXLIBPATH];
  79.  
  80. void
  81. initNative(void)
  82. {
  83. #if !defined(NO_SHARED_LIBRARIES)
  84.     char lib[MAXLIBPATH];
  85.     char* ptr;
  86.     char* nptr;
  87.  
  88.     ptr = getenv(LIBRARYPATH);
  89.     if (ptr == 0) {
  90. #if defined(DEFAULT_LIBRARYPATH)
  91.         ptr = DEFAULT_LIBRARYPATH;
  92. #else
  93.         fprintf(stderr, "No library path set.\n");
  94.         return;
  95. #endif
  96.     }
  97.     strcpy(libraryPath, ptr);
  98.  
  99.     dlinit();
  100.  
  101.     /* Find the default library */
  102.     for (ptr = libraryPath; ptr != 0; ptr = nptr) {
  103.         nptr = strchr(ptr, PATHSEP);
  104.         if (nptr == 0) {
  105.             strcpy(lib, ptr);
  106.         }
  107.         else {
  108.             strncpy(lib, ptr, nptr - ptr);
  109.             lib[nptr-ptr] = 0;
  110.             nptr++;
  111.         }
  112.         strcat(lib, DIRSEP);
  113.         strcat(lib, NATIVELIBRARY);
  114.         strcat(lib, LIBRARYSUFFIX);
  115.  
  116.         if (loadNativeLibrary(lib) == 0) {
  117.             return;
  118.         }
  119.     }
  120.     fprintf(stderr, "Failed to locate native library in path:\n");
  121.     fprintf(stderr, "\t%s\n", libraryPath);
  122.     fprintf(stderr, "Aborting.\n");
  123.     fflush(stderr);
  124.     exit(1);
  125. #endif
  126. }
  127.  
  128. int
  129. loadNativeLibrary(char* lib)
  130. {
  131. #if !defined(NO_SHARED_LIBRARIES)
  132.     int i;
  133.     int j;
  134. #if defined(NeXT)
  135.     const char* filenames[2];
  136.     struct mach_header* new_header;
  137.     
  138.     filenames[0]=lib;
  139.     filenames[1]=NULL;
  140. #endif
  141.  
  142.     /* Find a library handle */
  143.     for (i = 0; i < MAXLIBS; i++) {
  144.         if (libHandle[i] == 0) {
  145.             goto open;
  146.         }
  147.     }
  148.     return (-1);
  149.  
  150.     /* Open the library */
  151.     open:
  152. #if defined(NeXT)
  153.     libHandle[i] = rld_load(NULL,&new_header,filenames,NULL);
  154. #else
  155.     libHandle[i] = dlopen(lib, 1);
  156. #endif
  157.     if (libHandle[i] == 0) {
  158.         return (-1);
  159.     }
  160.  
  161.     /* Eliminate duplicates */
  162.     for (j = 0; j < i; j++) {
  163.         if (libHandle[j] == libHandle[i]) {
  164.             libHandle[i] = 0;
  165.             break;
  166.         }
  167.     }
  168.  
  169. #endif
  170.     return (0);
  171. }
  172.  
  173. void
  174. native(methods* m)
  175. {
  176.     char stub[MAXSTUBLEN];
  177.     char* ptr;
  178.     int i;
  179.     void* func;
  180.  
  181.     /* Construct the stub name */
  182.     strcpy(stub, STUB_PREFIX);
  183.     ptr = m->class->name;
  184.     for (i = STUB_PREFIX_LEN; *ptr != 0; ptr++, i++) {
  185.         if (*ptr == '/') {
  186.             stub[i] = '_';
  187.         }
  188.         else {
  189.             stub[i] = *ptr;
  190.         }
  191.     }
  192.     stub[i] = '_';
  193.     stub[i+1] = 0;
  194.     strcat(stub, m->pair->s1);
  195.     strcat(stub, STUB_POSTFIX);
  196.  
  197. DBG(    printf("Method = %s.%s%s\n", m->class->name, m->pair->s1, m->pair->s2);)
  198. DBG(    printf("Native stub = '%s'\n", stub);fflush(stdout);        )
  199.  
  200. #if !defined(NO_SHARED_LIBRARIES)
  201. #if !defined(NeXT)
  202.     /* Find the native method */
  203.     for (i = 0; i < MAXLIBS && libHandle[i] != 0; i++) {
  204.         func = dlsym(libHandle[i], stub);
  205.         if (func != 0) {
  206.             /* Fill it in */
  207.             m->ncode = func;
  208.             return;
  209.         }
  210.     }
  211. #else
  212.     rld_lookup(NULL,stub,&func);
  213.     if (func != 0) {
  214.         /* Fill it in */
  215.         m->ncode = func;
  216.         return;
  217.     }
  218. #endif
  219. #else
  220.     /*
  221.      * If we don't support shared libraries, fall back on the
  222.      * wrapped up native method table.
  223.      */
  224.     for (i = 0; native_name[i] != 0; i++) {
  225.         if (strcmp(native_name[i], stub) == 0) {
  226.             m->ncode = native_func[i];
  227.             return;
  228.         }
  229.     }
  230. #endif
  231.     fprintf(stderr, "Failed to locate native function:\n\t%s.%s%s\n", m->class->name, m->pair->s1, m->pair->s2);
  232.     fflush(stderr);
  233.  
  234.         throwException(UnsatisfiedLinkError);
  235. }
  236.  
  237. /*
  238.  * Return the library path.
  239.  */
  240. char*
  241. getLibraryPath(void)
  242. {
  243.     return (libraryPath);
  244. }
  245.