[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[pilot-tech-ml 91] Re: スタックの 拡張方法
saveStack, newStackは古いスタックフレームに
確保されませんか?
-------
青柳龍也 津田塾大学 情報数理科学科
aoyagi@tsuda.ac.jp
In message <1312793098-973147@wakuwaku.ne.jp>
"Shuji Fukumoto" <fukumoto@wakuwaku.ne.jp> wrote:
> こんばんは、福本です。
>
> 以前から「Drag&Drop」のモジュールからJ-OSを呼び出すとスタックが溢れて飛ん
> でしまう問題が有ったのですが、シャワーを浴びているとき(^^)にふとある方法を思
> い付いて実験してみました。で、以前「Tango」が使えなかったというユーザーの方
> に試してもらったのですが、うまく動作したようでした。ただ、繰り返し呼び出すと
> フリーズしたそうです。このフリーズはどこに関係するのか分からないので、この方
> 法が完全だとはまだ言い切れないのです。
>
> そこで今回とった方法についてご意見を戴けたらと思います。その方法は、「新規
> にスタックスペースを確保して、すり替える」というものです。具体的には、
>
> // A7がスタック?
> ULong saveStack, newStack, p;
> newStack = (ULong) MemPtrNew (dStackSize);
> if (newStack != 0)
> {
> p = newStack - dStackSize;
> saveStack = __getA7 ();
> __setA7 (p);
> }
>
> outHandled = handleFieldDown (&event, FrmGetActiveForm (), inField);
>
> if (newStack)
> {
> __setA7 (saveStack);
> MemPtrFree ((Ptr) newStack);
> }
>
> という具合にhandleFieldDown()を呼び出す前にメモリを確保して、現在のA7レジス
> タをすり替えています。皆がこの方法を取ると大変なことになりそうですが...
>
> ちなみに __getA7()と__setA7は、CodeWarriorのライブラリソースを見てて見つけ
> ました(^^)。
>
> アセンブラの知識はほとんど無いのですが、考え方は有っていますよね?
>
> いかがでしょうか?
> ----------------------------------
> Shuji Fukumoto
> fukumoto@wakuwaku.ne.jp
> PXY00620@niftyserve.or.jp
> http://www.wakuwaku.ne.jp/shuji/
> Hiroshima JAPAN
> ----------------------------------
>