fixed non-sequential not having a correct default case
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40114
This commit is contained in:
parent
9bc1279af1
commit
8fe4440b10
@ -1364,10 +1364,15 @@ inline void WriteOp_Switch(JitWriter *jit)
|
|||||||
{
|
{
|
||||||
jit->write_uint32(base + RelocLookup(jit, cases[i].offs, false));
|
jit->write_uint32(base + RelocLookup(jit, cases[i].offs, false));
|
||||||
}
|
}
|
||||||
|
//if we get here, there was a bug in the JIT, so we should break into the debugger
|
||||||
|
jit->write_ubyte(IA32_INT3);
|
||||||
} else {
|
} else {
|
||||||
/* The slow version. Go through each case and generate a check.
|
/* The slow version. Go through each case and generate a check.
|
||||||
* In the future we should replace case tables of more than ~8 cases with a
|
* In the future we should replace case tables of more than ~8 cases with a
|
||||||
* hash table lookup.
|
* hash table lookup.
|
||||||
|
* :THOUGHT: Another method of optimizing this - fill in the gaps with jumps to the default case,
|
||||||
|
* but only if we're under N cases or so!
|
||||||
|
* :THOUGHT: Write out a static btree lookup :)
|
||||||
*/
|
*/
|
||||||
cell_t val;
|
cell_t val;
|
||||||
for (cell_t i=0; i<num_cases; i++)
|
for (cell_t i=0; i<num_cases; i++)
|
||||||
@ -1382,9 +1387,9 @@ inline void WriteOp_Switch(JitWriter *jit)
|
|||||||
}
|
}
|
||||||
IA32_Jump_Cond_Imm32_Abs(jit, CC_E, RelocLookup(jit, cases[i].offs, false));
|
IA32_Jump_Cond_Imm32_Abs(jit, CC_E, RelocLookup(jit, cases[i].offs, false));
|
||||||
}
|
}
|
||||||
|
/* After all this, jump to the default case! */
|
||||||
|
IA32_Jump_Imm32_Abs(jit, RelocLookup(jit, *tbl, false));
|
||||||
}
|
}
|
||||||
//if we get here, there was a bug in the JIT, so we should break into the debugger
|
|
||||||
jit->write_ubyte(IA32_INT3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user