summaryrefslogtreecommitdiffstats
path: root/byterun/fix_code.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1996-11-08 14:46:01 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1996-11-08 14:46:01 +0000
commit075de261f8c048a1820283cb327330fa25ef43e3 (patch)
treefe4fdb1aa933b039ddc5f7efd81a14b1cefafdea /byterun/fix_code.c
parent0bdb8a39b408db9d9ec416965073012317f85afb (diff)
Ajout de callback.[ch].
interp.c, mlvalues.h, signals.c: deplacement du code de callback dans callback.c startup.c: debug de caml_startup git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1182 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'byterun/fix_code.c')
-rw-r--r--byterun/fix_code.c69
1 files changed, 12 insertions, 57 deletions
diff --git a/byterun/fix_code.c b/byterun/fix_code.c
index 54bc53771..363fbbb5a 100644
--- a/byterun/fix_code.c
+++ b/byterun/fix_code.c
@@ -43,19 +43,16 @@ void fixup_endianness(code, len)
void ** instr_table;
-#if macintosh
-
void thread_code (code_t code, asize_t len)
{
code_t p;
int l [STOP + 1];
int i;
- for (i = 0; i <= STOP; i++){
+ for (i = 0; i <= STOP; i++) {
l [i] = 0;
}
-
- /* Instructions with one operand */
+ /* Instructions with one operand */
l[PUSHACC] = l[ACC] = l[POP] = l[ASSIGN] =
l[PUSHENVACC] = l[ENVACC] = l[PUSH_RETADDR] = l[APPLY] =
l[APPTERM1] = l[APPTERM2] = l[APPTERM3] = l[RETURN] =
@@ -66,69 +63,27 @@ void thread_code (code_t code, asize_t len)
l[C_CALL1] = l[C_CALL2] = l[C_CALL3] = l[C_CALL4] = l[C_CALL5] =
l[CONSTINT] = l[PUSHCONSTINT] = l[OFFSETINT] = l[OFFSETREF] = 1;
- /* Instructions with two operands */
+ /* Instructions with two operands */
l[APPTERM] = l[CLOSURE] = l[CLOSUREREC] = l[PUSHGETGLOBALFIELD] =
l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[C_CALLN] = 2;
len /= sizeof(opcode_t);
for (p = code; p < code + len; /*nothing*/) {
opcode_t instr = *p;
- if (instr < 0 || instr > STOP){
- fatal_error_arg ("Fatal error: bad opcode (%lx)\n", (void *) instr);
- }
- *p++ = (opcode_t)((unsigned long)(instr_table[instr]));
- if (instr == SWITCH){
- uint32 sizes = *p++;
- uint32 const_size = sizes & 0xFFFF;
- uint32 block_size = sizes >> 16;
- p += const_size + block_size;
- }else{
- p += l[instr];
+ if (instr < 0 || instr > STOP){
+ fatal_error_arg ("Fatal error: bad opcode (%lx)\n", (void *) instr);
}
- }
- Assert(p == code + len);
-}
-
-#else
-
-void thread_code(code, len)
- code_t code;
- asize_t len;
-{
- code_t p;
- len /= sizeof(opcode_t);
- for (p = code; p < code + len; /*nothing*/) {
- opcode_t instr = *p;
- Assert(instr >= 0 && instr <= STOP);
*p++ = (opcode_t)((unsigned long)(instr_table[instr]));
- switch(instr) {
- /* Instructions with one operand */
- case PUSHACC: case ACC: case POP: case ASSIGN:
- case PUSHENVACC: case ENVACC: case PUSH_RETADDR: case APPLY:
- case APPTERM1: case APPTERM2: case APPTERM3: case RETURN:
- case GRAB: case PUSHGETGLOBAL: case GETGLOBAL: case SETGLOBAL:
- case PUSHATOM: case ATOM: case MAKEBLOCK1: case MAKEBLOCK2:
- case MAKEBLOCK3: case GETFIELD: case SETFIELD: case DUMMY:
- case BRANCH: case BRANCHIF: case BRANCHIFNOT: case PUSHTRAP:
- case C_CALL1: case C_CALL2: case C_CALL3: case C_CALL4: case C_CALL5:
- case CONSTINT: case PUSHCONSTINT: case OFFSETINT: case OFFSETREF:
- p += 1; break;
- /* Instructions with two operands */
- case APPTERM: case CLOSURE: case CLOSUREREC: case PUSHGETGLOBALFIELD:
- case GETGLOBALFIELD: case MAKEBLOCK: case C_CALLN:
- p += 2; break;
- /* Instructions with N+1 operands */
- case SWITCH:
- { uint32 sizes = *p++;
- uint32 const_size = sizes & 0xFFFF;
- uint32 block_size = sizes >> 16;
- p += const_size + block_size;
- break; }
+ if (instr == SWITCH) {
+ uint32 sizes = *p++;
+ uint32 const_size = sizes & 0xFFFF;
+ uint32 block_size = sizes >> 16;
+ p += const_size + block_size;
+ } else {
+ p += l[instr];
}
}
Assert(p == code + len);
}
-#endif /* macintosh */
-
#endif /* THREAD_CODE */