From 33e5af432b49c79fe3cabe20a9d06bce303cdb31 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 10 Oct 2025 17:06:22 +0900 Subject: [PATCH] mruby-task: implement task#inspect method added inspect method that returns formatted string showing: - task pointer address - task name (string/symbol), or "(unnamed)" for nil/other types - task status (RUNNING, READY, WAITING, SUSPENDED, DORMANT, UNKNOWN) format matches original implementation: # avoids mrb_funcall during inspection to prevent vm state issues. handles string and symbol names directly, treats other types as unnamed. Co-authored-by: Claude --- mrbgems/mruby-task/src/task.c | 55 +++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/mrbgems/mruby-task/src/task.c b/mrbgems/mruby-task/src/task.c index 51142ff93..0a1a4ae82 100644 --- a/mrbgems/mruby-task/src/task.c +++ b/mrbgems/mruby-task/src/task.c @@ -1199,6 +1199,60 @@ mrb_task_status(mrb_state *mrb, mrb_value self) MRB_SYM(UNKNOWN)); } +static mrb_value +mrb_task_inspect(mrb_state *mrb, mrb_value self) +{ + mrb_task *t; + mrb_value name_val; + char buf[256]; + const char *name_str; + const char *status_str; + + TASK_GET_PTR_OR_RAISE(t, self); + + /* Get status string directly from task status field */ + switch (t->status) { + case MRB_TASK_STATUS_RUNNING: + status_str = "RUNNING"; + break; + case MRB_TASK_STATUS_READY: + status_str = "READY"; + break; + case MRB_TASK_STATUS_WAITING: + status_str = "WAITING"; + break; + case MRB_TASK_STATUS_SUSPENDED: + status_str = "SUSPENDED"; + break; + case MRB_TASK_STATUS_DORMANT: + status_str = "DORMANT"; + break; + default: + status_str = "UNKNOWN"; + break; + } + + /* Get name as C string - avoid mrb_funcall to prevent VM state issues */ + if (mrb_string_p(t->name)) { + name_str = RSTRING_PTR(t->name); + } + else if (mrb_symbol_p(t->name)) { + name_str = mrb_sym_name(mrb, mrb_symbol(t->name)); + } + else { + /* Treat nil, undef, or any other type as unnamed */ + name_str = "(unnamed)"; + } + + /* Format: # */ + snprintf(buf, sizeof(buf), "#", + (void *)t, + name_str, + status_str); + + return mrb_str_new_cstr(mrb, buf); +} + static mrb_value mrb_task_name(mrb_state *mrb, mrb_value self) { @@ -1410,6 +1464,7 @@ mrb_mruby_task_gem_init(mrb_state *mrb) /* Instance methods */ mrb_define_method_id(mrb, task_class, MRB_SYM(status), mrb_task_status, MRB_ARGS_NONE()); + mrb_define_method_id(mrb, task_class, MRB_SYM(inspect), mrb_task_inspect, MRB_ARGS_NONE()); mrb_define_method_id(mrb, task_class, MRB_SYM(name), mrb_task_name, MRB_ARGS_NONE()); mrb_define_method_id(mrb, task_class, MRB_SYM_E(name), mrb_task_set_name, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, task_class, MRB_SYM(priority), mrb_task_priority, MRB_ARGS_NONE());