From c516c1e734ec47445fd392a649e11111dcc69474 Mon Sep 17 00:00:00 2001 From: Bert Wesarg Date: Tue, 10 Nov 2009 16:55:56 +0100 Subject: [PATCH] re-import $macro_backtrace patch and improve it by adding $n_args and $args --- macro_backtrace.patch | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++ series | 1 + 2 files changed, 201 insertions(+) create mode 100644 macro_backtrace.patch diff --git a/macro_backtrace.patch b/macro_backtrace.patch new file mode 100644 index 0000000..37252e1 --- /dev/null +++ b/macro_backtrace.patch @@ -0,0 +1,200 @@ +--- + + source/built-ins.h | 1 + source/highlightData.c | 2 + source/interpret.c | 118 ++++++++++++++++++++++++++++++++++++++++--------- + source/interpret.h | 2 + source/macro.c | 6 ++ + 5 files changed, 107 insertions(+), 22 deletions(-) + +diff --quilt old/source/interpret.c new/source/interpret.c +--- old/source/interpret.c ++++ new/source/interpret.c +@@ -85,6 +85,7 @@ static RestartData *setContext(RestartDa + static int returnValOrNone(int valOnStack); + static int branchIf(Boolean trueOrFalse); + static int namedArg1orN(Boolean isFirst); ++static int getArgArray(DataValue *fp, DataValue **argArray, char **errMsg); + + static int callSubroutineFromSymbol(Symbol *sym, int nArgs); + static int concatenateNwithSep(int nVals, const char *sep, char **result, +@@ -1617,32 +1618,16 @@ static int pushArgCount(void) + + static int pushArgArray(void) + { +- int nArgs, argNum; +- DataValue argVal, *argArray; +- Boolean needArgCopy = False; ++ DataValue *argArray; ++ char *errMsg; + + STACKDUMP(0, 3); + +- nArgs = FP_GET_ARG_COUNT(FrameP); +- argArray = &FP_GET_ARG_ARRAY(FrameP); +- if (argArray->tag != ARRAY_TAG) { +- /* we require a real array in the argArray position */ +- argArray->tag = ARRAY_TAG; +- argArray->val.arrayPtr = ArrayNew(); +- needArgCopy = True; +- } ++ if (!getArgArray(FrameP, &argArray, &errMsg)) ++ EXEC_ERROR(errMsg, NULL); + +- if (needArgCopy || (nArgs && !ArrayGet(argArray, (char *)"1", &argVal))) { +- /* load arguments from positional arg list if not already done */ +- for (argNum = 0; argNum < nArgs; ++argNum) { +- argVal = FP_GET_ARG_N(FrameP, argNum); +- if (!ArrayInsert(argArray, AllocStringOfNumber(argNum + 1), +- &argVal)) { +- EXEC_ERROR("argument array insertion failure", NULL); +- } +- } +- } + PUSH(*argArray); ++ + return STAT_OK; + } + +@@ -5137,3 +5122,94 @@ static void stackdump(RestartData *conte + + #endif /* ifdef DEBUG_STACK */ + ++static int getArgArray(DataValue *fp, DataValue **argArray, char **errMsg) ++{ ++ int nArgs, argNum; ++ DataValue argVal; ++ Boolean needArgCopy = False; ++ ++ nArgs = FP_GET_ARG_COUNT(fp); ++ *argArray = &FP_GET_ARG_ARRAY(fp); ++ if ((*argArray)->tag != ARRAY_TAG) { ++ /* we require a real array in the argArray position */ ++ (*argArray)->tag = ARRAY_TAG; ++ (*argArray)->val.arrayPtr = ArrayNew(); ++ needArgCopy = True; ++ } ++ ++ if (needArgCopy || (nArgs && !ArrayGet(*argArray, (char *)"1", &argVal))) { ++ /* load arguments from positional arg list if not already done */ ++ for (argNum = 0; argNum < nArgs; ++argNum) { ++ argVal = FP_GET_ARG_N(fp, argNum); ++ if (!ArrayInsert(*argArray, AllocStringOfNumber(argNum + 1), ++ &argVal)) { ++ *errMsg = "argument array insertion failure"; ++ return False; ++ } ++ } ++ } ++ return True; ++} ++ ++int GetBacktrace(DataValue *bt, char **errMsg) ++{ ++ DataValue *fp = FrameP; ++ Inst *pc; ++ int i = 0; ++ ++ bt->tag = ARRAY_TAG; ++ bt->val.arrayPtr = ArrayNew(); ++ ++ do { ++ int nArgs = FP_GET_ARG_COUNT(fp); ++ DataValue btVal; ++ DataValue valueVal = {NO_TAG, {0}}; ++ DataValue *argArray; ++ ++ btVal.tag = ARRAY_TAG; ++ btVal.val.arrayPtr = ArrayNew(); ++ ++ valueVal.tag = STRING_TAG; ++ if (!AllocNStringNCpy(&valueVal.val.str, ++ FP_GET_NAME(fp).rep, FP_GET_NAME(fp).len)) { ++ *errMsg = "backtrace array insertion failure"; ++ return False; ++ } ++ if (!ArrayInsert(&btVal, PERM_ALLOC_STR("name"), &valueVal)) { ++ *errMsg = "backtrace array insertion failure"; ++ return False; ++ } ++ ++ valueVal.tag = INT_TAG; ++ valueVal.val.n = nArgs; ++ if (!ArrayInsert(&btVal, PERM_ALLOC_STR("n_args"), &valueVal)) { ++ *errMsg = "backtrace array insertion failure"; ++ return False; ++ } ++ ++ if (!getArgArray(fp, &argArray, errMsg)) { ++ return False; ++ } ++ if (STAT_OK != ArrayCopy(&valueVal, argArray)) { ++ *errMsg = "backtrace array copy failure"; ++ return False; ++ } ++ if (!ArrayInsert(&btVal, PERM_ALLOC_STR("args"), &valueVal)) { ++ *errMsg = "backtrace array insertion failure"; ++ return False; ++ } ++ ++ /* future: add source code location information */ ++ ++ if (!ArrayInsert(bt, AllocStringOfNumber(i), &btVal)) { ++ *errMsg = "backtrace array insertion failure"; ++ return False; ++ } ++ ++ pc = FP_GET_RET_PC(fp); ++ fp = FP_GET_OLD_FP(fp); ++ i++; ++ } while (pc); ++ ++ return True; ++} +diff --quilt old/source/interpret.h new/source/interpret.h +--- old/source/interpret.h ++++ new/source/interpret.h +@@ -220,5 +220,7 @@ int StringToNumEnd(const char *string, c + const char *longAsStr(long val); + int lenLongAsStr(long val); + ++int GetBacktrace(DataValue *bt, char **errMsg); ++ + #endif /* NEDIT_INTERPRET_H_INCLUDED */ + +diff --quilt old/source/macro.c new/source/macro.c +--- old/source/macro.c ++++ new/source/macro.c +@@ -7210,6 +7210,12 @@ static int toColumnMS(WindowInfo *window + return True; + } + ++static int macroBacktraceMV(WindowInfo *window, DataValue *argList, ++ int nArgs, DataValue *result, char **errMsg) ++{ ++ return GetBacktrace(result, errMsg); ++} ++ + static int wrongNArgsErr(char **errMsg) + { + *errMsg = "Wrong number of arguments to function %s"; +diff --quilt old/source/built-ins.h new/source/built-ins.h +--- old/source/built-ins.h ++++ new/source/built-ins.h +@@ -133,3 +133,4 @@ MV(rangeset_list, rangesetList) + MV(VERSION, version) + MV(NEDIT_HOME, neditHome) + MV(transient, transient) ++MV(macro_backtrace, macroBacktrace) +diff --quilt old/source/highlightData.c new/source/highlightData.c +--- old/source/highlightData.c ++++ new/source/highlightData.c +@@ -553,7 +553,7 @@ static char *DefaultPatternSets[] = { + Comment:\"#\":\"$\"::Comment::\n\ + Built-in Misc Vars:\"(?\":::Identifier::\n\ + Built-in Pref Vars:\"(?\":::Identifier2::\n\ +- Built-in Special Vars:\"(?\":::String1::\n\ ++ Built-in Special Vars:\"(?\":::String1::\n\ + Built-in Subrs:\"<(?:args|append_file|beep|call|calltip|clipboard_to_string|define|dialog|eval|filename_dialog|dict_(?:insert|complete|save|append|is_element)|e_print|escape_literal|focus_window|get_character|get_matching|get_pattern_(by_name|at_pos)|get_range|get_selection|get_style_(by_name|at_pos)|getenv|highlight_calltip_line|kill_calltip|length|list_dialog|max|min|n_args|rangeset_(?:add|create|destroy|get_by_name|includes|info|invert|range|set_color|set_mode|set_name|subtract)|read_file|replace_in_string|replace_range|replace_selection|replace_substring|search|search_string|select|select_rectangle|set_cursor_pos|set_transient|set_window_title|shell_command|split|string_compare|string_dialog|string_to_clipboard|substring|t_print|timer_(?:add|remove)|to_(?:column|line|pos)|tolower|toupper|valid_number|write_file)(?=\\s*\\()\":::Subroutine::\n\ + Menu Actions:\"<(?:new(?:_tab|_opposite)?|open|open-dialog|open_dialog|open-selected|open_selected|close|save|save-as|save_as|save-as-dialog|save_as_dialog|revert-to-saved|revert_to_saved|revert_to_saved_dialog|include-file|include_file|include-file-dialog|include_file_dialog|load-macro-file|load_macro_file|load-macro-file-dialog|load_macro_file_dialog|load-tags-file|load_tags_file|load-tags-file-dialog|load_tags_file_dialog|unload_tags_file|load_tips_file|load_tips_file_dialog|unload_tips_file|print|print-selection|print_selection|exit|undo|redo|delete|select-all|select_all|shift-left|shift_left|shift-left-by-tab|shift_left_by_tab|shift-right|shift_right|shift-right-by-tab|shift_right_by_tab|find|find-dialog|find_dialog|find-again|find_again|find-selection|find_selection|find_incremental|start_incremental_find|replace|replace-dialog|replace_dialog|replace-all|replace_all|replace-in-selection|replace_in_selection|replace-again|replace_again|replace_find|replace_find_same|replace_find_again|goto-line-number|goto_line_number|goto-line-number-dialog|goto_line_number_dialog|goto-selected|goto_selected|mark|mark-dialog|mark_dialog|goto-mark|goto_mark|goto-mark-dialog|goto_mark_dialog|match|select_to_matching|goto_matching|find-definition|find_definition|show_tip|split-pane|split_pane|close-pane|close_pane|detach_document(?:_dialog)?|move_document_dialog|(?:next|previous|last)_document|uppercase|lowercase|fill-paragraph|fill_paragraph|control-code-dialog|control_code_dialog|filter-selection-dialog|filter_selection_dialog|filter-selection|filter_selection|execute-command|execute_command|execute-command-dialog|execute_command_dialog|execute-command-line|execute_command_line|shell-menu-command|shell_menu_command|macro-menu-command|macro_menu_command|bg_menu_command|post_window_bg_menu|post_tab_context_menu|beginning-of-selection|beginning_of_selection|end-of-selection|end_of_selection|repeat_macro|repeat_dialog|raise_window|focus_pane|set_statistics_line|set_incremental_search_line|set_show_line_numbers|set_auto_indent|set_wrap_text|set_wrap_margin|set_highlight_syntax|set_make_backup_copy|set_incremental_backup|set_show_matching|set_match_syntax_based|set_overtype_mode|set_locked|set_tab_dist|set_em_tab_dist|set_use_tabs|set_fonts|set_language_mode)(?=\\s*\\()\":::Subroutine::\n\ + Text Actions:\"<(?:self-insert|self_insert|grab-focus|grab_focus|extend-adjust|extend_adjust|extend-start|extend_start|extend-end|extend_end|secondary-adjust|secondary_adjust|secondary-or-drag-adjust|secondary_or_drag_adjust|secondary-start|secondary_start|secondary-or-drag-start|secondary_or_drag_start|process-bdrag|process_bdrag|move-destination|move_destination|move-to|move_to|move-to-or-end-drag|move_to_or_end_drag|end_drag|copy-to|copy_to|copy-to-or-end-drag|copy_to_or_end_drag|exchange|process-cancel|process_cancel|paste-clipboard|paste_clipboard|copy-clipboard|copy_clipboard|cut-clipboard|cut_clipboard|copy-primary|copy_primary|cut-primary|cut_primary|newline|newline-and-indent|newline_and_indent|newline-no-indent|newline_no_indent|delete-selection|delete_selection|delete-previous-character|delete_previous_character|delete-next-character|delete_next_character|delete-previous-word|delete_previous_word|delete-next-word|delete_next_word|delete-to-start-of-line|delete_to_start_of_line|delete-to-end-of-line|delete_to_end_of_line|forward-character|forward_character|backward-character|backward_character|key-select|key_select|process-up|process_up|process-down|process_down|process-shift-up|process_shift_up|process-shift-down|process_shift_down|process-home|process_home|forward-word|forward_word|backward-word|backward_word|forward-paragraph|forward_paragraph|backward-paragraph|backward_paragraph|beginning-of-line|beginning_of_line|end-of-line|end_of_line|beginning-of-file|beginning_of_file|end-of-file|end_of_file|next-page|next_page|previous-page|previous_page|page-left|page_left|page-right|page_right|toggle-overstrike|toggle_overstrike|scroll-up|scroll_up|scroll-down|scroll_down|scroll_left|scroll_right|scroll-to-line|scroll_to_line|select-all|select_all|select_word|deselect-all|deselect_all|focusIn|focusOut|process-return|process_return|process-tab|process_tab|insert-string|insert_string|mouse_pan)(?=\\s*\\()\":::Subroutine::\n\ diff --git a/series b/series index da7cf4c..e442d2b 100644 --- a/series +++ b/series @@ -157,3 +157,4 @@ listDialogKeyWords.diff newTabTab.patch remote-nc.patch motifless-nc.patch +macro_backtrace.patch -- 2.11.4.GIT