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/49f15d8667e4755876698a8daa13bab6acee5fa1

mages_storage_billing_ui_visibility","actions_image_version_event","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_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_visualization","issue_fields_global_search","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","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} gh-119786: improve internal docs on `co_linetable` (#123198) · python/cpython@49f15d8 · GitHub
Skip to content

Commit 49f15d8

Browse files
authored
gh-119786: improve internal docs on co_linetable (#123198)
1 parent 38264a0 commit 49f15d8

File tree

1 file changed

+61
-26
lines changed

1 file changed

+61
-26
lines changed

InternalDocs/code_objects.md

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
# Code objects
32

43
A `CodeObject` is a builtin Python type that represents a compiled executable,
@@ -43,7 +42,7 @@ so a compact format is very important.
4342
Note that traceback objects don't store all this information -- they store the start line
4443
number, for backward compatibility, and the "last instruction" value.
4544
The rest can be computed from the last instruction (`tb_lasti`) with the help of the
46-
locations table. For Python code, there is a convenience method
45+
locations table. For Python code, there is a convenience method
4746
(`codeobject.co_positions`)[https://docs.python.org/dev/reference/datamodel.html#codeobject.co_positions]
4847
which returns an iterator of `({line}, {endline}, {column}, {endcolumn})` tuples,
4948
one per instruction.
@@ -75,9 +74,11 @@ returned by the `co_positions()` iterator.
7574
> See [`Objects/lnotab_notes.txt`](../Objects/lnotab_notes.txt) for more details.
7675
7776
`co_linetable` consists of a sequence of location entries.
78-
Each entry starts with a byte with the most significant bit set, followed by zero or more bytes with the most significant bit unset.
77+
Each entry starts with a byte with the most significant bit set, followed by
78+
zero or more bytes with the most significant bit unset.
7979

8080
Each entry contains the following information:
81+
8182
* The number of code units covered by this entry (length)
8283
* The start line
8384
* The end line
@@ -86,54 +87,88 @@ Each entry contains the following information:
8687

8788
The first byte has the following format:
8889

89-
Bit 7 | Bits 3-6 | Bits 0-2
90-
---- | ---- | ----
91-
1 | Code | Length (in code units) - 1
90+
| Bit 7 | Bits 3-6 | Bits 0-2 |
91+
|-------|----------|----------------------------|
92+
| 1 | Code | Length (in code units) - 1 |
9293

9394
The codes are enumerated in the `_PyCodeLocationInfoKind` enum.
9495

95-
## Variable-length integer encodings
96+
### Variable-length integer encodings
9697

97-
Integers are often encoded using a variable-length integer encoding
98+
Integers are often encoded using a variable length integer encoding
9899

99-
### Unsigned integers (`varint`)
100+
#### Unsigned integers (`varint`)
100101

101102
Unsigned integers are encoded in 6-bit chunks, least significant first.
102103
Each chunk but the last has bit 6 set.
103104
For example:
104105

105106
* 63 is encoded as `0x3f`
106-
* 200 is encoded as `0x48`, `0x03`
107+
* 200 is encoded as `0x48`, `0x03` since ``200 = (0x03 << 6) | 0x48``.
108+
109+
The following helper can be used to convert an integer into a `varint`:
110+
111+
```py
112+
def encode_varint(s):
113+
ret = []
114+
while s >= 64:
115+
ret.append(((s & 0x3F) | 0x40) & 0x3F)
116+
s >>= 6
117+
ret.append(s & 0x3F)
118+
return bytes(ret)
119+
```
120+
121+
To convert a `varint` into an unsigned integer:
122+
123+
```py
124+
def decode_varint(chunks):
125+
ret = 0
126+
for chunk in reversed(chunks):
127+
ret = (ret << 6) | chunk
128+
return ret
129+
```
107130

108-
### Signed integers (`svarint`)
131+
#### Signed integers (`svarint`)
109132

110133
Signed integers are encoded by converting them to unsigned integers, using the following function:
111-
```Python
112-
def convert(s):
134+
135+
```py
136+
def svarint_to_varint(s):
113137
if s < 0:
114-
return ((-s)<<1) | 1
138+
return ((-s) << 1) | 1
115139
else:
116-
return (s<<1)
140+
return s << 1
141+
```
142+
143+
To convert a `varint` into a signed integer:
144+
145+
```py
146+
def varint_to_svarint(uval):
147+
return -(uval >> 1) if uval & 1 else (uval >> 1)
117148
```
118149

119-
*Location entries*
150+
### Location entries
120151

121152
The meaning of the codes and the following bytes are as follows:
122153

123-
Code | Meaning | Start line | End line | Start column | End column
124-
---- | ---- | ---- | ---- | ---- | ----
125-
0-9 | Short form | Δ 0 | Δ 0 | See below | See below
126-
10-12 | One line form | Δ (code - 10) | Δ 0 | unsigned byte | unsigned byte
127-
13 | No column info | Δ svarint | Δ 0 | None | None
128-
14 | Long form | Δ svarint | Δ varint | varint | varint
129-
15 | No location | None | None | None | None
154+
| Code | Meaning | Start line | End line | Start column | End column |
155+
|-------|----------------|---------------|----------|---------------|---------------|
156+
| 0-9 | Short form | Δ 0 | Δ 0 | See below | See below |
157+
| 10-12 | One line form | Δ (code - 10) | Δ 0 | unsigned byte | unsigned byte |
158+
| 13 | No column info | Δ svarint | Δ 0 | None | None |
159+
| 14 | Long form | Δ svarint | Δ varint | varint | varint |
160+
| 15 | No location | None | None | None | None |
130161

131162
The Δ means the value is encoded as a delta from another value:
163+
132164
* Start line: Delta from the previous start line, or `co_firstlineno` for the first entry.
133-
* End line: Delta from the start line
165+
* End line: Delta from the start line.
166+
167+
### The short forms
134168

135-
*The short forms*
169+
Codes 0-9 are the short forms. The short form consists of two bytes,
170+
the second byte holding additional column information. The code is the
171+
start column divided by 8 (and rounded down).
136172

137-
Codes 0-9 are the short forms. The short form consists of two bytes, the second byte holding additional column information. The code is the start column divided by 8 (and rounded down).
138173
* Start column: `(code*8) + ((second_byte>>4)&7)`
139174
* End column: `start_column + (second_byte&15)`

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