このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

AppleScriptのスタックについて

発言者:みやむら
( Date Thursday, March 19, 1998 20:27:45 )


先日はお助けいただき、ありがとうございました。
あれから、AppleScriptを猛勉強し、ようやく、イロハが
わかるようになってきました。

CGIKitのguestmail.acgiを使用させていただいているのですが、
スクリプトを書き終えいざ、実行すると下記のような
エラーがでてしまいます。
これを回避することってできないのでしょうか?

『スクリプトのスタックが桁あふれを起こしましたので
スクリプトを実行できません』

よろしく、お願いいたします。

田中求之 さんからのコメント
( Thursday, March 19, 1998 20:44:58 )

スクリプトの中に文字列をたくさん用いると、おっしゃるような Stack Overflow
のエラーになります。ページの HTML を丸ごとスクリプトの中に書いてしまった場合
などですね。

対策としては、ページのデータをファイルとして作っておいて読み込むようにする
といったことが考えられますが、どの程度までが OK なのかは、実はよく分かりません。
そもそも、なんで長い文字列を使うと Stack Overflow を起こすのかも、よく分
かっていません。


なお、スクリプトを実行専用でアプリケーション化すると、メモリー関係のエラーは
格段に少なくなります。このへんも組み合わせて、ご自分で解決方法をさがしてみて
ください。

みやむら さんからのコメント
( Thursday, March 19, 1998 22:48:32 )

>スクリプトの中に文字列をたくさん用いると、おっしゃるような Stack Overflow
>のエラーになります。
そのような事がおこるのですね。
さっそく、スクリプト内の整理を行い、
無事、動かすことができました。
ありがとうございました。

前薗 健一 さんからのコメント
( Friday, March 20, 1998 00:40:57 )

田中さん

> そもそも、なんで長い文字列を使うと Stack Overflow を起こすのかも、よく分
> かっていません。

文字列 = メモリ = local 変数ですので、stack 領域を圧迫しているのだと
思います。

property だと global 変数扱いになるのかはわかりませんが。

田中求之 さんからのコメント
( Friday, March 20, 1998 01:29:25 )

>文字列 = メモリ = local 変数ですので、stack 領域を圧迫しているのだと
>思います。

あ、問題は、その限度がよく分からないってことなんです。書き方を変えただけで
エラーが消えたりするんですよ。


前薗 健一 さんからのコメント
( Friday, March 20, 1998 04:40:09 )

失礼しました。m(..)m

AppleScript の Compiler の問題でしょうね。
と、逃げる... (^^;

田中求之 さんからのコメント
( Wednesday, March 25, 1998 01:32:14 )

Macintosh Scripting Systems ML で、この件に関して情報が得られました。

AppleScript 1.1 までは、変数やハンドラーを内部で管理している Symbols Table
のサイズが固定されており、このため、Stack Overflow が生じやすい。不要になった
ハンドラーの情報は System を Restart するまで消えないという問題もあるらしい。

AppleScript 1.2 (MacOS 8 に付属)でも、Symbol Table のサイズは固定だが、
サイズが大きくなったので、Stack Overflow は起きにくくなっている。

次期の AppleScript では、Symbol Table のサイズがダイナミックに割り当てられる
ようになるらしい。

…とのことです。

田中求之 さんからのコメント
( Wednesday, March 25, 1998 01:33:54 )

ようは、Stack Overflow がけっこう起きやすいという問題があるということに
なるんでしょうかね。

実際、上記の ML でも、定期的に Stack Overflow が起きたのだけど…という
ような話が出てきてましたし。