Răsfoiți Sursa

64-bit adaptions

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6614 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter 9 ani în urmă
părinte
comite
e2ec7ac2d6
1 a modificat fișierele cu 26 adăugiri și 20 ștergeri
  1. 26 20
      source/Unix.Traps.Mod

+ 26 - 20
source/Unix.Traps.Mod

@@ -25,7 +25,7 @@ VAR
 	trace: BOOLEAN;  
 	
 	unix: Commands.Context;
-		
+			
 	
 	PROCEDURE Append( VAR ar: ARRAY OF CHAR;  CONST this: ARRAY OF CHAR );
 	VAR i, j: LONGINT;
@@ -63,11 +63,15 @@ VAR
 		w.Update;
 		TrapWriters.Trapped;
 			
-		S.GET( S.VAL( ADDRESS, p.obj ) - AddrSize, tag );
-		S.GET( tag - AddrSize, td );  
-		IF td.mod # NIL THEN  
-			COPY( td.mod.name, name );  Append( name,  "." );  Append( name, td.name );
-			IF name = "Oberon.System.OberonRunner" THEN  UnlockOberon  END
+		IF p.obj = NIL THEN	(* the main thread is not associated with any object *)
+			Unix.exit( -1 )
+		ELSE
+			S.GET( S.VAL( ADDRESS, p.obj ) - AddrSize, tag );
+			S.GET( tag - AddrSize, td );  
+			IF td.mod # NIL THEN  
+				COPY( td.mod.name, name );  Append( name,  "." );  Append( name, td.name );
+				IF name = "Oberon.System.OberonRunner" THEN  UnlockOberon  END
+			END
 		END;
 		TrapHandlingLevel := 0;
 		Machine.Release( Machine.Trap )
@@ -86,24 +90,25 @@ VAR
 		INC( TrapHandlingLevel ); 
 		IF trace THEN  
 			Trace.String( "Aos Trap:  signal = " );  Trace.Int( sig, 0 );  
-			Trace.String( ",  ucp = " );  Trace.Hex( S.VAL( ADDRESS, ucp ), -8 );  
+			Trace.String( ",  ucp = " );  Trace.Address( S.VAL( ADDRESS, ucp ) );  
 			Trace.String( ", traphandling  level = " ); Trace.Int( TrapHandlingLevel, 1 );  
 			Trace.Ln;  
 		END;  
-				
-		IF fatalerror THEN  
+		
+		IF fatalerror THEN 
 			w := unix.error  
 		ELSE  
 			w := TrapWriters.GetWriter();
 			w.Char( 1X );   (* begin of trap text *) 
 		END;
+
 		w.Ln;  
-		w.String( Machine.version ); w.String( "   " );  TimeTag( w );  w.Ln;
+		w.String( Machine.version ); w.String( "   " );  TimeTag( w );  w.Ln; 
 		IF TrapHandlingLevel = 1 THEN  
 			IF ~fatalerror THEN  Machine.Acquire( Machine.Trap )  END;
 			w.String( "Trap " ) 
 		ELSE  
-			w.String( "==== recursive Trap" )  
+			w.String( "[recursive Trap] " )  
 		END;  
 		CASE sig OF 
 		| 1:		w.String( "1 (Hangup signal)" );   
@@ -114,17 +119,18 @@ VAR
 				sp := ucp.mc.r_sp;
 				S.GET( sp, trapno );  w.Int( trapno, 0 );  
 				CASE trapno OF 
-				| 1:       w.String( "  (WITH guard failed)" ) 
-				| 2:       w.String( "  (CASE invalid)" ) 
-				| 3:       w.String( "  (RETURN missing)" ) 
-				| 5:       w.String( "  (Implicit type guard failed)" ) 
-				| 6:       w.String( "  (Type guard failed)" ) 
-				| 7:       w.String( "  (Index out of range)" ) 
-				| 8:       w.String( "  (ASSERT failed)" ) 
-				| 9:       w.String( "  (Array dimension error)" ) 
+				| 1:		w.String( "  (WITH guard failed)" ) 
+				| 2:		w.String( "  (CASE invalid)" ) 
+				| 3:		w.String( "  (RETURN missing)" ) 
+				| 5:		w.String( "  (implicit type guard failed)" ) 
+				| 6:		w.String( "  (type guard failed)" ) 
+				| 7:		w.String( "  (index out of range)" ) 
+				| 8:		w.String( "  (ASSERT failed)" ) 
+				| 9:		w.String( "  (array dimension error)" ) 
+				|12:	w.String( "  (division error)" )
 				ELSE 
 					IF trapno >= 30 THEN  w.String( "  (programmed HALT)" )  
-					ELSE  w.String( "  (unknown exception, division error?)" )   
+					ELSE  w.String( "  (unknown exception)" )   
 					END  
 				END;   
 		|  8:	w.String( "8 (Arithmetic exception)" );