Mercurial > emacs
comparison src/chartab.c @ 97818:a4677d55715f
(optimize_sub_char_table): Perform more greedy optimization.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 29 Aug 2008 07:53:11 +0000 |
parents | 04a952ac356f |
children | f0ad9e3cb1a4 |
comparison
equal
deleted
inserted
replaced
97817:f15876e66681 | 97818:a4677d55715f |
---|---|
658 Lisp_Object table, test; | 658 Lisp_Object table, test; |
659 { | 659 { |
660 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); | 660 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); |
661 int depth = XINT (tbl->depth); | 661 int depth = XINT (tbl->depth); |
662 Lisp_Object elt, this; | 662 Lisp_Object elt, this; |
663 int i; | 663 int i, optimizable; |
664 | 664 |
665 elt = XSUB_CHAR_TABLE (table)->contents[0]; | 665 elt = XSUB_CHAR_TABLE (table)->contents[0]; |
666 if (SUB_CHAR_TABLE_P (elt)) | 666 if (SUB_CHAR_TABLE_P (elt)) |
667 elt = XSUB_CHAR_TABLE (table)->contents[0] | 667 elt = XSUB_CHAR_TABLE (table)->contents[0] |
668 = optimize_sub_char_table (elt, test); | 668 = optimize_sub_char_table (elt, test); |
669 if (SUB_CHAR_TABLE_P (elt)) | 669 optimizable = SUB_CHAR_TABLE_P (elt) ? 0 : 1; |
670 return table; | |
671 for (i = 1; i < chartab_size[depth]; i++) | 670 for (i = 1; i < chartab_size[depth]; i++) |
672 { | 671 { |
673 this = XSUB_CHAR_TABLE (table)->contents[i]; | 672 this = XSUB_CHAR_TABLE (table)->contents[i]; |
674 if (SUB_CHAR_TABLE_P (this)) | 673 if (SUB_CHAR_TABLE_P (this)) |
675 this = XSUB_CHAR_TABLE (table)->contents[i] | 674 this = XSUB_CHAR_TABLE (table)->contents[i] |
676 = optimize_sub_char_table (this, test); | 675 = optimize_sub_char_table (this, test); |
677 if (SUB_CHAR_TABLE_P (this) | 676 if (optimizable |
678 || (NILP (test) ? NILP (Fequal (this, elt)) /* defaults to `equal'. */ | 677 && (NILP (test) ? NILP (Fequal (this, elt)) /* defaults to `equal'. */ |
679 : EQ (test, Qeq) ? !EQ (this, elt) /* Optimize `eq' case. */ | 678 : EQ (test, Qeq) ? !EQ (this, elt) /* Optimize `eq' case. */ |
680 : NILP (call2 (test, this, elt)))) | 679 : NILP (call2 (test, this, elt)))) |
681 break; | 680 optimizable = 0; |
682 } | 681 } |
683 | 682 |
684 return (i < chartab_size[depth] ? table : elt); | 683 return (optimizable ? elt : table); |
685 } | 684 } |
686 | 685 |
687 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table, | 686 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table, |
688 1, 2, 0, | 687 1, 2, 0, |
689 doc: /* Optimize CHAR-TABLE. | 688 doc: /* Optimize CHAR-TABLE. |