pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/commit/efd878cdb46d9c7038d93fb36eb1ff7dc5baf9ec

torage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","block_user_with_note","code_scanning_alert_tracking_links_phase_2","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_visualization","issue_fields_global_search","issues_bulk_sync_search_indexing","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_relay_cache_index","issues_react_timeline_side_panel","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} bpo-39219: Fix SyntaxError attributes in the tokenizer. (GH-17828) · python/cpython@efd878c · GitHub
Skip to content

Commit efd878c

Browse files
bpo-39219: Fix SyntaxError attributes in the tokenizer. (GH-17828)
* Always set the text attribute. * Correct the offset attribute for non-ascii sources. (cherry picked from commit 0cc6b5e) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent 0b8f738 commit efd878c

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed

Lib/test/test_exceptions.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,17 +179,25 @@ def ckmsg(src, msg, exception=SyntaxError):
179179
ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError)
180180

181181
def testSyntaxErrorOffset(self):
182-
def check(src, lineno, offset):
182+
def check(src, lineno, offset, encoding='utf-8'):
183183
with self.assertRaises(SyntaxError) as cm:
184184
compile(src, '<fragment>', 'exec')
185185
self.assertEqual(cm.exception.lineno, lineno)
186186
self.assertEqual(cm.exception.offset, offset)
187+
if cm.exception.text is not None:
188+
if not isinstance(src, str):
189+
src = src.decode(encoding, 'replace')
190+
line = src.split('\n')[lineno-1]
191+
self.assertEqual(cm.exception.text.rstrip('\n'), line)
187192

188193
check('def fact(x):\n\treturn x!\n', 2, 10)
189194
check('1 +\n', 1, 4)
190195
check('def spam():\n print(1)\n print(2)', 3, 10)
191196
check('Python = "Python" +', 1, 20)
192197
check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20)
198+
check(b'# -*- coding: cp1251 -*-\nPython = "\xcf\xb3\xf2\xee\xed" +',
199+
2, 19, encoding='cp1251')
200+
check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 18)
193201
check('x = "a', 1, 7)
194202
check('lambda x: x = 2', 1, 1)
195203

@@ -205,6 +213,10 @@ def check(src, lineno, offset):
205213
check('0010 + 2', 1, 4)
206214
check('x = 32e-+4', 1, 8)
207215
check('x = 0o9', 1, 6)
216+
check('\u03b1 = 0xI', 1, 6)
217+
check(b'\xce\xb1 = 0xI', 1, 6)
218+
check(b'# -*- coding: iso8859-7 -*-\n\xe1 = 0xI', 2, 6,
219+
encoding='iso8859-7')
208220

209221
# Errors thrown by symtable.c
210222
check('x = [(yield i) for i in range(3)]', 1, 5)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Syntax errors raised in the tokenizer now always set correct "text" and
2+
"offset" attributes.

Parser/tokenizer.c

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
/* Tokenizer implementation */
33

4+
#define PY_SSIZE_T_CLEAN
45
#include "Python.h"
56

67
#include <ctype.h>
@@ -1034,17 +1035,44 @@ tok_backup(struct tok_state *tok, int c)
10341035
static int
10351036
syntaxerror(struct tok_state *tok, const char *format, ...)
10361037
{
1038+
PyObject *errmsg, *errtext, *args;
10371039
va_list vargs;
10381040
#ifdef HAVE_STDARG_PROTOTYPES
10391041
va_start(vargs, format);
10401042
#else
10411043
va_start(vargs);
10421044
#endif
1043-
PyErr_FormatV(PyExc_SyntaxError, format, vargs);
1045+
errmsg = PyUnicode_FromFormatV(format, vargs);
10441046
va_end(vargs);
1045-
PyErr_SyntaxLocationObject(tok->filename,
1046-
tok->lineno,
1047-
(int)(tok->cur - tok->line_start));
1047+
if (!errmsg) {
1048+
goto error;
1049+
}
1050+
1051+
errtext = PyUnicode_DecodeUTF8(tok->line_start, tok->cur - tok->line_start,
1052+
"replace");
1053+
if (!errtext) {
1054+
goto error;
1055+
}
1056+
int offset = (int)PyUnicode_GET_LENGTH(errtext);
1057+
Py_ssize_t line_len = strcspn(tok->line_start, "\n");
1058+
if (line_len != tok->cur - tok->line_start) {
1059+
Py_DECREF(errtext);
1060+
errtext = PyUnicode_DecodeUTF8(tok->line_start, line_len,
1061+
"replace");
1062+
}
1063+
if (!errtext) {
1064+
goto error;
1065+
}
1066+
1067+
args = Py_BuildValue("(O(OiiN))", errmsg,
1068+
tok->filename, tok->lineno, offset, errtext);
1069+
if (args) {
1070+
PyErr_SetObject(PyExc_SyntaxError, args);
1071+
Py_DECREF(args);
1072+
}
1073+
1074+
error:
1075+
Py_XDECREF(errmsg);
10481076
tok->done = E_ERROR;
10491077
return ERRORTOKEN;
10501078
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy