SpiderMonkey:call_Lua51 似非モジュール

2017-04-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-04-17)の記事「call_Lua 似非モジュール:Lua51 汎用・決定版」で、
call_Lua51_Gen.gsl から、Lua51_Gen.lua を呼び出せたが、
所詮 GSL Shell からの LuaJIT の呼び出しで、全く無意味なこと?


そこで、本当の? call_Lua と云うことで、
他言語から、Lua を呼ぶことに挑戦。

とは云っても、似非モジュールなので、

ctypes を持っている Python
か、
js-ctypes を持っている SpiderMonkey
で無いとダメ。

先ずは、
JavaScript(SpiderMonkey) から、LuaJIT を呼ぶことにした。

これ即ち、call_Lua51_Gen.gslSpiderMonkey に移植すること?


なんとか出来ました:
// ----- call_Lua51_Gen.js -----
var VOID = ctypes.void_t; var VoidA = ctypes.voidptr_t;
var Char = ctypes.char; var CharA = Char.ptr
var Int32 = ctypes.int32_t;
var WinABI = ctypes.winapi_abi;
var Cast = ctypes.cast; var Dbl = ctypes.double;
var lib = ctypes.open( 'lua51' );

var L_S = VoidA; var lua_Int = Int32; var SZ_t = ctypes.size_t;

var luaL_newstate = lib.declare( 'luaL_newstate', WinABI, L_S );
var luaL_openlibs = lib.declare( 'luaL_openlibs', WinABI, VOID, L_S );
var luaL_loadfilex= lib.declare( 'luaL_loadfilex', WinABI, Int32, L_S, CharA, CharA );
var lua_pcall = lib.declare( 'lua_pcall', WinABI, Int32, L_S, Int32, Int32, Int32 );
var lua_getfield = lib.declare( 'lua_getfield', WinABI, VOID, L_S, Int32, CharA );

var lua_pushinteger=lib.declare( 'lua_pushinteger',WinABI, VOID, L_S, lua_Int );
var lua_pushstring= lib.declare( 'lua_pushstring', WinABI, CharA, L_S, CharA );
var lua_isnumber = lib.declare( 'lua_isnumber', WinABI, Int32, L_S, Int32 );
var lua_isstring = lib.declare( 'lua_isstring', WinABI, Int32, L_S, Int32 );
var lua_tointeger = lib.declare( 'lua_tointeger', WinABI, lua_Int, L_S, Int32 );
var lua_tolstring = lib.declare( 'lua_tolstring', WinABI, CharA, L_S, Int32, SZ_t );

var lua_gettop = lib.declare( 'lua_gettop', WinABI, Int32, L_S );
var lua_type = lib.declare( 'lua_type', WinABI, Int32, L_S, Int32 );
var lua_settop = lib.declare( 'lua_settop', WinABI, VOID, L_S, Int32 );
var lua_close = lib.declare( 'lua_close', WinABI, VOID, L_S );

//-------------------------------
// 以下 Lua5.1 で実行したいコード
ST=' print("Lua5.1---")'+
'ffi.cdef[[ double sqrt(double); ]]'+
'print( ffi.C.sqrt(3.0) )'+
'print( math.sin(1.0) )'+
'require"lfs"; print( lfs.currentdir() )'+
't=require"time"; print(t.time())'+
'print(IT[2])'+
'DT=DblA(IT[5]); print(DT[3])'+
'IT[0]=999; SV="ok!"'
//-------------- インタフェースデータ
var DT = Dbl.array(5)( [1.1, 2.2, 3.3, 4.4, 5.5] );
var IT = Int32.array(6)( [1,2,3,4,5,0] );
IT[5] = Cast( DT.address(), Int32 );
//--------------

L = luaL_newstate();
luaL_openlibs(L);

z = luaL_loadfilex(L, 'Lua51_Gen.lua', 'bt');
z = lua_pcall(L, 0, 0, 0 ); // script を一度実行しておく

lua_getfield( L, -10002, 'Exec' ); // 呼び出す関数


lua_pushinteger( L, Cast(IT.address(),Int32) ); // 第1引数:lua_Integer

lua_pushstring( L, ST ); // 第2引数:Lua5.1 での実行文

if (lua_pcall(L, 2, 1, 0) != 0) { // 引数 2 個, 戻り値 1 個
print( 'cannot exec.' ); //// 中で、実行 ---------
}
if( lua_isstring(L, -1)) {
SV = lua_tolstring(L, -1, 0); // 戻り値
print( SV.readString() ); // 'OK'~
}
lua_settop(L, -2); // lua_pop(L,1); 戻り値を pop
lua_close(L)

print( IT[0] )
となった。
尚、このプログラムファイルのコードは 'UTF-8' です。

このプログラムと「Lua51_Gen.lua」の他に、
「lua51.dll」「lfs.dll」「time.lua」も一緒に置いておく。


出来たようダ


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


本日はここまで。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170316
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク