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 / intrp / exception.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  4KB  |  181 lines

  1. /*
  2.  * exception.c
  3.  * Handle exceptions for the interpreter.
  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>, May 1996.
  12.  */
  13.  
  14. #define    DBG(s)
  15.  
  16. #include "config.h"
  17. #include <stdio.h>
  18. #include <assert.h>
  19. #include <stdlib.h>
  20. #include <signal.h>
  21. #include <setjmp.h>
  22. #include "gtypes.h"
  23. #include "access.h"
  24. #include "object.h"
  25. #include "constants.h"
  26. #include "classMethod.h"
  27. #include "exception.h"
  28. #include "baseClasses.h"
  29. #include "lookup.h"
  30. #include "thread.h"
  31. #include "md.h"
  32.  
  33. object*    ClassFormatError;
  34. object*    LinkageError;
  35. object*    ClassNotFoundException;
  36. object*    NoSuchFieldError;
  37. object*    NoSuchMethodError;
  38. object*    OutOfMemoryError;
  39. object*    UnsatisfiedLinkError;
  40. object*    VirtualMachineError;
  41. object*    ClassCircularityError;
  42. object*    NegativeArraySizeException;
  43. object*    ClassCastException;
  44. object*    IllegalMonitorStateException;
  45. object*    NullPointerException;
  46. object*    ArithmeticException;
  47. object*    ArrayIndexOutOfBoundsException;
  48.  
  49. static void dispatchException(object*);
  50.  
  51. static void nullException(int);
  52. static void arithmeticException(int);
  53.  
  54. extern object* exceptionObject;
  55. extern jmp_buf* cjbuf;
  56.  
  57. /*
  58.  * Setup the internal exceptions.
  59.  */
  60. void
  61. initExceptions(void)
  62. {
  63. DBG(    printf("initExceptions()\n");                )
  64.  
  65. #define    EXCEPTION(s) alloc_object(lookupClass(addString(#s)), true)
  66.  
  67.     ClassFormatError = EXCEPTION(java/lang/ClassFormatError);
  68.     LinkageError = EXCEPTION(java/lang/LinkageError);
  69.     ClassNotFoundException = EXCEPTION(java/lang/ClassNotFoundException);
  70.     NoSuchFieldError = EXCEPTION(java/lang/NoSuchFieldError);
  71.     NoSuchMethodError = EXCEPTION(java/lang/NoSuchMethodError);
  72.     OutOfMemoryError = EXCEPTION(java/lang/OutOfMemoryError);
  73.     UnsatisfiedLinkError = EXCEPTION(java/lang/UnsatisfiedLinkError);
  74.     VirtualMachineError = EXCEPTION(java/lang/VirtualMachineError);
  75.     ClassCircularityError = EXCEPTION(java/lang/ClassCircularityError);
  76.     NegativeArraySizeException = EXCEPTION(java/lang/NegativeArraySizeException);
  77.     ClassCastException = EXCEPTION(java/lang/ClassCastException);
  78.     IllegalMonitorStateException = EXCEPTION(java/lang/IllegalMonitorStateException);
  79.     NullPointerException = EXCEPTION(java/lang/NullPointerException);
  80.     ArithmeticException = EXCEPTION(java/lang/ArithmeticException);
  81.     ArrayIndexOutOfBoundsException = EXCEPTION(java/lang/ArrayIndexOutOfBoundsException);
  82.  
  83.     initClasses();
  84.  
  85. #if !defined(DEBUG)
  86.     /* Catch signal we need to convert to exceptions */
  87. #if defined(SIGSEGV)
  88.     signal(SIGSEGV, (SIG_T)nullException);
  89. #endif
  90. #if defined(SIGBUS)
  91.     signal(SIGBUS, (SIG_T)nullException);
  92. #endif
  93. #if defined(SIGFPE)
  94.     signal(SIGFPE, (SIG_T)arithmeticException);
  95. #endif
  96. #if defined(SIGPIPE)
  97.     signal(SIGPIPE, SIG_IGN);
  98. #endif
  99. #endif
  100. }
  101.  
  102. /*
  103.  * Throw an internal exception.
  104.  */
  105. void
  106. throwException(object* eobj)
  107. {
  108.     ((throwable*)eobj)->backtrace = buildStackTrace(0);
  109.     throwExternalException(eobj);
  110. }
  111.  
  112. /*
  113.  * Throw an exception.
  114.  */
  115. void
  116. throwExternalException(object* eobj)
  117. {
  118.     if (eobj == 0) {
  119.         fprintf(stderr, "Exception thrown on null object ... aborting\n");
  120.         abort();
  121.         exit(1);
  122.     }
  123.     dispatchException(eobj);
  124. }
  125.  
  126. /*
  127.  * Search for a matching exception.
  128.  */
  129. static
  130. void
  131. dispatchException(object* eobj)
  132. {
  133.     if (cjbuf != 0) {
  134.         exceptionObject = eobj;
  135.         longjmp(*cjbuf, 1);
  136.     }
  137.  
  138.     fprintf(stderr, "%s\n", eobj->dtable->class->name);
  139.     fprintf(stderr, "\t[backtrace unimplemented for interpreter]\n");
  140.     fflush(stderr);
  141.     exit(1);
  142. }
  143.  
  144. /*
  145.  * Build an array of char[] for the current stack backtrace.
  146.  */
  147. object*
  148. buildStackTrace(struct _exceptionFrame* dummy)
  149. {
  150.     /* Not implemented yet */
  151.     return (0);
  152. }
  153.  
  154. /*
  155.  * Null exception - catches bad memory accesses.
  156.  */
  157. static
  158. void
  159. nullException(int sig)
  160. {
  161. #if !defined(DEBUG)
  162.     /* Reset signal handler - necessary for SysV, does no harm for BSD */
  163.     signal(sig, (SIG_T)nullException);
  164. #endif
  165.     dispatchException(NullPointerException);
  166. }
  167.  
  168. /*
  169.  * Division by zero.
  170.  */
  171. static
  172. void
  173. arithmeticException(int sig)
  174. {
  175. #if !defined(DEBUG)
  176.         /* Reset signal handler - necessary for SysV, does no harm for BSD */
  177.         signal(sig, (SIG_T)arithmeticException);
  178. #endif
  179.     dispatchException(ArithmeticException);
  180. }
  181.