Hi Arnold, The current TOK_SWITCH/TOK_CASE code clearly prefers simplicity over performance and features. It was just fine for OTCC but I agree with you it should be improved.
However, I don't like this patch, because it adds time+space complexity without improving generated code in any way. Also, case ranges are not handled properly (eg 1..3 + 2 are incorrectly accepted). With just a little bit more effort, you can do much better. - switch_start: generate code that loads a reference to the case table and calls a function in libtcc. - TOK_CASE: add a literal (or literal range) to the table. Don't generate any code, just gather current code offsets. - switch_end: sort the table. Check for duplicates (now that's for free). Emit the table to some section (if it's not the current code section you don't have to generate extra jumps), and fix up the symbol reference taken in switch_start. The runtime function performs a binary search over the sorted array and jumps to the corresponding code block. Things as defaults and case ranges make it a bit more complex. Also, note that switch statements can be nested.. Still, even with all this in place, I believe it probably should not be significantly more difficult than this. regards, Zdenek
_______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel