変数名からその変数のクローンを作る・改
HSPEXINFOにHspFunc_varnameとHspFunc_seekvarというのがあったのでこれを使ってみました。
変数IDから変数名を得たり、変数名から変数IDを探したりする処理をやってくれます。
変数名からその変数のクローンを作る - fujidigの雑記ではそういう処理を自前でやっていました。
#module #deffunc init_getvn if inited : return inited = 1 mref hspctx, 68 dupptr hspexinfo, lpeek( hspctx, 876 ), 196 // hspctx.exinfo2 / sizeof HSPEXINFO HspFunc_varname = lpeek( hspexinfo, 188 ) // hspexinfo.HspFunc_varname HspFunc_seekvar = lpeek( hspexinfo, 192 ) // hspexinfo.HspFunc_seekvar return #defcfunc getvarname var v init_getvn dupptr vptr, hspctx.207, 4 // prmstack pval_ptr = vptr pval_ptr_first = hspctx.11 // mem_var id = ( pval_ptr - pval_ptr_first ) / 48 // sizeof PVal == 48 return strf( "%s", callfunc( id, HspFunc_varname, 1 ) ) #deffunc getfromvarname var v, str _name init_getvn name = _name name_ptr = varptr( name ) id = callfunc( name_ptr, HspFunc_seekvar, 1 ) if id < 0 : return 1 pval_ptr = hspctx.11 + id * 48 // PValポインタからクローンを作る dupptr pval, pval_ptr, 48 flag = pval.0 & 0xffff hspvarproc_ptr = callfunc( flag, hspctx.37, 1 ) // exinfo.HspFunc_getproc // sizeof( HspVarProc ) == 140 dupptr hspvarproc, hspvarproc_ptr, 140 pval.10 = 0 // pval.offset ptr = callfunc( pval_ptr, hspvarproc.7, 1 ) // hspvarproc.GetProc size = 0 args = pval_ptr, ptr, varptr( size ) ptr2 = callfunc( args, hspvarproc.16, 3 ) // hspvarproc.GetBlockSize dupptr v, ptr, size, flag return 0 #global // 変数から変数名を得る hoge = "hello" mes getvarname( hoge ) // 変数名からその変数のクローンを作成する getfromvarname v, "hoge" mes v