2013年3月9日土曜日

python-on-a-chipのPython2.7対応について

新機能の実現はともかくとして、python-on-a-chip(pymite) の vm が Python2.7 のバイトコードで動けば、
現在、Google App Engine(GAE) の Python2.5 で動いているオンラインコンパイラを Python2.7 で動かせるので対応してみました。

src/vm/inter.h
バイトコード表を変更する。typedef enum PmBcode_e を入れ替える。
同じ名前のオペコードでも値が違うのがあります。

src/vm/inter.c
Python2.6 まで使われていた JUMP_IF_FALSE, JUMP_IF_TRUE のバイトコード実行の実装を削除する。

Python2.7 から使われるようになった JUMP_IF_FALSE_OR_POP, JUMP_IF_TRUE_OR_POP,POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE のバイトコード実行の実装を追加する。
引数 target がIP(インストラクションポインタ)相対値ではなくて、絶対値であることに注意。
例:

#ifdef HAVE_PYTHON27
            case JUMP_IF_FALSE_OR_POP:
                t16 = GET_ARG();
                if (obj_isFalse(TOS))
                {
                    PM_IP = PM_FP->fo_func->f_co->co_codeaddr + t16;
                }
                else
                {
                    --PM_SP;
                }
                continue;


LIST_APPEND を引数付きに修正する。python2.6 までは TOS,TOS1 をポップしていたが、 python2.7からは TOS だけをポップすればいいようです。しかし、リスト内包表記 (list comprehension) で式は評価されるが、作ったリストが空になるのはよくわからないです。

#ifdef HAVE_PYTHON27
            case LIST_APPEND:
                t16 = GET_ARG();
                C_ASSERT(t16 >= 2); 
                retval = list_append((*(PM_SP - t16)), TOS);
                PM_SP--;
                continue;


pmImgCreator.py がブラックリスト方式でバイトコードをフィルタしているのでわからないが、Python2.6 までのプログラムを動かすのに必要な追加のバイトコードがあるのかもしれない。
一応、LEDチカチカのプログラムは動いています。

(2013/3/9)
---

0 件のコメント: