# Optimize range space

**URL:** <https://www.ruby-forum.com/t/optimize-range-space/113585>\
**Category:** Development\
**Created:** [September 2, 2007, 8:14am UTC](https://www.ruby-forum.com/t/optimize-range-space/113585 "2007-09-02T08:14:24Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [September 2, 2007, 8:14am UTC](https://www.ruby-forum.com/t/optimize-range-space/113585/1 "2007-09-02T08:14:24Z")

</div>

Range e$B$N%a%b%j\>CHq$r@aLs$9$k$N$O$I$&$G$7$g$&$+!#e(B

Range e$B$O8=:\_e(B T\_OBJECT e$B$G!"%O%C%7%e$r;H$C$F\>pJs$rJ];}$7$^$9!#e(B

e$B$7$+$7!"DL\>o!"e(Bbegin, end, excl e$B$Ne(B  
3e$B$D$N%$%s%9%?%s%9JQ?t$7$+e(B  
e$B;H$$$^$;$s!#e(B

e$B$=$&$9$k$H!"%a%b%j$Oe(B 3 word e$B$"$l$P==J,$G!“e(BRVALUE  
e$B$KKd$a9~$ae(B  
e$B$k$O$:$G$9$,!”%O%C%7%e$r;H$C$F$$$k$?$a!“e(Bst\_table e$B$\*$h$Se(B bins  
e$B$r30It$K3NJ]$9$k$3$H$K$J$C$F$$$^$9!#e(B  
(st e$B$G$Ne(B bins e$B$X$NKd$a9~$\_$r9T$&0JA0$O!”$5$i$Ke(B  
struct st\_table\_entry e$B$,e(B 3e$B$DI,MW$G$7$?e(B)

e$B$3$l$O$"$^$j$KL5BL$J$N$Ge(B Range e$B$re(B T\_STRUCT  
e$B$K$7$FKd$a9~$s$Ge(B  
e$B$\_$?$N$G$9$,$I$&$G$7$g$&$+!#e(B

e$B$?$@!"e(BT\_STRUCT e$B$KJQ$($k$H!"e(Bmarshal e$B$,LdBj$K$J$j$^$9!#e(B  
marshal e$B$N8\_49@-$OJ];}$7$?$$$N$G!"FbIt$N\<BBN$H$O0[$J$k7A$Ge(B  
dump/load e$B$G$-$k$h$&$J;E3]$1$re(B marshal e$BB&$KF~$l$F!"e(Bmarshal  
e$B$7$?%G!\<%?$Oe(B T\_OBJECT e$B$K$J$k$h$&$K$7$^$7$?!#e(B

# Index: eval\_method.ci

— eval\_method.ci (revision 13328)  
+++ eval\_method.ci (working copy)  
@@ -192,6 +192,19 @@  
rb\_add\_method(CLASS\_OF(klass), ID\_ALLOCATOR, 0, NOEX\_UNDEF);  
}

+rb\_alloc\_func\_t  
+rb\_get\_alloc\_func(VALUE klass)  
+{

- NODE \*n;
- Check\_Type(klass, T\_CLASS);
- n = rb\_method\_node(CLASS\_OF(klass), ID\_ALLOCATOR);
- if (!n) return 0;
- if (nd\_type(n) != NODE\_METHOD) return 0;
- n = n-\>nd\_body;
- if (nd\_type(n) != NODE\_CFUNC) return 0;
- return n-\>nd\_cfnc;  
+}
- 

# static NODE \* search\_method(VALUE klass, ID id, VALUE \*klassp) { Index: include/ruby/intern.h

# — include/ruby/intern.h (revision 13328) +++ include/ruby/intern.h (working copy) @@ -218,8 +218,10 @@ #define rb\_disable\_super(klass, name) ((void)0) #define rb\_enable\_super(klass, name) ((void)0) #define HAVE\_RB\_DEFINE\_ALLOC\_FUNC 1 -void rb\_define\_alloc\_func(VALUE, VALUE (\*)(VALUE)); +typedef VALUE (_rb\_alloc\_func\_t)(VALUE); +void rb\_define\_alloc\_func(VALUE, rb\_alloc\_func\_t); void rb\_undef\_alloc\_func(VALUE); +rb\_alloc\_func\_t rb\_get\_alloc\_func(VALUE); void rb\_clear\_cache(void); void rb\_clear\_cache\_by\_class(VALUE); void rb\_alias(VALUE, ID, ID); @@ -355,6 +357,7 @@ /_ marshal.c \*/ VALUE rb\_marshal\_dump(VALUE, VALUE); VALUE rb\_marshal\_load(VALUE); +void rb\_marshal\_define\_compat(VALUE newclass, VALUE oldclass, VALUE (\*dumper)(VALUE), VALUE (_loader)(VALUE, VALUE)); /_ numeric.c \*/ void rb\_num\_zerodiv(void); VALUE rb\_num\_coerce\_bin(VALUE, VALUE); Index: range.c

— range.c (revision 13328)  
+++ range.c (working copy)  
@@ -15,10 +15,34 @@  
VALUE rb\_cRange;  
static ID id\_cmp, id\_succ, id\_beg, id\_end, id\_excl;

-#define EXCL® RTEST(rb\_ivar\_get(®, id\_excl))  
-#define SET\_EXCL(r,v) rb\_ivar\_set(®, id\_excl, (v) ? Qtrue : Qfalse)  
+#define RANGE\_BEG® (RSTRUCT®-\>as.ary[0])  
+#define RANGE\_END® (RSTRUCT®-\>as.ary[1])  
+#define RANGE\_EXCL® (RSTRUCT®-\>as.ary[2])

+#define EXCL® RTEST(RANGE\_EXCL®)  
+#define SET\_EXCL(r,v) (RSTRUCT®-\>as.ary[2] = (v) ? Qtrue : Qfalse)  
+  
+#define FL\_INITIALIZED FL\_USER3  
+  
static VALUE  
+range\_alloc(VALUE klass)  
+{

- long n;
- NEWOBJ(r, struct RStruct);
- OBJSETUP(r, klass, T\_STRUCT);
- 
- n = 3;
- 
- RBASIC®-\>flags &= ~RSTRUCT\_EMBED\_LEN\_MASK;
- RBASIC®-\>flags |= n \<\< RSTRUCT\_EMBED\_LEN\_SHIFT;
- rb\_mem\_clear(r-\>as.ary, n);
- 
- RBASIC®-\>flags &= ~FL\_INITIALIZED;
- 
- return (VALUE)r;  
+}
- 

+static VALUE  
range\_failed(void)  
{  
rb\_raise(rb\_eArgError, “bad value for range”);  
@@ -48,8 +72,8 @@  
}

```
 SET_EXCL(range, exclude_end);

```

- rb\_ivar\_set(range, id\_beg, beg);
- rb\_ivar\_set(range, id\_end, end);

- RSTRUCT(range)-\>as.ary[0] = beg;
- RSTRUCT(range)-\>as.ary[1] = end;  
}

VALUE  
@@ -77,9 +101,10 @@

```
 rb_scan_args(argc, argv, "21", &beg, &end, &flags);
 /* Ranges are immutable, so that they should be initialized only 

```

once. \*/

- if (rb\_ivar\_defined(range, id\_beg)) {

- if (RBASIC(range)-\>flags & FL\_INITIALIZED) {  
rb\_name\_error(rb\_intern(“initialize”), “`initialize’ called twice”);  
}
- RBASIC(range)-\>flags |= FL\_INITIALIZED;  
range\_init(range, beg, end, RTEST(flags));  
return Qnil;  
}  
@@ -121,9 +146,9 @@  
if (!rb\_obj\_is\_instance\_of(obj, rb\_obj\_class(range)))  
return Qfalse;

- if (!rb\_equal(rb\_ivar\_get(range, id\_beg), rb\_ivar\_get(obj,  
id\_beg)))

- if (!rb\_equal(RANGE\_BEG(range), RANGE\_BEG(obj)))  
return Qfalse;

- if (!rb\_equal(rb\_ivar\_get(range, id\_end), rb\_ivar\_get(obj,  
id\_end)))

- if (!rb\_equal(RANGE\_END(range), RANGE\_END(obj)))  
return Qfalse;

- if (!rb\_eql(rb\_ivar\_get(range, id\_beg), rb\_ivar\_get(obj, id\_beg)))

- if (!rb\_eql(RANGE\_BEG(range), RANGE\_BEG(obj)))  
return Qfalse;

- if (!rb\_eql(rb\_ivar\_get(range, id\_end), rb\_ivar\_get(obj, id\_end)))

- if (!rb\_eql(RANGE\_END(range), RANGE\_END(obj)))  
return Qfalse;

- v = rb\_hash(rb\_ivar\_get(range, id\_beg));

- v = rb\_hash(RANGE\_BEG(range));  
hash ^= v \<\< 1;

- v = rb\_hash(rb\_ivar\_get(range, id\_end));

- v = rb\_hash(RANGE\_END(range));  
hash ^= v \<\< 9;  
hash ^= EXCL(range) \<\< 24;

@@ -289,8 +314,8 @@

```
 RETURN_ENUMERATOR(range, argc, argv);

```

- b = rb\_ivar\_get(range, id\_beg);
- e = rb\_ivar\_get(range, id\_end);

- b = RANGE\_BEG(range);

- e = RANGE\_END(range);  
if (rb\_scan\_args(argc, argv, “01”, &step) == 0) {  
step = INT2FIX(1);  
}  
@@ -382,8 +407,8 @@

- beg = rb\_ivar\_get(range, id\_beg);
- end = rb\_ivar\_get(range, id\_end);

- beg = RANGE\_BEG(range);

- end = RANGE\_END(range);

- return rb\_ivar\_get(range, id\_beg);

- return RANGE\_BEG(range);  
}

@@ -442,7 +467,7 @@  
static VALUE  
range\_last(VALUE range)  
{

- return rb\_ivar\_get(range, id\_end);

- return RANGE\_END(range);  
}

/\*  
@@ -464,8 +489,8 @@  
return rb\_call\_super(0, 0);  
}  
else {

- VALUE b = rb\_ivar\_get(range, id\_beg);
- VALUE e = rb\_ivar\_get(range, id\_end);

- VALUE b = RANGE\_BEG(range);

- VALUE e = RANGE\_END(range);  
int c = rb\_cmpint(rb\_funcall(b, id\_cmp, 1, e), b, e);

- VALUE e = rb\_ivar\_get(range, id\_end);

- VALUE e = RANGE\_END(range);  
int ip = FIXNUM\_P(e) || rb\_obj\_is\_kind\_of(e, rb\_cInteger);

- VALUE b = rb\_ivar\_get(range, id\_beg);

- VALUE b = RANGE\_BEG(range);  
int c = rb\_cmpint(rb\_funcall(b, id\_cmp, 1, e), b, e);

- b = rb\_ivar\_get(range, id\_beg);
- e = rb\_ivar\_get(range, id\_end);

- b = RANGE\_BEG(range);
- e = RANGE\_END(range);  
excl = EXCL(range);  
}  
else {  
@@ -578,8 +603,8 @@  
{  
VALUE str, str2;

- str = rb\_obj\_as\_string(rb\_ivar\_get(range, id\_beg));
- str2 = rb\_obj\_as\_string(rb\_ivar\_get(range, id\_end));

- str = rb\_obj\_as\_string(RANGE\_BEG(range));
- str2 = rb\_obj\_as\_string(RANGE\_END(range));  
str = rb\_str\_dup(str);  
rb\_str\_cat(str, “…”, EXCL(range) ? 3 : 2);  
rb\_str\_append(str, str2);  
@@ -616,8 +641,8 @@  
{  
VALUE str, str2;

- str = rb\_inspect(rb\_ivar\_get(range, id\_beg));
- str2 = rb\_inspect(rb\_ivar\_get(range, id\_end));

- str = rb\_inspect(RANGE\_BEG(range));
- str2 = rb\_inspect(RANGE\_END(range));  
str = rb\_str\_dup(str);  
rb\_str\_cat(str, “…”, EXCL(range) ? 3 : 2);  
rb\_str\_append(str, str2);  
@@ -668,8 +693,8 @@  
static VALUE  
range\_include(VALUE range, VALUE val)  
{

- VALUE beg = rb\_ivar\_get(range, id\_beg);
- VALUE end = rb\_ivar\_get(range, id\_end);

- VALUE beg = RANGE\_BEG(range);
- VALUE end = RANGE\_END(range);  
int nv = FIXNUM\_P(beg) || FIXNUM\_P(end) ||  
rb\_obj\_is\_kind\_of(beg, rb\_cNumeric) ||  
rb\_obj\_is\_kind\_of(end, rb\_cNumeric);  
@@ -711,8 +736,8 @@  
{  
VALUE beg, end;

- beg = rb\_ivar\_get(range, id\_beg);
- end = rb\_ivar\_get(range, id\_end);

- beg = RANGE\_BEG(range);
- end = RANGE\_END(range);  
if (r\_le(beg, val)) {  
if (EXCL(range)) {  
if (r\_lt(val, end))  
@@ -726,7 +751,34 @@  
return Qfalse;  
}

+static VALUE  
+range\_dumper(VALUE range)  
+{

- VALUE v;

- NEWOBJ(m, struct RObject);

- OBJSETUP(m, rb\_cObject, T\_OBJECT);

- v = (VALUE)m;

- 
- rb\_ivar\_set(v, id\_excl, EXCL(range) ? Qtrue : Qfalse);

- rb\_ivar\_set(v, id\_beg, RANGE\_BEG(range));

- rb\_ivar\_set(v, id\_end, RANGE\_END(range));

- return v;  
+}

- 

+static VALUE  
+range\_loader(VALUE range, VALUE obj)  
+{

- if (TYPE(obj) != T\_OBJECT || RBASIC(obj)-\>klass != rb\_cObject) {
- 

```
   rb_raise(rb_eTypeError, "not a dumped range object");

```

- }
- 
- RSTRUCT(range)-\>as.ary[0] = rb\_ivar\_get(obj, id\_beg);
- RSTRUCT(range)-\>as.ary[1] = rb\_ivar\_get(obj, id\_end);
- SET\_EXCL(range, RTEST(rb\_ivar\_get(obj, id\_excl)));
- return range;  
+}
- 

/\* A `Range` represents an interval—a set of values with  
a

- start and an end. Ranges may be constructed using the
- _s_`…`_e_ and  
@@ -782,8 +834,25 @@  
void  
Init\_Range(void)  
{

- VALUE members;
- 
- id\_cmp = rb\_intern("\<=\>");
- id\_succ = rb\_intern(“succ”);
- id\_beg = rb\_intern(“begin”);
- id\_end = rb\_intern(“end”);
- id\_excl = rb\_intern(“excl”);
- rb\_cRange = rb\_define\_class(“Range”, rb\_cObject);
- 
- /\* compatibility for rb\_struct\_members, etc. \*/
- members = rb\_ary\_new3(3, ID2SYM(id\_beg), ID2SYM(id\_end),  
ID2SYM(id\_excl));
- OBJ\_FREEZE(members);
- rb\_iv\_set(rb\_cRange, “ **size** ”, INT2FIX(3));
- rb\_iv\_set(rb\_cRange, “ **members** ”, members);
- 
- rb\_define\_alloc\_func(rb\_cRange, range\_alloc);  
rb\_include\_module(rb\_cRange, rb\_mEnumerable);
- rb\_marshal\_define\_compat(rb\_cRange, rb\_cObject, range\_dumper,  
range\_loader);  
rb\_define\_method(rb\_cRange, “initialize”, range\_initialize, -1);  
rb\_define\_method(rb\_cRange, “==”, range\_eq, 1);  
rb\_define\_method(rb\_cRange, “===”, range\_eqq, 1);  
@@ -807,9 +876,4 @@  
rb\_define\_method(rb\_cRange, “include?”, range\_include, 1);  
rb\_define\_method(rb\_cRange, “cover?”, range\_cover, 1);

- id\_cmp = rb\_intern("\<=\>");
- id\_succ = rb\_intern(“succ”);
- id\_beg = rb\_intern(“begin”);
- id\_end = rb\_intern(“end”);
- id\_excl = rb\_intern(“excl”);  
}  
Index: inits.c  
===================================================================  
— inits.c (revision 13328)  
+++ inits.c (working copy)  
@@ -76,6 +76,7 @@  
Init\_Struct();  
Init\_Regexp();  
Init\_pack();

- Init\_marshal();  
Init\_Range();  
Init\_IO();  
Init\_Dir();  
@@ -88,7 +89,6 @@  
Init\_Binding();  
Init\_Math();  
Init\_GC();

- Init\_marshal();  
Init\_Enumerator();  
Init\_VM();  
Init\_ISeq();  
Index: marshal.c  
===================================================================  
— marshal.c (revision 13328)  
+++ marshal.c (working copy)  
@@ -82,12 +82,45 @@  
static ID s\_dump\_data, s\_load\_data, s\_alloc;  
static ID s\_getc, s\_read, s\_write, s\_binmode;

+typedef struct {

- VALUE newclass;
- VALUE oldclass;
- VALUE (\*dumper)(VALUE);
- VALUE (\*loader)(VALUE, VALUE);  
+} marshal\_compat\_t;
- 

+static st\_table \*compat\_allocator\_tbl;  
+  
+void  
+rb\_marshal\_define\_compat(VALUE newclass, VALUE oldclass, VALUE  
(\*dumper)(VALUE), VALUE (\*loader)(VALUE, VALUE))  
+{

- marshal\_compat\_t \*compat;
- rb\_alloc\_func\_t allocator = rb\_get\_alloc\_func(newclass);
- 
- if (!allocator) {
- 

```
   rb_raise(rb_eTypeError, "no allocator");

```

- }
- 
- compat = ALLOC(marshal\_compat\_t);
- compat-\>newclass = Qnil;
- compat-\>oldclass = Qnil;
- rb\_gc\_register\_address(&compat-\>newclass);
- rb\_gc\_register\_address(&compat-\>oldclass);
- compat-\>newclass = newclass;
- compat-\>oldclass = oldclass;
- compat-\>dumper = dumper;
- compat-\>loader = loader;
- 
- st\_insert(compat\_allocator\_tbl, (st\_data\_t)allocator,  
(st\_data\_t)compat);  
+}
- 

struct dump\_arg {  
VALUE obj;  
VALUE str, dest;  
st\_table \*symbols;  
st\_table \*data;  
int taint;

- st\_table \*compat\_tbl;  
};

struct dump\_call\_arg {  
@@ -363,8 +396,13 @@  
{  
volatile VALUE p;  
char \*path;

- VALUE real\_obj;
- VALUE klass;

- VALUE klass = CLASS\_OF(obj);

- if (st\_lookup(arg-\>compat\_tbl, (st\_data\_t)obj,  
(st\_data\_t\*)&real\_obj)) {
- 

```
   obj = real_obj;

```

- }
- klass = CLASS\_OF(obj);  
w\_extended(klass, arg, check);  
w\_byte(type, arg);  
p = class2path(rb\_class\_real(klass));  
@@ -459,6 +497,19 @@  
if (OBJ\_TAINTED(obj)) arg-\>taint = Qtrue;

st\_add\_direct(arg-\>data, obj, arg-\>data-\>num\_entries);  
+

- 

```
   {

```

- 

```
       marshal_compat_t *compat;

```

- 

```
       rb_alloc_func_t allocator = 

```

rb\_get\_alloc\_func(RBASIC(obj)-\>klass);

- 

```
       if (st_lookup(compat_allocator_tbl,

```

- 

```
                     (st_data_t)allocator,

```

- 

```
                     (st_data_t*)&compat)) {

```

- 

```
           VALUE real_obj = obj;

```

- 

```
           obj = compat->dumper(real_obj);

```

- 

```
           st_insert(arg->compat_tbl, (st_data_t)obj, 

```

(st\_data\_t)real\_obj);

- 

```
       }

```

- 

```
   }

```

- if (rb\_respond\_to(obj, s\_mdump)) {  
VALUE v;

@@ -720,6 +771,7 @@  
arg.symbols = st\_init\_numtable();  
arg.data = st\_init\_numtable();  
arg.taint = Qfalse;

- arg.compat\_tbl = st\_init\_numtable();  
c\_arg.obj = obj;  
c\_arg.arg = &arg;  
c\_arg.limit = limit;  
@@ -739,6 +791,7 @@  
VALUE data;  
VALUE proc;  
int taint;
- st\_table \*compat\_tbl;  
};

static VALUE r\_entry(VALUE v, struct load\_arg \*arg);  
@@ -899,14 +952,41 @@  
static VALUE  
r\_entry(VALUE v, struct load\_arg \*arg)  
{

- rb\_hash\_aset(arg-\>data, INT2FIX(RHASH\_SIZE(arg-\>data)), v);
- if (arg-\>taint) OBJ\_TAINT(v);

- VALUE real\_obj = Qundef;
- if (st\_lookup(arg-\>compat\_tbl, v, (st\_data\_t\*)&real\_obj)) {
- 

```
   rb_hash_aset(arg->data, INT2FIX(RHASH_SIZE(arg->data)), 

```

real\_obj);

- }
- else {
- 

```
   rb_hash_aset(arg->data, INT2FIX(RHASH_SIZE(arg->data)), v);

```

- }
- if (arg-\>taint) {
- 

```
   OBJ_TAINT(v);

```

- 

```
   if (real_obj != Qundef)

```

- 

```
       OBJ_TAINT(real_obj);

```

- }  
if (arg-\>proc) {  
v = rb\_funcall(arg-\>proc, rb\_intern(“call”), 1, v);  
}  
return v;  
}

+static VALUE  
+r\_leave(VALUE v, struct load\_arg \*arg)  
+{

- VALUE real\_obj;
- marshal\_compat\_t \*compat;
- if (st\_lookup(arg-\>compat\_tbl, v, &real\_obj)) {
- 

```
   rb_alloc_func_t allocator = 

```

rb\_get\_alloc\_func(CLASS\_OF(real\_obj));

- 

```
   st_data_t key = v;

```

- 

```
   if (st_lookup(compat_allocator_tbl, (st_data_t)allocator, 

```

(st\_data\_t\*)&compat)) {

- 

```
       compat->loader(real_obj, v);

```

- 

```
   }

```

- 

```
   st_delete(arg->compat_tbl, &key, 0);

```

- 

```
   return real_obj;

```

- }
- return v;  
+}
- 

static void  
r\_ivar(VALUE obj, struct load\_arg \*arg)  
{  
@@ -945,6 +1025,26 @@  
}

static VALUE  
+obj\_alloc\_by\_path(const char \*path, struct load\_arg \*arg)  
+{

- VALUE klass;
- marshal\_compat\_t \*compat;
- rb\_alloc\_func\_t allocator;
- 
- klass = path2class(path);
- 
- allocator = rb\_get\_alloc\_func(klass);
- if (st\_lookup(compat\_allocator\_tbl, (st\_data\_t)allocator,  
(st\_data\_t\*)&compat)) {
- 

```
   VALUE real_obj = rb_obj_alloc(klass);

```

- 

```
   VALUE obj = rb_obj_alloc(compat->oldclass);

```

- 

```
   st_insert(arg->compat_tbl, (st_data_t)obj, 

```

(st\_data\_t)real\_obj);

- 

```
   return obj;

```

- }
- 
- return rb\_obj\_alloc(klass);  
+}
- 

+static VALUE  
r\_object0(struct load\_arg \*arg, int \*ivp, VALUE extmod)  
{  
VALUE v = Qnil;  
@@ -1049,6 +1149,7 @@  
}  
v = rb\_float\_new(d);  
v = r\_entry(v, arg);

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1094,11 +1195,13 @@  
}  
v = rb\_big\_norm((VALUE)big);  
v = r\_entry(v, arg);

- 

```
       v = r_leave(v, arg);

```

}  
break;

```
 case TYPE_STRING:

```

v = r\_entry(r\_string(arg), arg);

- 

```
   v = r_leave(v, arg);

```

break;

```
 case TYPE_REGEXP:

```

@@ -1106,6 +1209,7 @@  
volatile VALUE str = r\_bytes(arg);  
int options = r\_byte(arg);  
v = r\_entry(rb\_reg\_new(str, options), arg);

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1118,6 +1222,7 @@  
while (len–) {  
rb\_ary\_push(v, r\_object(arg));  
}

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1136,6 +1241,7 @@  
if (type == TYPE\_HASH\_DEF) {  
RHASH(v)-\>ifnone = r\_object(arg);  
}

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1170,6 +1276,7 @@  
}  
rb\_struct\_aset(v, LONG2FIX(i), r\_object(arg));  
}

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1189,6 +1296,7 @@  
}  
v = rb\_funcall(klass, s\_load, 1, data);  
v = r\_entry(v, arg);

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1211,19 +1319,19 @@  
v = r\_entry(v, arg);  
data = r\_object(arg);  
rb\_funcall(v, s\_mload, 1, data);

- 

```
       v = r_leave(v, arg);

```

}  
break;

```
 case TYPE_OBJECT:

```

{

- 

```
 VALUE klass = path2class(r_unique(arg));

```

- 
- 

```
 v = rb_obj_alloc(klass);

```

- 

```
       v = obj_alloc_by_path(r_unique(arg), arg);
 if (TYPE(v) != T_OBJECT) {

```

rb\_raise(rb\_eArgError, “dump format error”);  
}  
v = r\_entry(v, arg);  
r\_ivar(v, arg);
- 

```
 v = r_leave(v, arg);

```

}  
break;

@@ -1251,6 +1359,7 @@  
rb\_class2name(klass));  
}  
rb\_funcall(v, s\_load\_data, 1, r\_object0(arg, 0, extmod));

- 

```
      v = r_leave(v, arg);
  }
  break;

```

@@ -1260,6 +1369,7 @@

```
   v = rb_path2class(RSTRING_PTR(str));
   v = r_entry(v, arg);

```

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1269,6 +1379,7 @@

```
   v = path2class(RSTRING_PTR(str));
   v = r_entry(v, arg);

```

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1278,6 +1389,7 @@

```
   v = path2module(RSTRING_PTR(str));
   v = r_entry(v, arg);

```

- 

```
       v = r_leave(v, arg);

```

}  
break;

@@ -1350,6 +1462,7 @@  
}  
arg.src = port;  
arg.offset = 0;

- arg.compat\_tbl = st\_init\_numtable();

- 
- compat\_allocator\_tbl = st\_init\_numtable();  
}

VALUE

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [September 8, 2007, 4:44am UTC](https://www.ruby-forum.com/t/optimize-range-space/113585/2 "2007-09-08T04:44:19Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> Range e$B$N%a%b%j\>CHq$r@aLs$9$k$N$O$I$&$G$7$g$&$+!#e(B

e$B$I$N$/$i$$@aLs$G$-$k$N$+B,$C$F$\_$^$7$?!#e(B

e$B@aLs$9$kA0$O!"0J2\<$N$h$&$K!"e(B1000000e$B8D$Ne(B range  
e$B$r@8@.$9$k$He(B  
106Mbytes e$B$[$II,MW$G$9!#e(B

% time ./ruby -e ‘a = []; 1000000.times {|i| a \<\< (i…i) }  
print File.read(“/proc/#{$$}/status”).gsub(/^[^V].\*\n/, “”)’  
VmPeak: 105604 kB  
VmSize: 105604 kB  
VmLck: 0 kB  
VmHWM: 102596 kB  
VmRSS: 102596 kB  
VmData: 102772 kB  
VmStk: 84 kB  
VmExe: 1176 kB  
VmLib: 1492 kB  
VmPTE: 116 kB  
./ruby -e 7.61s user 0.20s system 98% cpu 7.952 total

e$B@aLs$9$k$H!"0J2\<$N$h$&$K!"e(B 35Mbytes e$B$[$I$G:Q$\_$^$9!#e(B

% time ./ruby -e ‘a = []; 1000000.times {|i| a \<\< (i…i) }  
print File.read(“/proc/#{$$}/status”).gsub(/^[^V].\*\n/, “”)’  
VmPeak: 35416 kB  
VmSize: 35416 kB  
VmLck: 0 kB  
VmHWM: 32424 kB  
VmRSS: 32424 kB  
VmData: 32588 kB  
VmStk: 84 kB  
VmExe: 1176 kB  
VmLib: 1492 kB  
VmPTE: 48 kB  
./ruby -e 3.18s user 0.06s system 97% cpu 3.332 total

e$B$D$^$j!";HMQ%a%b%j$OH\>J,0J2\<$K$J$j!"3d9g$H$7$F$OLse(B 6e$B3d:o8:$Ge(B  
e$B$-$F$$$^$9!#e(B

e$B$5$i$K!"$+$+$C$?;~4V$b!"e(B8e$BIC$+$ie(B  
3.3e$BIC$/$i$$$H8:$j!"G\0J\>e$Ke(B  
e$B9bB.2=$7$F$$$^$9!#e(B

e$B$3$&$7$F$\_$k$H!“$$$^$Ne(B Range e$B$,$$$+$KL5BL$J$3$H$r$7$F$$$k$+e(B  
e$B$H$$$&$N$,$o$+$k$N$G$9$,!”$$$+$,$G$7$g$&$+!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [September 8, 2007, 4:15pm UTC](https://www.ruby-forum.com/t/optimize-range-space/113585/3 "2007-09-08T16:15:10Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:31760] Re: optimize range space”  
on Sat, 8 Sep 2007 11:43:52 +0900, Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
| Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:  
|  
|\> Range e$B$N%a%b%j\>CHq$r@aLs$9$k$N$O$I$&$G$7$g$&$+!#e(B  
|  
|e$B$I$N$/$i$$@aLs$G$-$k$N$+B,$C$F$_$^$7$?!#e(B  
|  
|e$B@aLs$9$kA0$O!“0J2\<$N$h$&$K!“e(B1000000e$B8D$Ne(B range e$B$r@8@.$9$k$He(B  
|106Mbytes e$B$[$II,MW$G$9!#e(B  
|  
|% time ./ruby -e 'a = []; 1000000.times {|i| a \<\< (i…i) }  
|print File.read(”/proc/#{$$}/status”).gsub(/^[^V].\*\n/, “”)’  
|VmPeak: 105604 kB  
|VmSize: 105604 kB  
|VmLck: 0 kB  
|VmHWM: 102596 kB  
|VmRSS: 102596 kB  
|VmData: 102772 kB  
|VmStk: 84 kB  
|VmExe: 1176 kB  
|VmLib: 1492 kB  
|VmPTE: 116 kB  
|./ruby -e 7.61s user 0.20s system 98% cpu 7.952 total  
|  
|e$B@aLs$9$k$H!"0J2\<$N$h$&$K!"e(B 35Mbytes e$B$[$I$G:Q$_$^$9!#e(B  
|  
|% time ./ruby -e ‘a = []; 1000000.times {|i| a \<\< (i…i) }  
|print File.read(“/proc/#{$$}/status”).gsub(/^[^V].\*\n/, “”)’  
|VmPeak: 35416 kB  
|VmSize: 35416 kB  
|VmLck: 0 kB  
|VmHWM: 32424 kB  
|VmRSS: 32424 kB  
|VmData: 32588 kB  
|VmStk: 84 kB  
|VmExe: 1176 kB  
|VmLib: 1492 kB  
|VmPTE: 48 kB  
|./ruby -e 3.18s user 0.06s system 97% cpu 3.332 total  
|  
|e$B$D$^$j!";HMQ%a%b%j$OH\>J,0J2\<$K$J$j!“3d9g$H$7$F$OLse(B 6e$B3d:o8:$Ge(B  
|e$B$-$F$$$^$9!#e(B  
|  
|e$B$5$i$K!”$+$+$C$?;~4V$b!“e(B8e$BIC$+$ie(B 3.3e$BIC$/$i$$$H8:$j!“G\0J\>e$Ke(B  
|e$B9bB.2=$7$F$$$^$9!#e(B  
|  
|e$B$3$&$7$F$\_$k$H!”$$$^$Ne(B Range e$B$,$$$+$KL5BL$J$3$H$r$7$F$$$k$+e(B  
|e$B$H$$$&$N$,$o$+$k$N$G$9$,!”$$$+$,$G$7$g$&$+!#e(B

e$B?t;z$,$"$k$H@bF@NO$,A}$7$^$9$M!#%3%\_%C%H$7$F$/$@$5$$!#e(B
