Squirrel/monasq


Top / Squirrel / monasq

このページは何か? (by ひげぽん)

ななしさん提供によるSquirrel移植monasq のページです。

ファイル

アクション

今後ですが以下のように進めたいのですがいかがでしょう。

  1. monasq を最新版BayGUIで動くようにする(Baysideさんにサポートしてもらう)
  2. subversionリポジトリのtrunk/contribに取り込む
  3. 同梱のドキュメントなどをWikiにも転載する(?)

コメント

最新の1000件を表示しています。 コメントページを参照

お名前:
  • monapi_file_open/read/seek/closeに対応しました。ありがとうございます。>okayuさん -- ひげぽん 2006-11-19 (日) 16:28:55
  • setjmpをmonalibc版に変更しました。monapi_file_read_all, monapi_file_read_directoryに対応しました。monapi_file_open等に対応したいのでサポート頂けると助かります。詳細はSquirrel/monasq/monapiを参照ください。 -- ひげぽん 2006-11-18 (土) 17:29:25
  • 追記です。/trunk/mona/core/monalibc/setjmp/setjmp.asm の更新履歴に Fixed bug. It is make a kernel panic in executing function `longjmp`. とあるので、最新版では修正済みかも知れません。 -- okayu 2006-11-18 (土) 03:02:30
  • こんにちは。ハングアップした setjmp ですが、monalibc 付属のものです。このページの下に『setjmpの件』として詳細を書き込みました。 -- okayu 2006-11-18 (土) 02:27:04
    • わざわざコードまで用意していただいてありがとうございます。最新版のMonaで問題が起きないことを確認しました。 -- ひげぽん 2006-11-18 (土) 12:12:42
  • readme.txtにあった「setjmp / longjmp はハングアップすることがある」ですがハングアップした setjmp は
    • Squirrel付属のもの
    • monalib付属のもの
    • 他のもの
    • いずれでしょうか。改善できるならばしたいと思っていますのでよろしくお願いします。 -- ひげぽん 2006-11-15 (水) 22:37:16
  • 日記で紹介させていただきました、SquirrelがMona OSに移植されたよ -- ひげぽん 2006-11-07 (火) 22:21:38
    • MonaOS 0.3.0 alpha5 上でのアプリ開発時の問題点とその対策をSquirrel/monasq/todoで管理しようと思います。 -- ひげぽん 2006-11-07 (火) 22:31:52
  • 何をしていいのかよく分からなかったので、なんとなく紹介ページを作ってみました。「Squirrel/monasqの使い方」です。どうぞよろしくお願いします。 -- okayu 2006-11-05 (日) 21:57:25
    • ありがとうございます。とても良いページですね。 -- ひげぽん 2006-11-07 (火) 22:08:43
    • BayGUI をスクリプトから扱えるというのはすごい衝撃です!!感動!! -- bayside 2006-11-07 (火) 22:25:31
  • sqstdio.cppのTODO個所は、元々stdout などが未定義のために仮定義を追加した場所なので、削除で問題ないと思います。 -- okayu 2006-11-05 (日) 17:02:19
  • ページ下に修正したコードを置きました>baysideさん -- okayu 2006-11-05 (日) 16:58:15
  • ビルドだけ通したものをリポジトリにコミットしました。コンパイルエラーになった箇所に // TODO というコメントをつけています。これらが解決されれば、最新版への移植は終了です。filemonasq101.zip -- bayside 2006-11-05 (日) 15:26:04
    • ファイルAPIの仕様変更に対応していない
    • monalibc/rand, monalibc/srand がコミットされていないようで参照エラーになる 【済】
    • contrib/Emulators/monasq/sq/sqstdlib/sqstdio.cpp で FILE 構造体を扱っている箇所がコンパイルエラーになる 【済】
    • 拝見しました。monapi_call_file_open→monapi_file_openなどの名前変更は、monasq_monapi.cpp内の名前を置換するだけでOKのはずです。monapi_file_read()への対応は、id管理になったみたいなのでコード直さないと駄目ですね・・・。旧monapi_call_file_read()のラッパーを実装してみます。 -- okayu 2006-11-05 (日) 16:20:16
    • ファイル周りのAPIが変更になって御迷惑をおかけしております。何かありましたらサポートさせてください。 -- ひげぽん 2006-11-07 (火) 22:22:36
  • 作った人です。方針などはお任せします。最新版では動かないのですね。一通り作って満足したのと、MonaOSは make の仕方も実機での動かし方も分からないのとで投げっぱなしにしたくなっちゃいますが、最新版で動くところまではできるだけ頑張らせていただきます。 -- okayu 2006-11-05 (日) 14:28:15
    • 確かに make の仕方も実機での実行の仕方もとっつきにくいですよね・・。本来は MonaADK で作ったものは無修正で最新版に対応したいところですが。最新版と MonaADK の間に若干時差が発生しています。これは自分の怠慢です。make の仕方がわかりづらいのは当面解決される見込みはないので、丸投げもありかなと思います(汗)。 -- bayside 2006-11-05 (日) 15:31:46
  • MonaADK最新版なら、ほぼ無修正で取り込めるかも・・。File I/O があるならそこだけは書き換えないとですね・・。 -- bayside 2006-11-05 (日) 14:14:12
  • アクションに書いたようなフローでななしさんの成果を取り込んで今後のリリースに含めたいのですがいかがでしょうか。 -- ひげぽん 2006-11-05 (日) 09:32:27

C 関数を Squirrel から呼び出す方法についてのメモ

(1)C関数をそのまま登録できるケース

 以下の場合
  引数 :整数値, float, const char*
  戻り値:整数値, float

 登録関数に関数ポインタと関数名文字列を渡すだけで Squirrel から使えるようになります(どうしてこれだけで使えるのか深く考えだすと気味が悪くなりますが、裏でテンプレート機構を使って引数の型や数などを判別してるみたいです)。

Register(v, hNamespace, monapi_file_open, _T("monapi_file_open"));

 なので monapi_file_open(), monapi_file_close() のようにパラメータが単純な関数は、monasq_init_monapi_lib() 内で上記登録関数を呼び出せばOKです。

(2)ラッパー関数を作る必要があるケース

 以下のような場合
  引数や戻り値に構造体が使われている
  引数をポインタとして受け取って、内容を書き換える
  その他

 Squirrel の仮想マシンは内部スタックをC関数に渡すのですが、ラッパー関数を作るにはその受け渡し機構をある程度理解する必要があります。
 このあたりは独特なので、Squirrel リファレンスマニュアルの『第3章 Embedding Squirrel』の、『スタック』『C関数の作成』あたりをざっと読まないと難しいです。

 monapi_file_read(), monapi_file_write() は Squirrelクラスを戻り値/引数に取るため、ラッパー関数が必要です。
 予備知識なしで作るのは無理なので、このページ下の『monapi_file_open等の対応について』を参考にしてください。

(3)Squirrel 用クラスを作る場合

 基本的には(1)と(2)の組み合わせですが、ややこしいので割愛です。もしクラスを作る場合は、SqSharedMemory クラスを定義/登録している部分が参考になると思います。

 MonaSq における関数やクラスの登録はほとんどの場面で SqPlus ヘルパーライブラリを使っていますが、この SqPlus のドキュメントやリファレンスは(日本語でも英語でも)今のところ存在しないようです。本家の掲示板のやり取りと、それをまとめたサンプルコードを読むしかないです。なので、あまり深く足を突っ込まない方が無難かも知れません。

monapi_file_open等の対応について

monapi_file_read() と monapi_file_write() のラッパー関数の実例です。少し書き直しました。
現行 MonaADK 上では動かないためテストできていませんが、多分これでいけるはずと思いますー。

monasq_monapi.cpp 520行目あたりに以下を追加

int wrapper_monapi_file_read(HSQUIRRELVM v) {
   StackHandler sa(v);
   int nargs = sa.GetParamCount(); // 渡された引数の数+1(1つ目の引数には必ず this が渡されるため)
   if (nargs != 3) return 0;       // 引数の数をチェック。スタックに戻り値を積んでいないので0を返す

   int id = sa.GetInt(2);          // 引数1
   int prompt = sa.GetInt(3);      // 引数2
   monapi_cmemoryinfo* mi = monapi_file_read(id, prompt);
   SqSharedMemory::push_memoryMap(mi); // 新しい SqSharedMemory オブジェクトを作成してスタックに push
   return 1;                       // スタックに戻り値を1つ積んだので1を返す
}

int wrapper_monapi_file_write(HSQUIRRELVM v) {
   StackHandler sa(v);
   int nargs = sa.GetParamCount(); // 渡された引数の数+1(1つ目の引数には必ず this が渡されるため)
   if (nargs != 4) return 0;       // 引数の数をチェック。スタックに戻り値を積んでいないので0を返す
   int ret = 0;                    // 戻り値として返す整数値

   int id = sa.GetInt(2);                                          // 引数1
   SqSharedMemory* mem = (SqSharedMemory*)sa.GetInstanceUp(3, 0);  // 引数2
   dword size = (dword)sa.GetInt(4);                               // 引数3
   // ↓TRACEマクロは make DEBUG=TRUE で make すると有効になります
   TRACE("wrapper_monapi_file_write() - id:%d sharedMemoryObj:%08x size:%d\n", id, mem, size);
   if (mem) {
       monapi_cmemoryinfo* mi = mem->mi;   //←SqSharedMemory::mi を public に移動しておいてください
       ret = monapi_file_write(id, mi, size);
   }
   return sa.Return(ret);      // スタックに int値を戻り値として積んで戻る
}

monasq_monapi.cpp 700行目あたりに以下を追加

RegisterVarArgs(v, hNamespace, wrapper_monapi_file_read, _T("monapi_file_read"));
RegisterVarArgs(v, hNamespace, wrapper_monapi_file_write, _T("monapi_file_write"));

テストコード(Squirel用)

local fileID = monapi.monapi_file_open("/AUTOEXEC.MSH", monapi.MONAPI_FALSE);
local mem = monapi.monapi_file_read(fileID, 486);
print("AUTOEXEC.MSH size = 485, readResult size = %d\n", mem.getSize());
monapi.monapi_file_close(fileID);

setjmpの件

以下のコードで、longjmp() 呼び出し時にハングアップすることを確認しました(現行版のMonaADKにてCUIアプリとしてmakeして実行。ハングアップ時、『ASSERT failure setjmp.cpp』と表示が出ます)。

#include <monapi.h>
#include <monalibc/setjmp.h>

jmp_buf g_errorjmp;

int MonaMain(List<char*>* pekoe) {

	if(setjmp(g_errorjmp) == 0) {
		printf("JUMP\n");
		longjmp(g_errorjmp, 1);
	}
	printf("END\n");
	return 0;
}

MENU

now: 2

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 4693, today: 3, yesterday: 0

添付ファイル: filemonasq101.zip 1152件 [詳細] filemonasq100.zip 1135件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:00 (3711d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.135 sec.