Skip to content

Commit

Permalink
Add encoding type to mruby
Browse files Browse the repository at this point in the history
This is needed since we are expecting immediates back. MRuby still needs
some sort of reference to encoding, so this init produces the smallest
possible class for it.

We could get around this by just adding the class type in instead, but
:shrug:
  • Loading branch information
b-n committed Jun 18, 2023
1 parent d07bf6d commit efe7e30
Show file tree
Hide file tree
Showing 9 changed files with 30 additions and 2 deletions.
1 change: 1 addition & 0 deletions artichoke-backend/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ mod libs {
"src/debug.c",
"src/dump.c",
"src/enum.c",
"src/encoding.c",
"src/error.c",
"src/etc.c",
"src/fmt_fp.c",
Expand Down
1 change: 1 addition & 0 deletions artichoke-backend/vendor/mruby/include/mruby.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ typedef struct mrb_state {
struct RClass *nil_class;
struct RClass *symbol_class;
struct RClass *kernel_module;
struct RClass *encoding_class;

mrb_gc gc;

Expand Down
2 changes: 2 additions & 0 deletions artichoke-backend/vendor/mruby/include/mruby/class.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ mrb_class(mrb_state *mrb, mrb_value v)
return mrb->object_class;
case MRB_TT_ENV:
return NULL;
case MRB_TT_ENCODING:
return mrb->encoding_class;
default:
return mrb_obj_ptr(v)->c;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ os_memsize_of_object(mrb_state* mrb, mrb_value obj)
#ifndef MRB_NO_FLOAT
case MRB_TT_FLOAT:
#endif
case MRB_TT_ENCODING:
case MRB_TT_INTEGER:
if (mrb_immediate_p(obj))
break;
Expand Down
5 changes: 3 additions & 2 deletions artichoke-backend/vendor/mruby/src/backtrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ mrb_print_backtrace(mrb_state *mrb)
}

struct RObject *backtrace = ((struct RException*)mrb->exc)->backtrace;
if (backtrace && backtrace->tt != MRB_TT_ARRAY) backtrace = mrb_unpack_backtrace(mrb, backtrace);
if (backtrace && backtrace->tt != MRB_TT_ARRAY && backtrace->tt != MRB_TT_ENCODING) backtrace = mrb_unpack_backtrace(mrb, backtrace);
print_backtrace(mrb, mrb->exc, (struct RArray*)backtrace);
}
#else
Expand Down Expand Up @@ -232,6 +232,7 @@ mrb_unpack_backtrace(mrb_state *mrb, struct RObject *backtrace)
return mrb_obj_ptr(mrb_ary_new_capa(mrb, 0));
}
if (backtrace->tt == MRB_TT_ARRAY) return backtrace;
if (backtrace->tt == MRB_TT_ENCODING) return backtrace;
bt = (struct backtrace_location*)mrb_data_check_get_ptr(mrb, mrb_obj_value(backtrace), &bt_type);
if (bt == NULL) goto empty_backtrace;
n = (mrb_int)backtrace->flags;
Expand Down Expand Up @@ -266,7 +267,7 @@ mrb_exc_backtrace(mrb_state *mrb, mrb_value exc)
if (backtrace == NULL) {
return mrb_nil_value();
}
if (backtrace->tt == MRB_TT_ARRAY) {
if (backtrace->tt == MRB_TT_ARRAY || backtrace->tt == MRB_TT_ENCODING) {
return mrb_obj_value(backtrace);
}
/* unpack packed-backtrace */
Expand Down
18 changes: 18 additions & 0 deletions artichoke-backend/vendor/mruby/src/encoding.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
** encoding.c - Encoding class
**
** See Copyright Notice in mruby.h
*/

#include <mruby.h>
#include <mruby/class.h>

void
mrb_init_encoding(mrb_state *mrb)
{
struct RClass *enc;

mrb->encoding_class = mrb_define_class(mrb, "Encoding", mrb->object_class); /* 15.2.11 */
MRB_SET_INSTANCE_TT(enc, MRB_TT_ENCODING);
mrb_undef_class_method(mrb, enc, "new");
}
1 change: 1 addition & 0 deletions artichoke-backend/vendor/mruby/src/etc.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ mrb_obj_id(mrb_value obj)
case MRB_TT_EXCEPTION:
case MRB_TT_CDATA:
case MRB_TT_ISTRUCT:
case MRB_TT_ENCODING:
default:
return MakeID(mrb_ptr(obj), tt);
}
Expand Down
2 changes: 2 additions & 0 deletions artichoke-backend/vendor/mruby/src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ void mrb_init_gc(mrb_state*);
void mrb_init_math(mrb_state*);
void mrb_init_version(mrb_state*);
void mrb_init_mrblib(mrb_state*);
void mrb_init_encoding(mrb_state*);

#define DONE mrb_gc_arena_restore(mrb, 0);
void
Expand All @@ -50,4 +51,5 @@ mrb_init_core(mrb_state *mrb)
#ifndef ARTICHOKE
mrb_init_mrblib(mrb); DONE;
#endif
mrb_init_encoding(mrb); DONE;
}
1 change: 1 addition & 0 deletions artichoke-backend/vendor/mruby/src/vm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1535,6 +1535,7 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)
case MRB_TT_STRING:
switch (mrb_type(vb)) {
case MRB_TT_INTEGER:
case MRB_TT_ENCODING:
case MRB_TT_STRING:
case MRB_TT_RANGE:
va = mrb_str_aref(mrb, va, vb, mrb_undef_value());
Expand Down

0 comments on commit efe7e30

Please sign in to comment.