summaryrefslogtreecommitdiff
path: root/ghc
diff options
context:
space:
mode:
authorsewardj <unknown>2001-03-21 10:56:04 +0000
committersewardj <unknown>2001-03-21 10:56:04 +0000
commit44f0f21f7e788f76bb766bab6560f5e8d09826ef (patch)
tree358943b5d4a6f64df9757a33327971054dbd6d16 /ghc
parent7d61cc6a3e4bb5bdfed7bdf71e2a1e9cdd0187d8 (diff)
downloadhaskell-44f0f21f7e788f76bb766bab6560f5e8d09826ef.tar.gz
[project @ 2001-03-21 10:56:04 by sewardj]
RTS support for the ugly tagToEnum# hack. Actually a very general thing -- just a bytecode unconditional jump, so we can do more general control-flow in BCOs.
Diffstat (limited to 'ghc')
-rw-r--r--ghc/includes/Bytecodes.h3
-rw-r--r--ghc/rts/Disassembler.c11
-rw-r--r--ghc/rts/Interpreter.c10
3 files changed, 19 insertions, 5 deletions
diff --git a/ghc/includes/Bytecodes.h b/ghc/includes/Bytecodes.h
index 7e1cd049d6..2e7842e844 100644
--- a/ghc/includes/Bytecodes.h
+++ b/ghc/includes/Bytecodes.h
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------------------
- * $Id: Bytecodes.h,v 1.5 2001/02/06 12:01:00 sewardj Exp $
+ * $Id: Bytecodes.h,v 1.6 2001/03/21 10:56:04 sewardj Exp $
*
* (c) The GHC Team, 1998-2000
*
@@ -51,6 +51,7 @@
#define bci_ENTER 24
#define bci_RETURN 25
#define bci_STKCHECK 26
+#define bci_JMP 27
/* If a BCO definitely requires less than this many words of stack,
diff --git a/ghc/rts/Disassembler.c b/ghc/rts/Disassembler.c
index 7e3307918b..27b6848d31 100644
--- a/ghc/rts/Disassembler.c
+++ b/ghc/rts/Disassembler.c
@@ -5,8 +5,8 @@
* Copyright (c) 1994-1998.
*
* $RCSfile: Disassembler.c,v $
- * $Revision: 1.19 $
- * $Date: 2001/02/11 17:51:07 $
+ * $Revision: 1.20 $
+ * $Date: 2001/03/21 10:56:04 $
* ---------------------------------------------------------------------------*/
#ifdef DEBUG
@@ -98,6 +98,13 @@ int disInstr ( StgBCO *bco, int pc )
fprintf(stderr, "\n");
pc += 2; break;
+ case bci_CASEFAIL:
+ fprintf(stderr, "CASEFAIL\n" );
+ break;
+ case bci_JMP:
+ fprintf(stderr, "JMP to %d\n", instrs[pc]);
+ pc += 1; break;
+
case bci_TESTLT_I:
fprintf(stderr, "TESTLT_I %d, fail to %d\n", literals[instrs[pc]],
instrs[pc+1]);
diff --git a/ghc/rts/Interpreter.c b/ghc/rts/Interpreter.c
index 2f04ad9aeb..ccbac4a43b 100644
--- a/ghc/rts/Interpreter.c
+++ b/ghc/rts/Interpreter.c
@@ -5,8 +5,8 @@
* Copyright (c) 1994-2000.
*
* $RCSfile: Interpreter.c,v $
- * $Revision: 1.20 $
- * $Date: 2001/02/15 14:30:07 $
+ * $Revision: 1.21 $
+ * $Date: 2001/03/21 10:56:04 $
* ---------------------------------------------------------------------------*/
#include "Rts.h"
@@ -738,6 +738,12 @@ StgThreadReturnCode interpretBCO ( Capability* cap )
}
}
+ case bci_JMP: {
+ /* BCO_NEXT modifies bciPtr, so be conservative. */
+ int nextpc = BCO_NEXT;
+ bciPtr = nextpc;
+ goto nextInsn;
+ }
case bci_CASEFAIL:
barf("interpretBCO: hit a CASEFAIL");