Solidity語言學習筆記————17、原始檔對映

FLy_鵬程萬里發表於2018-06-22

原始檔對映(Source Mappings)

作為AST輸出的一部分,編譯器會提供AST某個節點以應的原始碼的範圍。這可以被用來做基於AST的靜態程式碼錯誤分析,可以高亮本地變數,和他們對應使用的除錯工具。

此外,編譯器也可以生成位元組碼到生成指令原始碼的範圍對映。這對靜態分析工具來說非常重要,它們在位元組碼級別分析,可以來在除錯工具內顯示對應程式碼位置,或支援斷點操作。

這兩種源對映都使用整數識別符號來引用原始檔。這些是常規陣列索引,它們通常被稱為“sourceList”的原始檔列表,它是 combined-json和json / npm編譯輸出的一部分。

註解
在與任何特定原始檔不相關的指令的情況下,源對映分配-1的整數識別符號。這可能發生於編譯器生成的內聯彙編語句中的位元組碼部分。

對映的源內的AST使用以下符號:

s:l:f

其中,s是原始檔中範圍開始的位元組偏移量,l是源範圍的位元組長度,f是上面提到的源索引。

位元組碼的源對映中的編碼更為複雜:它是由;分隔的s:l:f的列表。這些元素中的每一個都對應於指令,即不能使用位元組偏移,但必須使用指令偏移(推送指令比單個位元組長)。欄位slf與上面一樣,j可以是io-表示jump 指令是否進入函式、從函式返回或是作為迴圈的一部分的常規跳轉。

為了壓縮這些源對映,特別是對於位元組碼,使用以下規則:

  • 如果欄位為空,則使用前一個元素的值。
  • 如果缺少:,則所有以下欄位都被認為是空的。

這意味著以下源對映表示相同的資訊:

1:2:1;1:9:1;2:1:2;2:1:2;2:1:2

1:2:1;:9;2:1:2;;

相關文章