Class: IgniterLang::Assembler

Inherits:
Object
  • Object
show all
Defined in:
lib/igniter_lang/assembler.rb

Defined Under Namespace

Modules: Canonical

Constant Summary collapse

ROOT =
Pathname.new(File.expand_path("../..", __dir__))
DEFAULT_GOLDEN_DIR =
ROOT / "experiments/source_to_semanticir_fixture/golden"
DEFAULT_OUT_DIR =
ROOT / "experiments/igapp_assembler_proof/out"
PROFILE_SOURCE_KIND =

PROP-036: compiler_profile_id source contract constants. Used by validate_compiler_profile_source! only.

"compiler_profile_id_source"
PROFILE_SOURCE_NAMESPACE =
"compiler_profile_unified"
PROFILE_SOURCE_ID_PATTERN =
/\Acompiler_profile_unified\/sha256:[0-9a-f]{24,}\z/
PROFILE_SOURCE_SLOT_ORDER =
%w[
  core oof_registry fragment_registry escape_boundary contract_modifiers
  temporal stream olap invariant assumptions evidence_observation pipeline
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(golden_dir: DEFAULT_GOLDEN_DIR, out_dir: DEFAULT_OUT_DIR) ⇒ Assembler

Returns a new instance of Assembler.



57
58
59
60
# File 'lib/igniter_lang/assembler.rb', line 57

def initialize(golden_dir: DEFAULT_GOLDEN_DIR, out_dir: DEFAULT_OUT_DIR)
  @golden_dir = Pathname.new(golden_dir)
  @out_dir = Pathname.new(out_dir)
end

Instance Method Details

#assemble_artifacts(case_name:, report:, semantic_ir:, target_dir:, compiler_profile_source: nil) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
# File 'lib/igniter_lang/assembler.rb', line 76

def assemble_artifacts(case_name:, report:, semantic_ir:, target_dir:, compiler_profile_source: nil)
  refuse!(case_name, "pass_result=#{report.fetch("pass_result")}") unless report.fetch("pass_result") == "ok"
  refuse!(case_name, "semantic_ir_ref missing") unless report.fetch("semantic_ir_ref").is_a?(String)
  validate_refs!(case_name, report, semantic_ir)
  validate_semantic_ir!(case_name, semantic_ir)

  artifact = build_artifact(case_name, report, semantic_ir, compiler_profile_source: compiler_profile_source)
  target = Pathname.new(target_dir)
  write_artifact_to(target, artifact)
  artifact_summary_for_target(case_name, artifact, target)
end

#assemble_case(case_name, compiler_profile_source: nil) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/igniter_lang/assembler.rb', line 62

def assemble_case(case_name, compiler_profile_source: nil)
  report = read_json(@golden_dir / "#{case_name}.compilation_report.json")
  refuse!(case_name, "pass_result=#{report.fetch("pass_result")}") unless report.fetch("pass_result") == "ok"
  refuse!(case_name, "semantic_ir_ref missing") unless report.fetch("semantic_ir_ref").is_a?(String)

  semantic_ir = read_json(@golden_dir / "#{case_name}.semantic_ir.json")
  validate_refs!(case_name, report, semantic_ir)
  validate_semantic_ir!(case_name, semantic_ir)

  artifact = build_artifact(case_name, report, semantic_ir, compiler_profile_source: compiler_profile_source)
  write_artifact(case_name, artifact)
  artifact_summary(case_name, artifact)
end

#refuse_case(case_name) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/igniter_lang/assembler.rb', line 88

def refuse_case(case_name)
  report = read_json(@golden_dir / "#{case_name}.compilation_report.json")
  assemble_case(case_name)
  raise "expected #{case_name} to refuse, but it assembled"
rescue AssemblyRefused => e
  target = @out_dir / "#{case_name}.igapp"
  {
    "case" => case_name,
    "status" => "refused",
    "pass_result" => report.fetch("pass_result"),
    "reason" => e.message,
    "wrote_igapp" => target.exist?
  }
end