mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 05:29:10 +02:00

Since universal-parser and prism support, prelude code used functions inaccessible from outside libruby shared library. ``` linking goruby /usr/bin/ld: goruby.o: in function `prelude_eval': /home/runner/work/ruby/ruby/build/golf_prelude.c:221: undefined reference to `rb_ruby_prism_ptr' /usr/bin/ld: goruby.o: in function `pm_prelude_load': /home/runner/work/ruby/ruby/build/golf_prelude.c:192: undefined reference to `pm_options_line_set' /usr/bin/ld: /home/runner/work/ruby/ruby/build/golf_prelude.c:193: undefined reference to `pm_parse_string' /usr/bin/ld: goruby.o: in function `prelude_eval': /home/runner/work/ruby/ruby/build/golf_prelude.c:224: undefined reference to `pm_iseq_new_with_opt' /usr/bin/ld: /home/runner/work/ruby/ruby/build/golf_prelude.c:226: undefined reference to `pm_parse_result_free' /usr/bin/ld: goruby.o: in function `prelude_ast_value': /home/runner/work/ruby/ruby/build/golf_prelude.c:181: undefined reference to `rb_ruby_ast_data_get' /usr/bin/ld: goruby.o: in function `prelude_eval': /home/runner/work/ruby/ruby/build/golf_prelude.c:231: undefined reference to `rb_ruby_ast_data_get' /usr/bin/ld: goruby.o: in function `pm_prelude_load': /home/runner/work/ruby/ruby/build/golf_prelude.c:196: undefined reference to `pm_parse_result_free' collect2: error: ld returned 1 exit status ```
48 lines
1.2 KiB
Ruby
Executable file
48 lines
1.2 KiB
Ruby
Executable file
#!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
|