«前の日記(2021年01月15日) 最新 次の日記(2022年04月04日)» 編集

一往確認日記


2021年03月18日 [長年日記]

_ PLCでmruby (8) irep_header

mrubyをPLCで動かせないかな〜という企画です。

前回からだいぶ空いてしまいました。
前回は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週間以内なら都合の良いときに見れるので便利です。

ドラマで渋沢栄一氏に興味を持ちましたので、氏の著書である「論語と算盤」を読み始めました。

現代語訳 論語と算盤 (ちくま新書) | 渋沢栄一, 守屋淳 | 哲学・思想 | Kindleストア | Amazon