diff options
| author | sewardj <unknown> | 2001-03-21 10:56:04 +0000 |
|---|---|---|
| committer | sewardj <unknown> | 2001-03-21 10:56:04 +0000 |
| commit | 44f0f21f7e788f76bb766bab6560f5e8d09826ef (patch) | |
| tree | 358943b5d4a6f64df9757a33327971054dbd6d16 | |
| parent | 7d61cc6a3e4bb5bdfed7bdf71e2a1e9cdd0187d8 (diff) | |
| download | haskell-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.
| -rw-r--r-- | ghc/includes/Bytecodes.h | 3 | ||||
| -rw-r--r-- | ghc/rts/Disassembler.c | 11 | ||||
| -rw-r--r-- | ghc/rts/Interpreter.c | 10 |
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"); |
