string.dump() 関数によって生成されたバイトコードを読み取ることができる Lua コードをいくつか書いています。すべての OP_JMP 命令は、if ステートメントに使用されたときに命令ポインターを前方に増加させると想定しています (最適化をいくつか行い、コーディングを減らすことができるため)。sBx 値 (負になる可能性があります) を使用するため、技術的には逆方向にジャンプできます。標準の Lua 5.1 実装の if ステートメントのバイトコードにのみ関心があります。
いくつかのサンプルのバイトコードを調べるために、 chunkspy (素晴らしいツール)を使用しました。
以下は、基本的な if ステートメントです。
a, b = 1, 2
if a == b then
print '='
elseif a < b then
print '<'
else
print '>'
end
4 つのジャンプが生成されますが、いずれも負ではありません。
[08] jmp 4; to [13]
[12] jmp 11; to [24]
[16] jmp 4; to [21]
[20] jmp 3; to [24]
Luaのソース コードで答えを探してみましたが、混乱するだけでした (時間をかけて理解すれば、非常にエレガントなコードだと確信しています)。
luaのOP_JMP命令がsBxに対して負の値を持つ「if」ステートメントのケースを知っている人はいますか、またはそれらが常に正の値であるかどうかを知っていますか?