16
16
WASM_ANYREF .value : 'externref' ,
17
17
}
18
18
19
+
19
20
@ctypes .CFUNCTYPE (None , c_void_p )
20
21
def _externref_finalizer (extern_id : int ) -> None :
21
22
Val ._id_to_ref_count [extern_id ] -= 1
@@ -35,35 +36,41 @@ def _intern(obj: typing.Any) -> c_void_p:
35
36
def _unintern (val : int ) -> typing .Any :
36
37
return Val ._id_to_extern .get (val )
37
38
39
+
38
40
def get_valtype_attr (ty : ValType ) -> str :
39
41
return val_id2attr [wasm_valtype_kind (ty ._ptr )]
40
42
43
+
41
44
def val_getter (store_id : int , val_raw : wasmtime_val_raw_t , attr : str ) -> typing .Union [int , float , "wasmtime.Func" , typing .Any ]:
42
45
val = getattr (val_raw , attr )
43
-
44
- if attr == 'externref' :
46
+
47
+ if attr == 'externref' :
45
48
ptr = ctypes .POINTER (wasmtime_externref_t )
46
- if not val : return None
49
+ if not val :
50
+ return None
47
51
ffi = ptr .from_address (val )
48
- if not ffi : return None
52
+ if not ffi :
53
+ return None
49
54
extern_id = wasmtime_externref_data (ffi )
50
55
return _unintern (extern_id )
51
- elif attr == 'funcref' :
52
- if val == 0 : return None
56
+ elif attr == 'funcref' :
57
+ if val == 0 :
58
+ return None
53
59
f = wasmtime_func_t ()
54
60
f .store_id = store_id
55
61
f .index = val
56
62
return wasmtime .Func ._from_raw (f )
57
63
return val
58
64
65
+
59
66
def val_setter (dst : wasmtime_val_raw_t , attr : str , val : "IntoVal" ):
60
- if attr == 'externref' :
61
- if isinstance (val , Val ) and val ._raw .kind == WASMTIME_EXTERNREF .value :
67
+ if attr == 'externref' :
68
+ if isinstance (val , Val ) and val ._raw .kind == WASMTIME_EXTERNREF .value :
62
69
casted = ctypes .addressof (val ._raw .of .externref )
63
70
else :
64
71
casted = ctypes .addressof (Val .externref (val )._raw .of .externref )
65
- elif attr == 'funcref' :
66
- if isinstance (val , Val ) and val ._raw .kind == WASMTIME_FUNCREF .value :
72
+ elif attr == 'funcref' :
73
+ if isinstance (val , Val ) and val ._raw .kind == WASMTIME_FUNCREF .value :
67
74
casted = val ._raw .of .funcref .index
68
75
elif isinstance (val , wasmtime .Func ):
69
76
# TODO: validate same val._func.store_id
0 commit comments