@@ -38,8 +38,8 @@ pub fn head(data: &[u8]) -> ffi::kvspaceHead_t {
3838 ffi:: decode_head ( data)
3939}
4040
41- /// 解析 kindexpr 内容 → (dims, base kind)。kindexpr 无前缀(ref/ptr 归 head.ref)。
42- pub fn parse_kindexpr ( kx : & str ) -> ( Vec < i32 > , String ) {
41+ /// 解析 langtype 内容 → (dims, base kind)。langtype 无前缀(ref/ptr 归 head.ref)。
42+ pub fn parse_langtype ( kx : & str ) -> ( Vec < i32 > , String ) {
4343 if kx. starts_with ( '[' ) {
4444 match kx. find ( ']' ) {
4545 Some ( end) => (
@@ -57,8 +57,8 @@ pub fn parse_kindexpr(kx: &str) -> (Vec<i32>, String) {
5757 }
5858}
5959
60- /// 读 head 的 kindexpr 内容(去 NUL)。
61- pub fn kindexpr ( data : & [ u8 ] ) -> String {
60+ /// 读 head 的 langtype 内容(去 NUL)。
61+ pub fn langtype ( data : & [ u8 ] ) -> String {
6262 if data. is_empty ( ) {
6363 return String :: new ( ) ;
6464 }
@@ -75,7 +75,7 @@ pub fn kind(data: &[u8]) -> String {
7575 if data. is_empty ( ) {
7676 return String :: new ( ) ;
7777 }
78- parse_kindexpr ( & kindexpr ( data) ) . 1
78+ parse_langtype ( & langtype ( data) ) . 1
7979}
8080
8181pub fn is_ptr ( data : & [ u8 ] ) -> bool {
@@ -86,7 +86,7 @@ pub fn array_len(data: &[u8]) -> i32 {
8686 if data. is_empty ( ) {
8787 return 0 ;
8888 }
89- let dims = parse_kindexpr ( & kindexpr ( data) ) . 0 ;
89+ let dims = parse_langtype ( & langtype ( data) ) . 0 ;
9090 if dims. is_empty ( ) {
9191 1
9292 } else {
@@ -104,7 +104,7 @@ pub fn body<'a>(data: &'a [u8], h: &ffi::kvspaceHead_t) -> &'a [u8] {
104104 & data[ off..off + len]
105105}
106106
107- /// 指针目标 key(Ptr 的 body 即目标 key 路径;head 去 * 为目标完整 kindexpr )。
107+ /// 指针目标 key(Ptr 的 body 即目标 key 路径;head 去 * 为目标完整 langtype )。
108108pub fn ptr_target ( data : & [ u8 ] ) -> String {
109109 let h = ffi:: decode_head ( data) ;
110110 String :: from_utf8_lossy ( body ( data, & h) ) . into_owned ( )
@@ -122,7 +122,7 @@ pub fn display(data: &[u8]) -> String {
122122 if data. is_empty ( ) {
123123 return "None" . to_string ( ) ;
124124 }
125- let ( _, k) = parse_kindexpr ( & kindexpr ( data) ) ;
125+ let ( _, k) = parse_langtype ( & langtype ( data) ) ;
126126 if k. is_empty ( ) {
127127 return "None" . to_string ( ) ;
128128 }
@@ -187,21 +187,23 @@ fn plain_value(k: &str, b: &[u8]) -> String {
187187 . map ( |c| char:: from_u32 ( le_u32 ( c) ) . unwrap_or ( '\u{FFFD}' ) )
188188 . collect ( ) ,
189189 "index" => format ! ( "({})" , count_names( b) ) ,
190- // kvlang 自有 kind:body = [2B nr][2B nw][sig];槽值/调用目标 nr=nw=0,取 sig 即可。
190+ // kvlang 自有 kind:body = [2B nr][2B nw][1B dynamic][ sig];槽值/调用目标 nr=nw=0,取 sig 即可。
191191 "rwir" | "rwir|rwfunc" | "rwfunc" | "defrwir" => {
192- let ( nr, nw) = if b. len ( ) >= 4 {
192+ let ( nr, nw, dynamic ) = if b. len ( ) >= 5 {
193193 (
194194 u16:: from_le_bytes ( [ b[ 0 ] , b[ 1 ] ] ) ,
195195 u16:: from_le_bytes ( [ b[ 2 ] , b[ 3 ] ] ) ,
196+ b[ 4 ] != 0 ,
196197 )
197198 } else {
198- ( 0 , 0 )
199+ ( 0 , 0 , false )
199200 } ;
200- let sig = String :: from_utf8_lossy ( & b[ 4 . min ( b. len ( ) ) ..] ) . into_owned ( ) ;
201+ let sig = String :: from_utf8_lossy ( & b[ 5 . min ( b. len ( ) ) ..] ) . into_owned ( ) ;
202+ let var = if dynamic { "..." } else { "" } ;
201203 if nr == 0 && nw == 0 {
202204 sig
203205 } else {
204- format ! ( "(nr={nr},nw={nw}) {sig}" )
206+ format ! ( "(nr={nr},nw={nw}{var} ) {sig}" )
205207 }
206208 }
207209 _ => String :: from_utf8_lossy ( b) . into_owned ( ) ,
@@ -214,34 +216,35 @@ pub fn is_char_kind(k: &str) -> bool {
214216
215217// ── kvlang 自有 kind:rwir / defrwir ────────────────────────────────
216218//
217- // body = [2B nr LE][2B nw LE][sig],array_len=1。
218- // rwir=槽值(引用串/opcode),defrwir=定义(签名)。
219+ // body = [2B nr LE][2B nw LE][1B dynamic][ sig],array_len=1。
220+ // rwir=槽值(引用串/opcode),defrwir=定义(签名)。dynamic=末读参变参(arity,非 langtype)。
219221
220- fn rwir_body ( nr : i32 , nw : i32 , sig : & str ) -> Vec < u8 > {
221- let mut raw = Vec :: with_capacity ( 4 + sig. len ( ) ) ;
222+ fn rwir_body ( nr : i32 , nw : i32 , dynamic : bool , sig : & str ) -> Vec < u8 > {
223+ let mut raw = Vec :: with_capacity ( 5 + sig. len ( ) ) ;
222224 raw. extend_from_slice ( & ( nr as u16 ) . to_le_bytes ( ) ) ;
223225 raw. extend_from_slice ( & ( nw as u16 ) . to_le_bytes ( ) ) ;
226+ raw. push ( dynamic as u8 ) ;
224227 raw. extend_from_slice ( sig. as_bytes ( ) ) ;
225228 raw
226229}
227230
228231pub fn new_rwir ( nr : i32 , nw : i32 , sig : & str ) -> Vec < u8 > {
229- ffi:: tlv_encode ( KIND_RWIR , & rwir_body ( nr, nw, sig) , 1 )
232+ ffi:: tlv_encode ( KIND_RWIR , & rwir_body ( nr, nw, false , sig) , 1 )
230233}
231234
232- /// 调用目标(看起来像函数调用的 opcode)→ kindexpr `rwir|rwfunc` 并列。
235+ /// 调用目标(看起来像函数调用的 opcode)→ langtype `rwir|rwfunc` 并列。
233236/// 静态无法判定是扩展 rwir 还是用户 rwfunc,交 runtime 查 /lib/<op> 的 XValue kind 分派。
234237pub fn new_rwir_union ( sig : & str ) -> Vec < u8 > {
235- ffi:: tlv_encode ( KIND_RWIR_OR_RWFUNC , & rwir_body ( 0 , 0 , sig) , 1 )
238+ ffi:: tlv_encode ( KIND_RWIR_OR_RWFUNC , & rwir_body ( 0 , 0 , false , sig) , 1 )
236239}
237240
238- pub fn new_defrwir ( nr : i32 , nw : i32 , sig : & str ) -> Vec < u8 > {
239- ffi:: tlv_encode ( KIND_DEF_RWIR , & rwir_body ( nr, nw, sig) , 1 )
241+ pub fn new_defrwir ( nr : i32 , nw : i32 , dynamic : bool , sig : & str ) -> Vec < u8 > {
242+ ffi:: tlv_encode ( KIND_DEF_RWIR , & rwir_body ( nr, nw, dynamic , sig) , 1 )
240243}
241244
242245// ── struct 原型(对齐 runtime kvlangBuiltinMemindex)─────────────────
243246//
244- // /lib/Name kind=struct,body="name:kindexpr \n..."(字段声明类型,供实例化类型校验)
247+ // /lib/Name kind=struct,body="name:langtype \n..."(字段声明类型,供实例化类型校验)
245248// /lib/Name· kind=index,body=[4B count LE][name\n...](字段名唯一权威)
246249
247250pub fn new_struct ( fields : & [ ( String , String ) ] ) -> Vec < u8 > {
@@ -261,12 +264,19 @@ pub fn new_memindex(names: &[String]) -> Vec<u8> {
261264
262265// ── kvlang 自有 kind:rwfunc ────────────────────────────────────────
263266//
264- // body = [2B nr LE][2B nw LE][param_types 以 \n 连接],array_len=num_insts。
265-
266- pub fn new_rwfunc ( num_insts : i32 , nr : i32 , nw : i32 , param_types : & [ String ] ) -> Vec < u8 > {
267- let mut raw = Vec :: with_capacity ( 4 + param_types. iter ( ) . map ( |s| s. len ( ) ) . sum :: < usize > ( ) ) ;
267+ // body = [2B nr LE][2B nw LE][1B dynamic][param_types 以 \n 连接],array_len=num_insts。
268+
269+ pub fn new_rwfunc (
270+ num_insts : i32 ,
271+ nr : i32 ,
272+ nw : i32 ,
273+ dynamic : bool ,
274+ param_types : & [ String ] ,
275+ ) -> Vec < u8 > {
276+ let mut raw = Vec :: with_capacity ( 5 + param_types. iter ( ) . map ( |s| s. len ( ) ) . sum :: < usize > ( ) ) ;
268277 raw. extend_from_slice ( & ( nr as u16 ) . to_le_bytes ( ) ) ;
269278 raw. extend_from_slice ( & ( nw as u16 ) . to_le_bytes ( ) ) ;
279+ raw. push ( dynamic as u8 ) ;
270280 raw. extend_from_slice ( param_types. join ( "\n " ) . as_bytes ( ) ) ;
271281 ffi:: tlv_encode ( KIND_RWFUNC , & raw , num_insts)
272282}
@@ -287,10 +297,10 @@ pub fn rwfunc_num_writes(body: &[u8]) -> i32 {
287297}
288298
289299pub fn rwfunc_param_types ( body : & [ u8 ] ) -> Vec < String > {
290- if body. len ( ) <= 4 {
300+ if body. len ( ) <= 5 {
291301 return Vec :: new ( ) ;
292302 }
293- String :: from_utf8_lossy ( & body[ 4 ..] )
303+ String :: from_utf8_lossy ( & body[ 5 ..] )
294304 . split ( '\n' )
295305 . map ( |s| s. to_string ( ) )
296306 . collect ( )
0 commit comments