MRI binding: changes to Marshal::load mkxp's custom proc #2

Merged
cremno merged 2 commits from mri-marshal-utf8proc into master 2013-10-23 03:29:51 +00:00
1 changed files with 15 additions and 8 deletions

View File

@ -159,14 +159,20 @@ RB_METHOD(kernelSaveData)
static VALUE stringForceUTF8(VALUE arg) static VALUE stringForceUTF8(VALUE arg)
{ {
if (rb_type(arg) != RUBY_T_STRING) if (rb_type(arg) == RUBY_T_STRING && ENCODING_IS_ASCII8BIT(arg))
return arg; rb_enc_associate_index(arg, rb_utf8_encindex());
rb_enc_associate(arg, rb_utf8_encoding());
return arg; return arg;
} }
static VALUE customProc(VALUE arg, VALUE proc)
{
VALUE obj = stringForceUTF8(arg);
obj = rb_funcall2(proc, rb_intern("call"), 1, &obj);
return obj;
}
RB_METHOD(_marshalLoad) RB_METHOD(_marshalLoad)
{ {
RB_UNUSED_PARAM; RB_UNUSED_PARAM;
@ -175,10 +181,11 @@ RB_METHOD(_marshalLoad)
rb_get_args(argc, argv, "o|o", &port, &proc, RB_ARG_END); rb_get_args(argc, argv, "o|o", &port, &proc, RB_ARG_END);
if (rb_type(proc) != RUBY_T_NIL) VALUE utf8Proc;
rb_raise(rb_eNotImpError, "MKXP: Marshal with custom proc not (yet) implemented"); if (NIL_P(proc))
utf8Proc = rb_proc_new(RUBY_METHOD_FUNC(stringForceUTF8), Qnil);
VALUE utf8Proc = rb_proc_new(RUBY_METHOD_FUNC(stringForceUTF8), Qnil); else
utf8Proc = rb_proc_new(RUBY_METHOD_FUNC(customProc), proc);
VALUE marsh = rb_const_get(rb_cObject, rb_intern("Marshal")); VALUE marsh = rb_const_get(rb_cObject, rb_intern("Marshal"));