現在、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 件のコメント:
コメントを投稿