2008-05-11

リストと配列 その2 push/popとshift/unshift

昨日の続きで、リストと配列の実装を追います。今日はpush/popとshift/unshiftです。

まずは push/pop。配列の末尾に追加(push)、末尾から削除(pop)するものです。

store に処理を任せてますね。要素数を一個増やして末尾に追加。 次はpop。

array.c:103

要素数を一個減らして末尾を Nullstr で埋めて、それまで入ってた奴を戻すと。

さて次は配列の先頭を操作するshift/unshift。まずは先頭から一つ取り出す shift。

配列1つめから末尾までのデータを先頭にコピーして、 要素数を一つへらしつつ最後の要素に Nullstrを入れると。

次は先頭に追加するunshift。

array.c:116

ダミー要素を末尾に store を利用して追加した上で、 既存の要素ポインタを一個づつずらして言ってます。 引数が num であることからどうも aunshift 自体は要素を追加するわけではなくて、 先頭に追加する要素分だけスペースを空けるだけのようです。

というわけで aunshift が呼ばれている部分を見てみます。 呼び出し元はやはり arg.c の eval でした。

arg.c:2059

if AF_SPECIAL else のほうで aunshift で一つスペースを空けた上で、 ゼロ番目にastore しています。AF_SPECIALのほうでやってる do_unshift は配列を指定されたときかな?

do_unshift は同じく arg.c の中にありました。

arg.c:827

どうもそんな雰囲気です。最初に eval して配列を取得した上でその要素だけ指定された配列の先頭に aunshift、astore してます。

AF_SPECIAL というのが何かよくわかりません。arg の内容が問題です。

そろそろ eval の引数を詳しく見た方がいいかもしれません。また今度やります。

Trackback

No Trackbacks

Track from Your Website

http://coji.s9.xrea.com/trackback/tb.php?id=69

Comment

No Comments

Post Your Comment


*は入力必須です。E-Mailは公開されません。