ruby049 array.c源码分析

57 篇文章 0 订阅

ruby049 array.c源码分析
我今天发现[]= << 在代码实现上都调用了aset这个函数。但为何只有<<才能自动增长数组呢?
也许是我使用的是高版本的ruby,这个ruby049与之不同呢?
可是,我把编译后的ruby049一执行,就报错:
yang@LAPTOP-H8I0P027:~/work/ruby049/ruby$ ./ruby
puts("ok")
Segmentation fault (core dumped)
yang@LAPTOP-H8I0P027:~/work/ruby049/ruby$ ./ruby -v
[hello] ruby - version 0.49 (18 Jul 94)
可惜我不会用debug呀。

struct RArray {
    struct RBasic basic;
    UINT len, capa;
    VALUE *ptr;
};
其中len和capa有何不同呢?
VALUE
ary_new2(len)
{
    NEWOBJ(ary, struct RArray);
    OBJSETUP(ary, C_Array, T_ARRAY);

    GC_LINK;
    GC_PRO(ary);
    ary->len = 0;
    ary->capa = len;
    ary->ptr = ALLOC_N(VALUE, len);
    GC_UNLINK;

    return (VALUE)ary;
}
在这个函数中,好象len是实际使用的元素个数,而capa是分配的数组元素个数。
static void
astore(ary, idx, val)
    struct RArray *ary;
    int idx;
    VALUE val;
{
    int max;

    if (idx < 0) {
    Fail("negative index for array");
    }

    max = idx + 1;
    if (idx >= ary->capa) {
    GC_LINK; GC_PRO(val);
    ary->capa = max;
    REALLOC_N(ary->ptr, VALUE, max);
    GC_UNLINK;
    }
    if (idx >= ary->len) {
    bzero(ary->ptr+ary->len, sizeof(VALUE)*(max-ary->len));
    }

    if (idx >= ary->len) {
    ary->len = idx + 1;
    }
    ary->ptr[idx] = val;
}
在上面的程序中,好象先判断当前分配的空间是否够,如果不够,就重新分配空间。
如果当前取的值,要大于实际使用的值,就进行赋值,用bzero进行初始化。
这种情况下,
a=[]
len等于0,而capa等于默认值16

a[0]=1
时,
    if (idx >= ary->len) {
    bzero(ary->ptr+ary->len, sizeof(VALUE)*(max-ary->len));
    }

    if (idx >= ary->len) {
    ary->len = idx + 1;
    }
    ary->ptr[idx] = val;
 不是应该可以的吗?
真是搞不明白?
也许是我对几种初始化数组的方法没有搞明白。
我应该再回头看看初始化的方法。
    rb_define_single_method(C_Array, "new", Fary_new, 0);
你看,Fary_new的定义如下,下面也没有调用其它的ary_new3,ary_new4之类的函数呀!!
    static VALUE
Fary_new(class)
    VALUE class;
{
    NEWOBJ(ary, struct RArray);
    OBJSETUP(ary, class, T_ARRAY);

    GC_LINK;
    GC_PRO(ary);
    ary->len = 0;
    ary->capa = ARY_DEFAULT_SIZE;
    ary->ptr = ALLOC_N(VALUE, ARY_DEFAULT_SIZE);
    GC_UNLINK;

    return (VALUE)ary;
}
总之,感觉还是要迫切的把ruby049运行起来,这太离奇了。用ruby2来验证ruby049的代码。
可是,ruby049运行就报错,如何办?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值