変数名からその変数のクローンを作る・改

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