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