File: mk_rbbin.rb

package info (click to toggle)
ruby3.4 3.4.5-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 154,784 kB
  • sloc: ruby: 1,259,653; ansic: 829,955; yacc: 28,233; pascal: 7,359; sh: 3,864; python: 1,799; cpp: 1,158; asm: 808; makefile: 801; javascript: 414; lisp: 109; perl: 62; awk: 36; sed: 4; xml: 4
file content (48 lines) | stat: -rwxr-xr-x 1,184 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!ruby -s

OPTIMIZATION = {
  inline_const_cache: true,
  peephole_optimization: true,
  tailcall_optimization: false,
  specialized_instruction: true,
  operands_unification: true,
  instructions_unification: true,
  frozen_string_literal: true,
  debug_frozen_string_literal: false,
  coverage_enabled: false,
  debug_level: 0,
}

file = File.basename(ARGV[0], ".rb")
name = "<internal:#{file}>"
iseq = RubyVM::InstructionSequence.compile(ARGF.read, name, name, **OPTIMIZATION)
puts <<C
/* -*- C -*- */

static const char #{file}_builtin[] = {
C
iseq.to_binary.bytes.each_slice(8) do |b|
  print "    ", b.map {|c| "0x%.2x," % c}.join(" ")
  if $comment
    print " /* ", b.pack("C*").gsub(/([[ -~]&&[^\\]])|(?m:.)/) {
      (c = $1) ? "#{c} " : (c = $&.dump).size == 2 ? c : ". "
    }, "*/"
  end
  puts
end
puts <<C
};

#include "ruby/ruby.h"
#include "vm_core.h"

void
Init_#{file}(void)
{
    const char *builtin = #{file}_builtin;
    size_t size = sizeof(#{file}_builtin);
    VALUE code = rb_str_new_static(builtin, (long)size);
    VALUE iseq = rb_funcallv(rb_cISeq, rb_intern_const("load_from_binary"), 1, &code);
    rb_funcallv(iseq, rb_intern_const("eval"), 0, 0);
}
C