// v0_const_binop.hako — LLVM Script Builder v0（const/binop/ret）デモ
// 役割: 最小 MIR(JSON v0) を生成し、AotBox 経由で exe を作る（IR構築は段階導入のためMIRビルダーを使用）。

using lang.compiler.pipeline_v2.emit_return_box as EmitReturnBox
using lang.compiler.pipeline_v2.emit_binop_box as EmitBinopBox

static box V0Demo {
  // 返り値 0 の exe を生成
  emit_ret0(obj_out, exe_out) {
    local json = EmitReturnBox.emit_return_int2(0, 0)
    return V0Demo._compile_link(json, obj_out, exe_out, "")
  }
  // (lhs op rhs) を計算して返す exe を生成（op=+|-|*|/）
  emit_binop(lhs, rhs, opk, obj_out, exe_out) {
    local json = EmitBinopBox.emit_binop2(lhs, rhs, opk, 0)
    return V0Demo._compile_link(json, obj_out, exe_out, "")
  }
  _compile_link(json, obj_out, exe_out, flags) {
    // AotBox プラグイン（libhako_aot）
    local a = new AotBox()
    // 書き出し先の JSON を一時ファイル化（AotBoxはパス受け取りのため）
    // 簡易: FileBox を用いず、言語側のユーティリティがない場合は AotBox に直接渡すため、
    // ここでは直接は書かない（EmitReturn/EmitBinop は JSON 文字列を返す）。
    // 便宜上、FileBox で書き出してから AotBox.compile へ渡す。
    local fb = new FileBox()
    local json_path = obj_out + ".json"
    fb.open(json_path)
    fb.write(json)
    fb.close()
    // compile/link
    local rc1 = a.compile(json_path, obj_out)
    local rc2 = a.link(obj_out, exe_out, flags)
    return (rc1 == 0 && rc2 == 0) ? 0 : -1
  }
}

static box Main {
  // デモエントリ: ret 0 の exe を生成
  main(){
    local tmp = env.get("NYASH_ROOT")
    if !tmp { tmp = "." }
    local obj = tmp + "/tmp/v0_min.o"
    local exe = tmp + "/tmp/v0_min_exe"
    local rc = V0Demo.emit_ret0(obj, exe)
    print(rc)
    return 0
  }
}
