diff --git a/TeXmacs/tests/tmu/201_71.tmu b/TeXmacs/tests/tmu/201_71.tmu new file mode 100644 index 0000000000..751d7d802b --- /dev/null +++ b/TeXmacs/tests/tmu/201_71.tmu @@ -0,0 +1,18 @@ +> + +> + +<\body> + <\hide-preamble> + |>> + + + 1111 + + +<\initial> + <\collection> + + + + diff --git a/devel/201_71.md b/devel/201_71.md new file mode 100644 index 0000000000..97c9e5762f --- /dev/null +++ b/devel/201_71.md @@ -0,0 +1,9 @@ +# [201_71] 修复导言区调用未定义的宏导致软件crash问题 + +## 如何测试 +1. 打开 git/mogan/TeXmacs/tests/tmu/201_71.tmu 文件 +2. `Ctrl+Shift+p`进入导言区 +3. 鼠标光标移动到`backcolor`后回车应该不会导致软件闪退问题 + + + diff --git a/src/Typeset/Env/env_exec.cpp b/src/Typeset/Env/env_exec.cpp index 285d78fd16..1075e93be3 100644 --- a/src/Typeset/Env/env_exec.cpp +++ b/src/Typeset/Env/env_exec.cpp @@ -560,6 +560,7 @@ edit_env_rep::exec (tree t) { return exec_frame_inverse (t); default: + if (L (t) == UNINIT) return t; if (L (t) < START_EXTENSIONS) { int i, n= N (t); // cout << "Executing " << t << "\n"; @@ -659,7 +660,7 @@ edit_env_rep::exec_with (tree t) { write_update (vars[i], newv[i]); tree r= exec (t[n - 1]); for (i= k - 1; i >= 0; i--) - write_update (vars[i], oldv[i]); + if (L (oldv[i]) != UNINIT) write_update (vars[i], oldv[i]); tree u (WITH, n); for (i= 0; i < k; i++) { @@ -852,7 +853,11 @@ edit_env_rep::exec_value (tree t) { if (N (t) < 1) return tree (ERROR, "bad value"); tree r= exec (t[0]); if (is_compound (r)) return tree (ERROR, "bad value"); - return exec (read (r->label)); + string name= r->label; + if (!provides (name)) return ""; + tree value= read (name); + if (L (value) == UNINIT) return ""; + return exec (value); } tree @@ -2667,7 +2672,7 @@ edit_env_rep::exec_until_with (tree t, path p, string var, int level) { return true; } for (i= k - 1; i >= 0; i--) - write_update (vars[i], oldv[i]); + if (L (oldv[i]) != UNINIT) write_update (vars[i], oldv[i]); STACK_DELETE_ARRAY (vars); STACK_DELETE_ARRAY (oldv); STACK_DELETE_ARRAY (newv);