mirror of https://github.com/tailix/libkernaux.git
Ruby: save IDs
This commit is contained in:
parent
72bf239383
commit
b73bbc2643
|
@ -29,6 +29,8 @@ static const struct rb_data_type_struct info = {
|
|||
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
||||
};
|
||||
|
||||
static ID rb_intern_freeze, rb_intern_new;
|
||||
|
||||
static VALUE rb_KernAux = Qnil;
|
||||
static VALUE rb_KernAux_Error = Qnil;
|
||||
static VALUE rb_KernAux_CmdlineError = Qnil;
|
||||
|
@ -36,12 +38,17 @@ static VALUE rb_ANON_Data = Qnil;
|
|||
|
||||
void init_cmdline()
|
||||
{
|
||||
rb_intern_freeze = rb_intern("freeze");
|
||||
rb_gc_register_mark_object(rb_intern_freeze);
|
||||
rb_intern_new = rb_intern("new");
|
||||
rb_gc_register_mark_object(rb_intern_new);
|
||||
|
||||
rb_KernAux = rb_define_module("KernAux");
|
||||
rb_KernAux_Error =
|
||||
rb_define_class_under(rb_KernAux, "Error" ,rb_eRuntimeError);
|
||||
rb_KernAux_CmdlineError =
|
||||
rb_define_class_under(rb_KernAux, "CmdlineError", rb_KernAux_Error);
|
||||
rb_ANON_Data = rb_funcall(rb_cClass, rb_intern("new"), 1, rb_cObject);
|
||||
rb_ANON_Data = rb_funcall(rb_cClass, rb_intern_new, 1, rb_cObject);
|
||||
rb_gc_register_mark_object(rb_ANON_Data);
|
||||
rb_define_alloc_func(rb_ANON_Data, rb_ANON_Data_ALLOC);
|
||||
rb_define_singleton_method(rb_KernAux, "cmdline", rb_KernAux_cmdline, 1);
|
||||
|
@ -58,7 +65,7 @@ VALUE rb_KernAux_cmdline(const VALUE self_rb, VALUE cmdline_rb)
|
|||
const char *const cmdline = StringValueCStr(cmdline_rb);
|
||||
size_t argc;
|
||||
|
||||
const VALUE data_rb = rb_funcall(rb_ANON_Data, rb_intern("new"), 0);
|
||||
const VALUE data_rb = rb_funcall(rb_ANON_Data, rb_intern_new, 0);
|
||||
struct Data *data;
|
||||
TypedData_Get_Struct(data_rb, struct Data, &info, data);
|
||||
if (!data) rb_raise(rb_KernAux_CmdlineError, "internal error");
|
||||
|
@ -79,10 +86,10 @@ VALUE rb_KernAux_cmdline(const VALUE self_rb, VALUE cmdline_rb)
|
|||
for (size_t index = 0; index < argc; ++index) {
|
||||
rb_ary_push(
|
||||
result_rb,
|
||||
rb_funcall(rb_str_new2(data->argv[index]), rb_intern("freeze"), 0)
|
||||
rb_funcall(rb_str_new2(data->argv[index]), rb_intern_freeze, 0)
|
||||
);
|
||||
}
|
||||
return rb_funcall(result_rb, rb_intern("freeze"), 0);
|
||||
return rb_funcall(result_rb, rb_intern_freeze, 0);
|
||||
}
|
||||
|
||||
#endif // HAVE_KERNAUX_CMDLINE
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include <kernaux.h>
|
||||
#include <ruby.h>
|
||||
|
||||
static ID rb_intern_LESS, rb_intern_call, rb_intern_freeze;
|
||||
|
||||
static VALUE rb_KernAux = Qnil;
|
||||
static VALUE rb_KernAux_Error = Qnil;
|
||||
|
||||
|
@ -36,6 +38,13 @@ void Init_default()
|
|||
init_cmdline();
|
||||
#endif // HAVE_KERNAUX_CMDLINE
|
||||
|
||||
rb_intern_LESS = rb_intern("<");
|
||||
rb_gc_register_mark_object(rb_intern_LESS);
|
||||
rb_intern_call = rb_intern("call");
|
||||
rb_gc_register_mark_object(rb_intern_call);
|
||||
rb_intern_freeze = rb_intern("freeze");
|
||||
rb_gc_register_mark_object(rb_intern_freeze);
|
||||
|
||||
rb_KernAux = rb_define_module("KernAux");
|
||||
|
||||
rb_KernAux_Error =
|
||||
|
@ -69,7 +78,7 @@ void assert_cb(const char *const file, const int line, const char *const str)
|
|||
const VALUE file_rb = rb_str_new2(file);
|
||||
const VALUE line_rb = INT2FIX(line);
|
||||
const VALUE str_rb = rb_str_new2(str);
|
||||
rb_funcall(assert_cb_rb, rb_intern("call"), 3, file_rb, line_rb, str_rb);
|
||||
rb_funcall(assert_cb_rb, rb_intern_call, 3, file_rb, line_rb, str_rb);
|
||||
}
|
||||
|
||||
VALUE rb_KernAux_assert_cb(const VALUE self)
|
||||
|
@ -103,12 +112,12 @@ VALUE rb_KernAux_utoa10(
|
|||
const VALUE number_rb
|
||||
) {
|
||||
RB_INTEGER_TYPE_P(number_rb);
|
||||
if (rb_funcall(number_rb, rb_intern("<"), 1, INT2FIX(0))) {
|
||||
if (rb_funcall(number_rb, rb_intern_LESS, 1, INT2FIX(0))) {
|
||||
rb_raise(rb_eRangeError, "can't convert negative number to uint64_t");
|
||||
}
|
||||
char buffer[KERNAUX_ITOA_BUFFER_SIZE];
|
||||
kernaux_utoa10(NUM2ULL(number_rb), buffer);
|
||||
return rb_funcall(rb_str_new2(buffer), rb_intern("freeze"), 0);
|
||||
return rb_funcall(rb_str_new2(buffer), rb_intern_freeze, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -120,7 +129,7 @@ VALUE rb_KernAux_itoa10(
|
|||
RB_INTEGER_TYPE_P(number_rb);
|
||||
char buffer[KERNAUX_ITOA_BUFFER_SIZE];
|
||||
kernaux_itoa10(NUM2LL(number_rb), buffer);
|
||||
return rb_funcall(rb_str_new2(buffer), rb_intern("freeze"), 0);
|
||||
return rb_funcall(rb_str_new2(buffer), rb_intern_freeze, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -220,12 +229,12 @@ VALUE rb_KernAux_snprintf1(
|
|||
if (!str) rb_raise(rb_eNoMemError, "snprintf1 buffer malloc");
|
||||
const int slen = kernaux_snprintf(str, size, format, arg, "", "", "");
|
||||
const VALUE output_rb =
|
||||
rb_funcall(rb_str_new2(str), rb_intern("freeze"), 0);
|
||||
rb_funcall(rb_str_new2(str), rb_intern_freeze, 0);
|
||||
free(str);
|
||||
|
||||
const VALUE result_rb = rb_ary_new2(2);
|
||||
rb_ary_push(result_rb, output_rb);
|
||||
rb_ary_push(result_rb, INT2NUM(slen));
|
||||
return rb_funcall(result_rb, rb_intern("freeze"), 0);
|
||||
return rb_funcall(result_rb, rb_intern_freeze, 0);
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue