home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC6.DMS / in.adf / libsrc.lha / LIBSRC / exc.asm < prev    next >
Encoding:
Assembly Source File  |  1994-05-08  |  2.2 KB  |  101 lines

  1.  
  2. *    Maxon C++ Library:
  3. *    Modul "exc.o"
  4. *    Funktionen für Exception Handling (ab V 3.0)
  5. *    Jens Gelhar 07.05.94
  6.  
  7.     xdef    lib_throw,lib_rethrow
  8.     xdef    lib_catch,lib_catchclass
  9.     xdef    sym_handlers
  10.     xdef    _INIT_0_exc_o_GruesseAnDietrichJuergenStoffelUli
  11.     xref    abort_
  12.  
  13.     
  14. lib_throw:
  15.     move.l    lastexception,(a7)    ; Return-Adresse ist egal,
  16.     ; stattdessen merken wir uns diesen alten Wert
  17.     move.l    a7,lastexception
  18. throwthis:
  19.     move.l    sym_handlers,a0
  20.     move.l    (a0),sym_handlers    ; einen Stackeintrag poppen
  21.     move.l    8(a0),d0
  22.     beq.b    .handler
  23.     ; Destruktor-Aufruf:
  24.     move.l    d0,-(a7)    ; Adresse des Objekts
  25.     move.l    4(a0),a0    ; Adresse des Destruktors
  26.     jsr    (a0)        ; Destruktor aufrufeb
  27.     addq.l    #4,a7
  28.     bra.b    throwthis
  29.  
  30. .handler ; Echten Exception Handler gefunden:
  31.     move.l    a0,lasthandler
  32.     move.l    4(a0),-(a7)        ; Handleradresse merken
  33.     movem.l    12(a0),d0-d7/a0-a6    ; Register (außer Stack) restoren
  34.     rts                ; Handler anspringen
  35.  
  36.  
  37. lib_rethrow:
  38.     move.l    lastexception,d0
  39.     beq.b    .abort
  40.     move.l    d0,a7
  41.     bra    throwthis
  42. .abort    ; es wurde keine unaufgefangene Exception geschmissen:
  43.     jmp    abort_
  44.  
  45.  
  46. lib_catch: ; Handler wurde abgearbeitet - jetzt Stack korrigieren etc.:
  47.     move.l    4(a7),lastexception
  48.     move.l    a0,-(a7)
  49.     move.l    lasthandler,a0
  50.     move.l    12+15*4(a0),a0    ; neuer Stackpointer
  51.     move.l    4(a7),-(a0)    ; Rückkehradresse
  52.     move.l    (a7),-(a0)    ; gemerkter Wert von "a0"
  53.     move.l    a0,a7        ; jetzt Stackpointer umsetzen
  54.     move.l    (a7)+,a0
  55.     rts
  56.  
  57.  
  58. lib_catchclass: ; falls Klassen-Handle d0 in Tabelle 8(a7) steht,
  59.     ; Offset in 16(a7) ablegen und "ne", sonst "eq"
  60.     move.l    a1,-(a7)
  61.     move.l    12(a7),a1
  62. .loop    tst.l    (a1)
  63.     beq.b    .0
  64.     cmp.l    (a1)+,d0
  65.     beq.b    .ok
  66.     addq.l    #4,a1
  67.     bra.b    .loop
  68. .ok    move.l    (a1),20(a7)
  69.     cmp.w    #0,a7
  70. .0    move.l    (a7)+,a1
  71.     rts
  72.  
  73.  
  74. _INIT_0_exc_o_GruesseAnDietrichJuergenStoffelUli:
  75.     move.l    a7,stckptr
  76.     move.l    #handlerstruct,sym_handlers
  77.     rts
  78.  
  79. ; initialer Eintrag auf dem Exception-Stack:
  80.  
  81. handlerstruct:
  82.     dc.l    0    ; link: Ende der Liste
  83.     dc.l    abort_    ; letzter "Handler" ist Ausstieg
  84.     dc.l    0    ; NULL als Kennzeichnung
  85.     ds.l    15    ; die meisten Register sind egal
  86. stckptr    ds.l    1    ; Stackpointer wird gespeichert (ist besser)
  87.  
  88.  
  89.     SECTION D,DATA
  90.  
  91. sym_handlers:        ; Stackpointer für Exception Handlers und Destruktoren
  92.     dc.l    0
  93.  
  94. lastexception:
  95.     dc.l    0    ; Zeiger auf zuletzt geworfene Exception
  96.  
  97. lasthandler:
  98.     dc.l    0    ; zuletzt ausprobierter Exception Handler
  99.  
  100.     END
  101.