mruby-io: ROM method tables for IO and File classes

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2026-02-19 09:39:24 +09:00
parent ae41bb332a
commit ba0f450fb4
2 changed files with 129 additions and 0 deletions
+35
View File
@@ -9,6 +9,7 @@
#include <mruby/string.h>
#include <mruby/io.h>
#include <mruby/error.h>
#include <mruby/internal.h>
#include <mruby/presym.h>
#include "io_hal.h"
@@ -1120,6 +1121,36 @@ mrb_file_join(mrb_state *mrb, mrb_value klass)
return result;
}
/* ---------------------------*/
#ifndef MRB_NO_PRESYM
#define FILE_ROM_MT_SIZE 6
static struct {
union mt_ptr vals[FILE_ROM_MT_SIZE];
mrb_sym keys[FILE_ROM_MT_SIZE];
} file_rom_data = {
.vals = {
{ .func = mrb_file_flock },
{ .func = mrb_file_atime },
{ .func = mrb_file_ctime },
{ .func = mrb_file_mtime },
{ .func = mrb_file_size },
{ .func = mrb_file_truncate },
},
.keys = {
MT_KEY(MRB_SYM(flock), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(_atime), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(_ctime), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(_mtime), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(size), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(truncate), MT_FUNC|MT_PUBLIC),
}
};
static mt_tbl file_rom_mt = {
FILE_ROM_MT_SIZE, FILE_ROM_MT_SIZE,
(union mt_ptr*)&file_rom_data, NULL
};
#endif /* !MRB_NO_PRESYM */
void
mrb_init_file(mrb_state *mrb)
{
@@ -1144,12 +1175,16 @@ mrb_init_file(mrb_state *mrb)
mrb_define_class_method_id(mrb, file, MRB_SYM_Q(absolute_path), mrb_file_absolute_path_p, MRB_ARGS_REQ(1));
mrb_define_class_method_id(mrb, file, MRB_SYM(expand_path), mrb_file_expand_path, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
#ifndef MRB_NO_PRESYM
mrb_mt_init_rom(file, &file_rom_mt);
#else
mrb_define_method_id(mrb, file, MRB_SYM(flock), mrb_file_flock, MRB_ARGS_REQ(1));
mrb_define_method_id(mrb, file, MRB_SYM(_atime), mrb_file_atime, MRB_ARGS_NONE());
mrb_define_method_id(mrb, file, MRB_SYM(_ctime), mrb_file_ctime, MRB_ARGS_NONE());
mrb_define_method_id(mrb, file, MRB_SYM(_mtime), mrb_file_mtime, MRB_ARGS_NONE());
mrb_define_method_id(mrb, file, MRB_SYM(size), mrb_file_size, MRB_ARGS_NONE());
mrb_define_method_id(mrb, file, MRB_SYM(truncate), mrb_file_truncate, MRB_ARGS_REQ(1));
#endif
struct RClass *cnst = mrb_define_module_under_id(mrb, file, MRB_SYM(Constants));
mrb_define_const_id(mrb, cnst, MRB_SYM(LOCK_SH), mrb_fixnum_value(LOCK_SH));
+94
View File
@@ -2196,6 +2196,96 @@ io_flush(mrb_state *mrb, mrb_value io)
return io;
}
/* ---------------------------*/
#ifndef MRB_NO_PRESYM
#define IO_ROM_MT_SIZE 36
static struct {
union mt_ptr vals[IO_ROM_MT_SIZE];
mrb_sym keys[IO_ROM_MT_SIZE];
} io_rom_data = {
.vals = {
{ .func = io_init },
{ .func = io_init_copy },
{ .func = io_isatty },
{ .func = io_eof },
{ .func = io_getc },
{ .func = io_gets },
{ .func = io_read },
{ .func = io_readchar },
{ .func = io_readline },
{ .func = io_readlines },
{ .func = io_sync },
{ .func = io_set_sync },
{ .func = io_sysread },
{ .func = io_sysseek },
{ .func = io_syswrite },
{ .func = io_seek },
{ .func = io_close },
{ .func = io_close_write },
{ .func = io_set_close_on_exec },
{ .func = io_close_on_exec_p },
{ .func = io_closed },
{ .func = io_flush },
{ .func = io_ungetc },
{ .func = io_ungetbyte },
{ .func = io_pos },
{ .func = io_pid },
{ .func = io_fileno },
{ .func = io_write },
{ .func = io_puts },
{ .func = io_print },
{ .func = io_putc },
{ .func = io_lshift },
{ .func = io_pread },
{ .func = io_pwrite },
{ .func = io_getbyte },
{ .func = io_readbyte },
},
.keys = {
MT_KEY(MRB_SYM(initialize), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(initialize_copy), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(isatty), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM_Q(eof), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(getc), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(gets), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(read), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(readchar), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(readline), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(readlines), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(sync), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM_E(sync), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(sysread), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(sysseek), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(syswrite), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(seek), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(close), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(close_write), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM_E(close_on_exec), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM_Q(close_on_exec), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM_Q(closed), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(flush), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(ungetc), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(ungetbyte), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(pos), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(pid), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(fileno), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(write), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(puts), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(print), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(putc), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_OPSYM(lshift), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(pread), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(pwrite), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(getbyte), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(readbyte), MT_FUNC|MT_NOARG|MT_PUBLIC),
}
};
static mt_tbl io_rom_mt = {
IO_ROM_MT_SIZE, IO_ROM_MT_SIZE,
(union mt_ptr*)&io_rom_data, NULL
};
#endif /* !MRB_NO_PRESYM */
void
mrb_init_io(mrb_state *mrb)
{
@@ -2212,6 +2302,9 @@ mrb_init_io(mrb_state *mrb)
mrb_define_class_method_id(mrb, io, MRB_SYM(_pipe), io_s_pipe, MRB_ARGS_NONE());
#endif
#ifndef MRB_NO_PRESYM
mrb_mt_init_rom(io, &io_rom_mt);
#else
mrb_define_method_id(mrb, io, MRB_SYM(initialize), io_init, MRB_ARGS_ARG(1,2));
mrb_define_private_method_id(mrb, io, MRB_SYM(initialize_copy), io_init_copy, MRB_ARGS_REQ(1));
mrb_define_method_id(mrb, io, MRB_SYM(isatty), io_isatty, MRB_ARGS_NONE());
@@ -2248,6 +2341,7 @@ mrb_init_io(mrb_state *mrb)
mrb_define_method_id(mrb, io, MRB_SYM(pwrite), io_pwrite, MRB_ARGS_ANY()); /* Ruby 2.5 feature */
mrb_define_method_id(mrb, io, MRB_SYM(getbyte), io_getbyte, MRB_ARGS_NONE());
mrb_define_method_id(mrb, io, MRB_SYM(readbyte), io_readbyte, MRB_ARGS_NONE());
#endif
mrb_define_const_id(mrb, io, MRB_SYM(SEEK_SET), mrb_fixnum_value(SEEK_SET));
mrb_define_const_id(mrb, io, MRB_SYM(SEEK_CUR), mrb_fixnum_value(SEEK_CUR));