e$B$J$+$@$G$9!#e(B
At Tue, 22 Jan 2008 04:59:27 +0900,
NARUSE, Yui wrote in [ruby-dev:33268]:
Marlshal.recursive_force_encoding e$B$H$+$$$&!V%G!<%?Cf$NJ8;zNs$r$?$I$C$Fe(B
force_encoding e$B$9$k!W%a%=%C%I$,$"$C$?$i3Z$@$m$&$H;W$C$?$s$G$9$,!"$9$4$$e(B
e$BLLE]$=$&$@$C$?$N$Ge(B [ruby-dev:33205] e$B$N!Ve(Bdumpe$B$NF~NO%G!<%?$N%(%s%3!<%G%#%se(B
e$B%0$K$9$k!W$r=q$$$F$_$^$7$?!#e(B
@@ -968,7 +969,7 @@ r_bytes0(long len, struct load_arg *arg)
if (len == 0) return rb_str_new(0, 0);
if (TYPE(arg->src) == T_STRING) {
if (RSTRING_LEN(arg->src) - arg->offset >= len) {
Stringe$B8BDj$J$i!"$3$3$Ge(Brb_str_subseq()e$B$r;H$&$@$1$G$b$G$-$^$9!#e(B
e$B$=$l0J30$N$H$-$,LdBj$G!"e(BIO#read(length)e$B$O>o$Ke(BASCII-8BITe$B$rJV$9$Ne(B
e$B$GF~NO$+$iD4$Y$k$3$H$b$G$-$^$;$s!#e(BIOe$B$K$be(Brb_enc_get()e$B$G<h$l$k$h$&e(B
e$B$K%(%s%3!<%G%#%s%0$r%;%C%H$7$F$*$1$P4JC1$J$s$G$9$1$I!#e(B
e$B$3$Ne(B arg.enc e$B$Ke(B encoding e$B$r$D$C$3$`J}K!$,2?$+$"$l$PL@<(E*$K;XDj$G$-$k$Ne(B
e$B$G$9$,!"$^$!!"$3$l$G;veLdBj$J$$$N$G$O$J$$$G$7$g$&$+!#e(B
e$B0z?t$J$7$Ne(BMarshal.loade$B$,e(BMarshal::Loadere$B%*%V%8%’%/%H$rJV$9!"$H$+e(B
e$B$G$7$g$&$+!#e(B
Index: marshal.c
— marshal.c (revision 15163)
+++ marshal.c (working copy)
@@ -81,5 +81,5 @@ shortlen(long len, BDIGIT *ds)
static ID s_dump, s_load, s_mdump, s_mload;
static ID s_dump_data, s_load_data, s_alloc;
-static ID s_getc, s_read, s_write, s_binmode;
+static ID s_getc, s_read, s_write, s_binmode, s_external_encoding;
ID rb_id_encoding(void);
@@ -883,4 +883,5 @@ struct load_arg {
st_table *compat_tbl;
VALUE compat_tbl_wrapper;
@@ -966,5 +967,5 @@ r_bytes0(long len, struct load_arg *arg)
VALUE str;
- if (len == 0) return rb_str_new(0, 0);
-
if (len == 0) return rb_enc_str_new(0, 0, arg->enc);
if (TYPE(arg->src) == T_STRING) {
if (RSTRING_LEN(arg->src) - arg->offset >= len) {
@@ -986,4 +987,5 @@ r_bytes0(long len, struct load_arg *arg)
if (OBJ_TAINTED(str)) arg->taint = Qtrue;
}
-
rb_enc_associate(str, arg->enc);
return str;
}
@@ -1553,7 +1555,9 @@ marshal_load(int argc, VALUE *argv)
rb_scan_args(argc, argv, “11”, &port, &proc);
-
arg.enc = 0;
if (rb_respond_to(port, rb_intern(“to_str”))) {
arg.taint = OBJ_TAINTED(port); /* original taintedness /
StringValue(port); / possible conversion */
-
arg.enc = rb_enc_get(port);
}
else if (rb_respond_to(port, s_getc) && rb_respond_to(port,
s_read)) {
@@ -1561,4 +1565,9 @@ marshal_load(int argc, VALUE *argv)
rb_funcall2(port, s_binmode, 0, 0);
}
-
if (rb_respond_to(port, s_external_encoding)) {
-
VALUE enc = rb_funcall2(port, s_external_encoding, 0, 0);
-
rb_p(enc);
-
arg.enc = rb_to_encoding(enc);
-
}
arg.taint = Qtrue;
}
@@ -1642,4 +1651,5 @@ Init_marshal(void)
s_write = rb_intern(“write”);
s_binmode = rb_intern(“binmode”);
-
s_external_encoding = rb_intern(“external_encoding”);
rb_define_module_function(rb_mMarshal, “dump”, marshal_dump, -1);