ruby-changes:2253
From: ko1@a...
Date: 19 Oct 2007 20:08:33 +0900
Subject: [ruby-changes:2253] nobu - Ruby:r13744 (trunk): * encoding.c (rb_id_encoding): returns ID "encoding".
nobu 2007-10-19 20:08:16 +0900 (Fri, 19 Oct 2007)
New Revision: 13744
Modified files:
trunk/ChangeLog
trunk/encoding.c
trunk/marshal.c
Log:
* encoding.c (rb_id_encoding): returns ID "encoding".
* marshal.c (w_encoding): dump encoding name.
* marshal.c (r_ivar): load encoding.
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13744&r2=13743
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/marshal.c?r1=13744&r2=13743
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/encoding.c?r1=13744&r2=13743
Index: encoding.c
===================================================================
--- encoding.c (revision 13743)
+++ encoding.c (revision 13744)
@@ -267,6 +267,15 @@
}
}
+ID
+rb_id_encoding(void)
+{
+ if (!id_encoding) {
+ id_encoding = rb_intern("encoding");
+ }
+ return id_encoding;
+}
+
void
rb_enc_associate_index(VALUE obj, int idx)
{
@@ -280,10 +289,7 @@
return;
}
ENCODING_SET(obj, ENCODING_INLINE_MAX);
- if (!id_encoding) {
- id_encoding = rb_intern("encoding");
- }
- rb_ivar_set(obj, id_encoding, INT2NUM(idx));
+ rb_ivar_set(obj, rb_id_encoding(), INT2NUM(idx));
return;
}
@@ -317,10 +323,7 @@
if (i == ENCODING_INLINE_MAX) {
VALUE iv;
- if (!id_encoding) {
- id_encoding = rb_intern("encoding");
- }
- iv = rb_ivar_get(obj, id_encoding);
+ iv = rb_ivar_get(obj, rb_id_encoding());
i = NUM2INT(iv);
}
return i;
Index: ChangeLog
===================================================================
--- ChangeLog (revision 13743)
+++ ChangeLog (revision 13744)
@@ -1,3 +1,11 @@
+Fri Oct 19 20:08:14 2007 Nobuyoshi Nakada <nobu@r...>
+
+ * encoding.c (rb_id_encoding): returns ID "encoding".
+
+ * marshal.c (w_encoding): dump encoding name.
+
+ * marshal.c (r_ivar): load encoding.
+
Fri Oct 19 16:41:00 2007 Nobuyoshi Nakada <nobu@r...>
* parse.y (parser_regx_options, reg_compile_gen): relaxened encoding
Index: marshal.c
===================================================================
--- marshal.c (revision 13743)
+++ marshal.c (revision 13744)
@@ -14,6 +14,7 @@
#include "ruby/io.h"
#include "ruby/st.h"
#include "ruby/util.h"
+#include "ruby/encoding.h"
#include <math.h>
#ifdef HAVE_FLOAT_H
@@ -82,6 +83,8 @@
static ID s_dump_data, s_load_data, s_alloc;
static ID s_getc, s_read, s_write, s_binmode;
+ID rb_id_encoding(void);
+
typedef struct {
VALUE newclass;
VALUE oldclass;
@@ -137,6 +140,7 @@
int taint;
st_table *compat_tbl;
VALUE wrapper;
+ st_table *encodings;
};
struct dump_call_arg {
@@ -453,21 +457,45 @@
static int
w_obj_each(ID id, VALUE value, struct dump_call_arg *arg)
{
+ if (id == rb_id_encoding()) return ST_CONTINUE;
w_symbol(id, arg->arg);
w_object(value, arg->arg, arg->limit);
return ST_CONTINUE;
}
static void
-w_ivar(st_table *tbl, struct dump_call_arg *arg)
+w_encoding(VALUE obj, long num, struct dump_call_arg *arg)
{
+ int encidx = rb_enc_get_index(obj);
+ rb_encoding *enc = 0;
+ st_data_t name;
+
+ if (encidx <= 0 || !(enc = rb_enc_from_index(encidx))) {
+ w_long(num, arg->arg);
+ return;
+ }
+ w_long(num + 1, arg->arg);
+ w_symbol(rb_id_encoding(), arg->arg);
+ do {
+ if (!arg->arg->encodings)
+ arg->arg->encodings = st_init_strcasetable();
+ else if (st_lookup(arg->arg->encodings, (st_data_t)rb_enc_name(enc), &name))
+ break;
+ name = (st_data_t)rb_str_new2(rb_enc_name(enc));
+ st_insert(arg->arg->encodings, (st_data_t)rb_enc_name(enc), name);
+ } while (0);
+ w_object(name, arg->arg, arg->limit);
+}
+
+static void
+w_ivar(VALUE obj, st_table *tbl, struct dump_call_arg *arg)
+{
+ long num = tbl ? tbl->num_entries : 0;
+
+ w_encoding(obj, num, arg);
if (tbl) {
- w_long(tbl->num_entries, arg->arg);
st_foreach_safe(tbl, w_obj_each, (st_data_t)arg);
}
- else {
- w_long(0, arg->arg);
- }
}
static void
@@ -483,7 +511,7 @@
if (ptr[i] != Qundef)
num += 1;
- w_long(num, arg->arg);
+ w_encoding(obj, num, arg);
if (num != 0) {
rb_ivar_foreach(obj, w_obj_each, (st_data_t)arg);
}
@@ -495,6 +523,9 @@
struct dump_call_arg c_arg;
st_table *ivtbl = 0;
st_data_t num;
+ int hasiv = 0;
+#define has_ivars(obj, ivtbl) ((ivtbl = rb_generic_ivar_table(obj)) != 0 || \
+ (!IMMEDIATE_P(obj) && ENCODING_GET(obj)))
if (limit == 0) {
rb_raise(rb_eArgError, "exceed depth limit");
@@ -510,7 +541,7 @@
return;
}
- if ((ivtbl = rb_generic_ivar_table(obj)) != 0) {
+ if ((hasiv = has_ivars(obj, ivtbl)) != 0) {
w_byte(TYPE_IVAR, arg);
}
if (obj == Qnil) {
@@ -563,7 +594,7 @@
v = rb_funcall(obj, s_mdump, 0, 0);
w_class(TYPE_USRMARSHAL, obj, arg, Qfalse);
w_object(v, arg, limit);
- if (ivtbl) w_ivar(0, &c_arg);
+ if (hasiv) w_ivar(obj, 0, &c_arg);
return;
}
if (rb_respond_to(obj, s_dump)) {
@@ -573,13 +604,13 @@
if (TYPE(v) != T_STRING) {
rb_raise(rb_eTypeError, "_dump() must return string");
}
- if (!ivtbl && (ivtbl = rb_generic_ivar_table(v))) {
+ if (!hasiv && (hasiv = has_ivars(v, ivtbl)) != 0) {
w_byte(TYPE_IVAR, arg);
}
w_class(TYPE_USERDEF, obj, arg, Qfalse);
w_bytes(RSTRING_PTR(v), RSTRING_LEN(v), arg);
- if (ivtbl) {
- w_ivar(ivtbl, &c_arg);
+ if (hasiv) {
+ w_ivar(obj, ivtbl, &c_arg);
}
return;
}
@@ -725,8 +756,8 @@
break;
}
}
- if (ivtbl) {
- w_ivar(ivtbl, &c_arg);
+ if (hasiv) {
+ w_ivar(obj, ivtbl, &c_arg);
}
}
@@ -823,6 +854,7 @@
arg.taint = Qfalse;
arg.compat_tbl = st_init_numtable();
arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
+ arg.encodings = 0;
c_arg.obj = obj;
c_arg.arg = &arg;
c_arg.limit = limit;
@@ -1050,6 +1082,10 @@
while (len--) {
ID id = r_symbol(arg);
VALUE val = r_object(arg);
+ if (id == rb_id_encoding()) {
+ int idx = rb_enc_find_index(StringValueCStr(val));
+ if (idx > 0) rb_enc_associate_index(obj, idx);
+ }
rb_ivar_set(obj, id, val);
}
}
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml