一往確認日記 |
2021年03月18日 [長年日記]
_ PLCでmruby (8) irep_header
前回からだいぶ空いてしまいました。
前回はrite_section_irep_headerについて調べました。
今回はその中身になります。
手がかりは前回出てきたdump.cファイルのsection_irep_sizeを計算している箇所です。
section_irep_size = sizeof(struct rite_section_irep_header);
section_irep_size += get_irep_record_size(mrb, irep);
rite_section_irep_headerに加算しているget_irep_record_size()関数を見てみます。
static size_t
get_irep_record_size(mrb_state *mrb, const mrb_irep *irep)
{
size_t size = 0;
int irep_no;
size = get_irep_record_size_1(mrb, irep);
for (irep_no = 0; irep_no < irep->rlen; irep_no++) {
size += get_irep_record_size(mrb, irep->reps[irep_no]);
}
return size;
}
get_irep_record_size()では更にget_irep_record_size_1()を呼び出しています。
static size_t
get_irep_record_size_1(mrb_state *mrb, const mrb_irep *irep)
{
size_t size = 0;
size += get_irep_header_size(mrb);
size += get_iseq_block_size(mrb, irep);
size += get_catch_table_block_size(mrb, irep);
size += get_pool_block_size(mrb, irep);
size += get_syms_block_size(mrb, irep);
return size;
}
ここからrite_section_irep_headerにつづいてirep_header、iseq_block、catch_table_block、pool_block、syms_blockと続くと思われます。
まず、irep_headerを確認します。 write_irep_header()がそれに該当しそうです。
static ptrdiff_t
write_irep_header(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf)
{
uint8_t *cur = buf;
cur += uint32_to_bin((uint32_t)get_irep_record_size_1(mrb, irep), cur); /* record size */
cur += uint16_to_bin((uint16_t)irep->nlocals, cur); /* number of local variable */
cur += uint16_to_bin((uint16_t)irep->nregs, cur); /* number of register variable */
cur += uint16_to_bin((uint16_t)irep->rlen, cur); /* number of child irep */
return cur - buf;
}
recode size, number of local variable, number of register variable, number of child irep の順で並んでいる様です。
Ruby scriptで確認してみます。
codes = File.read "a.mrb"
size_of_rite_binary_header = 22
size_of_rite_section_irep_header = 12
section_top = size_of_rite_binary_header + size_of_rite_section_irep_header
recode_size = codes[section_top + 0, 4].unpack("N").first
number_of_local = codes[section_top + 4, 2].unpack("n").first
number_of_register = codes[section_top + 6, 2].unpack("n").first
number_of_child_irep = codes[section_top + 8, 2].unpack("n").first
pp recode_size: recode_size, number_of_local: number_of_local, number_of_register: number_of_register, number_of_child_irep: number_of_child_irep
出力はこちらです。
{:recode_size=>26,
:number_of_local=>2,
:number_of_register=>3,
:number_of_child_irep=>0}
サイズは26バイトで、ローカル変数は2個、レジスターは3個、子はなしとなっています。
つづく
[book] 論語と算盤
大河ドラマ「青天を衝け」を観ています。
NHK+に登録したので1週間以内なら都合の良いときに見れるので便利です。
ドラマで渋沢栄一氏に興味を持ちましたので、氏の著書である「論語と算盤」を読み始めました。