Skip to main content

vm/
rt.rs

1use compiler::{Capture, Compiler, Symbol};
2use dynamic::{Dynamic, Type};
3use parser::{BinaryOp, Expr, ExprKind, PatternKind, Span, Stmt, StmtKind, UnaryOp};
4use std::collections::{BTreeMap, HashMap, VecDeque};
5
6use crate::context::LocalVar;
7
8use super::{FnInfo, FnVariant, PTR_TYPE, context::BuildContext, ptr_type};
9use cranelift::prelude::*;
10use cranelift_jit::{JITBuilder, JITModule};
11use cranelift_module::{DataDescription, DataId, FuncId, Module};
12
13use anyhow::{Result, anyhow};
14use smol_str::SmolStr;
15use std::sync::{Arc, Mutex, RwLock, Weak};
16
17pub struct JITRunTime {
18    pub compiler: Compiler,
19    pub fns: BTreeMap<u32, FnVariant>,
20    pub sigs: Vec<(Vec<Type>, Signature, Type)>,
21    pub native_symbols: Arc<RwLock<HashMap<String, usize>>>,
22    pub(crate) owner: Weak<Mutex<JITRunTime>>,
23    pub(crate) pending_fns: VecDeque<PendingFn>,
24    pub(crate) compile_depth: usize,
25    #[cfg(feature = "ir-disassembly")]
26    pub ir_disassembly: BTreeMap<SmolStr, String>,
27    pub module: JITModule,
28    pub consts: Vec<Option<DataId>>,
29}
30
31pub(crate) struct PendingFn {
32    pub name: SmolStr,
33    pub symbol_id: u32,
34    pub fn_id: FuncId,
35    pub arg_tys: Vec<Type>,
36    pub ret_ty: Type,
37    pub body: Stmt,
38}
39
40impl JITRunTime {
41    fn expr(kind: ExprKind) -> Expr {
42        Expr::new(kind, Span::default())
43    }
44
45    fn stmt(kind: StmtKind) -> Stmt {
46        Stmt::new(kind, Span::default())
47    }
48
49    pub fn load(&mut self, code: Vec<u8>, arg_name: SmolStr) -> Result<(i64, Type)> {
50        let stmts = Compiler::parse_code(code)?;
51        self.compiler.clear();
52        self.compiler.symbols.add_module("__console".into());
53        let mut cap = Capture::default();
54        let body = Self::stmt(StmtKind::Block(self.compiler.compile_fn(&[arg_name], &mut vec![Type::Any], Self::stmt(StmtKind::Block(stmts)), &mut cap)?));
55        self.compiler.tys.push(Type::Any);
56        let ret_ty = self.compiler.infer_stmt(&body)?;
57        self.compiler.clear();
58        let fn_id = self.compile_fn(None, &[Type::Any], ret_ty.clone(), &body)?;
59        self.compiler.clear();
60        self.compiler.symbols.pop_module();
61        self.module.finalize_definitions()?;
62        Ok((self.module.get_finalized_function(fn_id) as i64, ret_ty))
63    }
64
65    pub fn import_code(&mut self, name: &str, code: Vec<u8>) -> Result<()> {
66        log::info!("import {}", name);
67        let _ = self.compiler.import_code(name, code)?;
68        Ok(())
69    }
70
71    #[cfg(feature = "ir-disassembly")]
72    pub fn disassemble_ir(&mut self, name: &str) -> Result<String> {
73        if let Some(ir) = self.ir_disassembly.get(name) {
74            return Ok(ir.clone());
75        }
76        let id = self.get_id(name)?;
77        let (_, symbol) = self.compiler.symbols.get_symbol(id)?;
78        if let Symbol::Fn { ty, .. } = symbol
79            && let Type::Fn { tys, .. } = ty
80            && tys.is_empty()
81        {
82            let _ = self.gen_fn(None, id, &[])?;
83        }
84        self.ir_disassembly.get(name).cloned().ok_or_else(|| anyhow!("未找到函数 {} 的 Cranelift IR;如果它需要参数,请先触发对应实例化", name))
85    }
86
87    pub fn get_fn_ptr(&mut self, name: &str, arg_tys: &[Type]) -> Result<(*const u8, Type)> {
88        let main_id = self.get_id(name)?;
89        let fn_info = self.gen_fn(None, main_id, arg_tys)?;
90        Ok((self.module.get_finalized_function(fn_info.get_id()?), fn_info.get_type()?))
91    }
92
93    pub fn get_const_value(&mut self, ctx: &mut BuildContext, idx: usize) -> Result<(Value, Type)> {
94        if self.consts.len() < idx + 1 {
95            self.consts.resize(idx + 1, None);
96        }
97        let id = if let Some(id) = self.consts.get(idx).cloned().unwrap_or(None) {
98            id
99        } else {
100            let id = self.module.declare_anonymous_data(true, false)?;
101            let mut desc = DataDescription::new();
102            let c = Box::new(self.compiler.consts[idx].deep_clone()); //深度拷贝 避免常量被污染
103            let ptr = Box::into_raw(c);
104            desc.define((ptr as i64).to_le_bytes().into());
105            self.module.define_data(id, &desc)?;
106            self.consts[idx] = Some(id);
107            id
108        };
109        let c = self.module.declare_data_in_func(id, &mut ctx.builder.func);
110        let addr = ctx.builder.ins().global_value(ptr_type(), c);
111        let value = ctx.builder.ins().load(ptr_type(), MemFlags::new(), addr, 0); //需要生成副本 避免被释放
112        Ok((self.call(ctx, self.get_method(&Type::Any, "clone")?, vec![value])?.0, Type::Any))
113    }
114
115    fn get_null_value(&mut self, ctx: &mut BuildContext) -> Result<(Value, Type)> {
116        let const_idx = self.compiler.get_const(Dynamic::Null);
117        self.get_const_value(ctx, const_idx)
118    }
119
120    pub fn get_dynamic(&self, expr: &Expr) -> Option<Dynamic> {
121        if let ExprKind::Const(idx) = &expr.kind { self.compiler.consts.get(*idx).cloned() } else { None }
122    }
123
124    pub fn get_method(&self, ty: &Type, name: &str) -> Result<FnInfo> {
125        self.compiler.get_field(ty, name).and_then(|(_, ty)| if let Type::Symbol { id, params: _ } = ty { self.get_fn(id, &[]) } else { Err(anyhow!("不是成员函数")) })
126    }
127
128    pub fn get_id(&self, name: &str) -> Result<u32> {
129        self.compiler.symbols.get_id(name)
130    }
131
132    pub fn get_type(&mut self, name: &str, arg_tys: &[Type]) -> Result<Type> {
133        let id = self.get_id(name)?;
134        if self.compiler.symbols.symbols.get(name).map(|s| s.is_fn()).unwrap_or(false) {
135            return self.compiler.infer_fn(id, arg_tys);
136        }
137        self.compiler.symbols.get_type(&Type::Symbol { id, params: Vec::new() })
138    }
139
140    pub fn new<F: FnMut(&mut JITBuilder)>(mut f: F) -> Self {
141        let native_symbols = Arc::new(RwLock::new(HashMap::<String, usize>::new()));
142        let lookup_symbols = native_symbols.clone();
143        let mut builder = JITBuilder::new(cranelift_module::default_libcall_names()).unwrap();
144        builder.symbol_lookup_fn(Box::new(move |name| lookup_symbols.read().unwrap().get(name).copied().map(|ptr| ptr as *const u8)));
145        f(&mut builder);
146        let module = JITModule::new(builder);
147        PTR_TYPE.get_or_init(|| module.isa().pointer_type());
148        let fns = BTreeMap::<u32, FnVariant>::new();
149        Self {
150            compiler: Compiler::new(),
151            fns,
152            sigs: Vec::new(),
153            native_symbols,
154            owner: Weak::new(),
155            pending_fns: VecDeque::new(),
156            compile_depth: 0,
157            #[cfg(feature = "ir-disassembly")]
158            ir_disassembly: BTreeMap::new(),
159            module,
160            consts: Vec::new(),
161        }
162    }
163
164    pub(crate) fn set_owner(&mut self, owner: Weak<Mutex<JITRunTime>>) {
165        self.owner = owner;
166    }
167
168    pub(crate) fn owner_context_ptr(&self) -> usize {
169        &self.owner as *const Weak<Mutex<JITRunTime>> as usize
170    }
171
172    fn unary(ctx: &mut BuildContext, left: (Value, Type), op: UnaryOp) -> Result<(Value, Type)> {
173        match op {
174            UnaryOp::Neg => {
175                if left.1.is_int() || left.1.is_uint() {
176                    if left.1.width() == 8 {
177                        let zero = ctx.builder.ins().iconst(types::I64, 0);
178                        return Ok((ctx.builder.ins().isub(zero, left.0), Type::I64));
179                    } else if left.1.width() == 4 {
180                        let zero = ctx.builder.ins().iconst(types::I32, 0);
181                        return Ok((ctx.builder.ins().isub(zero, left.0), Type::I32));
182                    }
183                } else if left.1.is_float() {
184                    return Ok((ctx.builder.ins().fneg(left.0), left.1));
185                }
186            }
187            UnaryOp::Not => {
188                if left.1.is_any() {
189                    return Err(anyhow!("defer any-bool not handling"));
190                }
191                let zero = ctx.builder.ins().iconst(types::I8, 0);
192                let one = ctx.builder.ins().iconst(types::I8, 1);
193                let is_zero = ctx.builder.ins().icmp_imm(IntCC::Equal, left.0, 0);
194                return Ok((ctx.builder.ins().select(is_zero, one, zero), Type::Bool));
195            }
196            _ => {}
197        }
198        Err(anyhow!("未实现 {:?} {:?}", left, op))
199    }
200
201    pub(crate) fn call(&mut self, ctx: &mut BuildContext, fn_info: FnInfo, args: Vec<Value>) -> Result<(Value, Type)> {
202        match fn_info {
203            FnInfo::Call { fn_id, arg_tys: _, caps: _, ret, context } => {
204                let fn_ref = self.get_fn_ref(ctx, fn_id);
205                let args = self.add_context_arg(ctx, context, args);
206                let call_inst = ctx.builder.ins().call(fn_ref, &args);
207                if !ret.is_void() { Ok((ctx.builder.inst_results(call_inst)[0], ret)) } else { Err(anyhow!("没有返回值")) }
208            }
209            FnInfo::Inline { fn_ptr, arg_tys: _ } => fn_ptr(Some(ctx), args).map(|(v, t)| (v.unwrap(), t)),
210        }
211    }
212
213    fn call_for_side_effect(&mut self, ctx: &mut BuildContext, fn_info: FnInfo, args: Vec<Value>) -> Result<()> {
214        match fn_info {
215            FnInfo::Call { fn_id, arg_tys: _, caps: _, ret: _, context } => {
216                let fn_ref = self.get_fn_ref(ctx, fn_id);
217                let args = self.add_context_arg(ctx, context, args);
218                ctx.builder.ins().call(fn_ref, &args);
219                Ok(())
220            }
221            FnInfo::Inline { fn_ptr, arg_tys: _ } => fn_ptr(Some(ctx), args).map(|_| ()),
222        }
223    }
224
225    fn add_context_arg(&mut self, ctx: &mut BuildContext, context: Option<usize>, mut args: Vec<Value>) -> Vec<Value> {
226        if let Some(context) = context {
227            let context = ctx.builder.ins().iconst(ptr_type(), context as i64);
228            args.insert(0, context);
229        }
230        args
231    }
232
233    pub(crate) fn short_circuit_logic(&mut self, ctx: &mut BuildContext, left: (Value, Type), op: BinaryOp, right: &Expr) -> Result<(Value, Type)> {
234        let is_any = left.1.is_any();
235        if is_any {
236            let left_cond = self.bool_value(ctx, left.clone())?;
237            let rhs_block = ctx.builder.create_block();
238            let short_block = ctx.builder.create_block();
239            let end_block = ctx.builder.create_block();
240            ctx.builder.append_block_param(end_block, ptr_type());
241
242            match op {
243                BinaryOp::And => {
244                    ctx.builder.ins().brif(left_cond, rhs_block, &[], short_block, &[]);
245                }
246                BinaryOp::Or => {
247                    ctx.builder.ins().brif(left_cond, short_block, &[], rhs_block, &[]);
248                }
249                _ => unreachable!(),
250            }
251
252            ctx.builder.switch_to_block(rhs_block);
253            let right = self.eval(ctx, right)?.get(ctx).unwrap();
254            let right_any = self.convert(ctx, right, Type::Any)?;
255            ctx.builder.ins().jump(end_block, &[cranelift::codegen::ir::BlockArg::Value(right_any)]);
256            ctx.builder.seal_block(rhs_block);
257
258            ctx.builder.switch_to_block(short_block);
259            ctx.builder.ins().jump(end_block, &[cranelift::codegen::ir::BlockArg::Value(left.0)]);
260            ctx.builder.seal_block(short_block);
261
262            ctx.builder.switch_to_block(end_block);
263            let result = ctx.builder.block_params(end_block)[0];
264            Ok((result, Type::Any))
265        } else {
266            let left = self.bool_value(ctx, left)?;
267            let rhs_block = ctx.builder.create_block();
268            let short_block = ctx.builder.create_block();
269            let end_block = ctx.builder.create_block();
270            ctx.builder.append_block_param(end_block, types::I8);
271
272            match op {
273                BinaryOp::And => {
274                    ctx.builder.ins().brif(left, rhs_block, &[], short_block, &[]);
275                }
276                BinaryOp::Or => {
277                    ctx.builder.ins().brif(left, short_block, &[], rhs_block, &[]);
278                }
279                _ => unreachable!(),
280            }
281
282            ctx.builder.switch_to_block(rhs_block);
283            let right = self.eval(ctx, right)?.get(ctx).unwrap();
284            let right = self.bool_value(ctx, right)?;
285            ctx.builder.ins().jump(end_block, &[cranelift::codegen::ir::BlockArg::Value(right)]);
286            ctx.builder.seal_block(rhs_block);
287
288            ctx.builder.switch_to_block(short_block);
289            let short_value = match op {
290                BinaryOp::And => ctx.builder.ins().iconst(types::I8, 0),
291                BinaryOp::Or => ctx.builder.ins().iconst(types::I8, 1),
292                _ => unreachable!(),
293            };
294            ctx.builder.ins().jump(end_block, &[cranelift::codegen::ir::BlockArg::Value(short_value)]);
295            ctx.builder.seal_block(short_block);
296
297            ctx.builder.switch_to_block(end_block);
298            let result = ctx.builder.block_params(end_block)[0];
299            Ok((result, Type::Bool))
300        }
301    }
302
303    fn struct_alloc(&mut self, ctx: &mut BuildContext, ty: &Type) -> Result<Value> {
304        let size = ctx.builder.ins().iconst(types::I64, ty.width() as i64);
305        let alloc_id = self.get_id("__struct_alloc")?;
306        let alloc = self.get_fn(alloc_id, &[Type::I64])?;
307        self.call(ctx, alloc, vec![size]).map(|(v, _)| v)
308    }
309
310    fn store_struct_field(&mut self, ctx: &mut BuildContext, base: Value, idx: usize, field_ty: &Type, value: (Value, Type), struct_ty: &Type) -> Result<()> {
311        let offset = struct_ty.field_offset(idx).ok_or_else(|| anyhow!("结构字段索引越界 {}", idx))?;
312        let value = self.convert(ctx, value, field_ty.clone())?;
313        if field_ty.is_struct() || field_ty.is_array() {
314            let field_addr = ctx.builder.ins().iadd_imm(base, offset as i64);
315            self.copy_vec_element(ctx, field_addr, value, field_ty);
316        } else {
317            ctx.builder.ins().store(MemFlags::trusted(), value, base, offset as i32);
318        }
319        Ok(())
320    }
321
322    fn load_struct_field(&mut self, ctx: &mut BuildContext, base: Value, idx: usize, struct_ty: &Type) -> Result<(Value, Type)> {
323        if let Type::Struct { params: _, fields } = struct_ty {
324            let field_ty = fields.get(idx).map(|(_, ty)| ty).ok_or_else(|| anyhow!("结构字段索引越界 {}", idx))?;
325            let offset = struct_ty.field_offset(idx).ok_or_else(|| anyhow!("结构字段索引越界 {}", idx))?;
326            if field_ty.is_struct() || field_ty.is_array() {
327                return Ok((ctx.builder.ins().iadd_imm(base, offset as i64), field_ty.clone()));
328            }
329            let val = ctx.builder.ins().load(crate::get_type(field_ty)?, MemFlags::trusted(), base, offset as i32);
330            Ok((val, field_ty.clone()))
331        } else {
332            Err(anyhow!("不是结构体 {:?}", struct_ty))
333        }
334    }
335
336    fn struct_field_index(&self, struct_ty: &Type, right: &Expr) -> Result<usize> {
337        let value = if let ExprKind::Const(idx) = right.kind { self.compiler.consts.get(idx).cloned().ok_or_else(|| anyhow!("missing const {}", idx))? } else { right.clone().value()? };
338        if let Some(idx) = value.as_int() {
339            return usize::try_from(idx).map_err(|_| anyhow!("结构字段索引越界 {}", idx));
340        }
341        if value.is_str() {
342            return self.compiler.get_field(struct_ty, value.as_str()).map(|(idx, _)| idx);
343        }
344        Err(anyhow!("非立即数结构字段索引 {:?}", right))
345    }
346
347    fn vec_elem_ty(ty: &Type) -> Option<Type> {
348        if let Type::Vec(elem, 0) = ty { Some((**elem).clone()) } else { None }
349    }
350
351    fn array_elem_ty(ty: &Type) -> Option<Type> {
352        if let Type::Array(elem, _) = ty { Some((**elem).clone()) } else { None }
353    }
354
355    fn vec_index_addr(&mut self, ctx: &mut BuildContext, base: Value, idx: (Value, Type), elem_ty: &Type) -> Result<Value> {
356        let idx = self.convert(ctx, idx, Type::I64)?;
357        let width = ctx.builder.ins().iconst(types::I64, elem_ty.storage_width() as i64);
358        let offset = ctx.builder.ins().imul(idx, width);
359        Ok(ctx.builder.ins().iadd(base, offset))
360    }
361
362    fn array_index_addr(&mut self, ctx: &mut BuildContext, base: Value, idx: (Value, Type), elem_ty: &Type) -> Result<Value> {
363        self.vec_index_addr(ctx, base, idx, elem_ty)
364    }
365
366    fn load_array_index(&mut self, ctx: &mut BuildContext, base: Value, idx: (Value, Type), elem_ty: &Type) -> Result<(Value, Type)> {
367        let addr = self.array_index_addr(ctx, base, idx, elem_ty)?;
368        if elem_ty.is_struct() || elem_ty.is_array() {
369            Ok((addr, elem_ty.clone()))
370        } else {
371            let val = ctx.builder.ins().load(crate::get_type(elem_ty)?, MemFlags::trusted(), addr, 0);
372            Ok((val, elem_ty.clone()))
373        }
374    }
375
376    fn store_array_index(&mut self, ctx: &mut BuildContext, base: Value, idx: (Value, Type), elem_ty: &Type, value: (Value, Type)) -> Result<()> {
377        let addr = self.array_index_addr(ctx, base, idx, elem_ty)?;
378        let value = self.convert(ctx, value, elem_ty.clone())?;
379        if elem_ty.is_struct() || elem_ty.is_array() {
380            self.copy_vec_element(ctx, addr, value, elem_ty);
381        } else {
382            ctx.builder.ins().store(MemFlags::trusted(), value, addr, 0);
383        }
384        Ok(())
385    }
386
387    fn init_repeat_array(&mut self, ctx: &mut BuildContext, value: (Value, Type), len: u32) -> Result<(Value, Type)> {
388        let elem_ty = value.1.clone();
389        let array_ty = Type::Array(std::rc::Rc::new(elem_ty.clone()), len);
390        let base = self.struct_alloc(ctx, &array_ty)?;
391        for idx in 0..len {
392            let idx = (ctx.builder.ins().iconst(types::I64, idx as i64), Type::I64);
393            self.store_array_index(ctx, base, idx, &elem_ty, value.clone())?;
394        }
395        Ok((base, array_ty))
396    }
397
398    fn init_array_from_items(&mut self, ctx: &mut BuildContext, items: &[Expr], ty: &Type) -> Result<Value> {
399        let Type::Array(elem_ty, len) = ty else {
400            return Err(anyhow!("not an array type: {:?}", ty));
401        };
402        if items.len() != *len as usize {
403            return Err(anyhow!("array literal length {} does not match {}", items.len(), len));
404        }
405        let base = self.struct_alloc(ctx, ty)?;
406        for (idx, item) in items.iter().enumerate() {
407            let value = self.eval(ctx, item)?.get(ctx).ok_or(anyhow!("array item has no value"))?;
408            let idx = (ctx.builder.ins().iconst(types::I64, idx as i64), Type::I64);
409            self.store_array_index(ctx, base, idx, elem_ty, value)?;
410        }
411        Ok(base)
412    }
413
414    fn load_vec_index(&mut self, ctx: &mut BuildContext, base: Value, idx: (Value, Type), elem_ty: &Type) -> Result<(Value, Type)> {
415        let addr = self.vec_index_addr(ctx, base, idx, elem_ty)?;
416        if elem_ty.is_struct() {
417            Ok((addr, elem_ty.clone()))
418        } else {
419            let val = ctx.builder.ins().load(crate::get_type(elem_ty)?, MemFlags::trusted(), addr, 0);
420            Ok((val, elem_ty.clone()))
421        }
422    }
423
424    fn copy_vec_element(&mut self, ctx: &mut BuildContext, dst: Value, src: Value, elem_ty: &Type) {
425        let mut offset = 0u32;
426        let width = elem_ty.storage_width();
427        while offset < width {
428            let remaining = width - offset;
429            let (ty, size) = if remaining >= 8 {
430                (types::I64, 8)
431            } else if remaining >= 4 {
432                (types::I32, 4)
433            } else if remaining >= 2 {
434                (types::I16, 2)
435            } else {
436                (types::I8, 1)
437            };
438            let value = ctx.builder.ins().load(ty, MemFlags::trusted(), src, offset as i32);
439            ctx.builder.ins().store(MemFlags::trusted(), value, dst, offset as i32);
440            offset += size;
441        }
442    }
443
444    fn store_vec_index(&mut self, ctx: &mut BuildContext, base: Value, idx: (Value, Type), elem_ty: &Type, value: (Value, Type)) -> Result<()> {
445        let addr = self.vec_index_addr(ctx, base, idx, elem_ty)?;
446        let value = self.convert(ctx, value, elem_ty.clone())?;
447        if elem_ty.is_struct() {
448            self.copy_vec_element(ctx, addr, value, elem_ty);
449        } else {
450            ctx.builder.ins().store(MemFlags::trusted(), value, addr, 0);
451        }
452        Ok(())
453    }
454
455    fn swap_vec_index(&mut self, ctx: &mut BuildContext, base: Value, left: (Value, Type), right: (Value, Type), elem_ty: &Type) -> Result<()> {
456        let left_addr = self.vec_index_addr(ctx, base, left, elem_ty)?;
457        let right_addr = self.vec_index_addr(ctx, base, right, elem_ty)?;
458        let mut offset = 0u32;
459        let width = elem_ty.storage_width();
460        while offset < width {
461            let remaining = width - offset;
462            let (ty, size) = if remaining >= 8 {
463                (types::I64, 8)
464            } else if remaining >= 4 {
465                (types::I32, 4)
466            } else if remaining >= 2 {
467                (types::I16, 2)
468            } else {
469                (types::I8, 1)
470            };
471            let left_value = ctx.builder.ins().load(ty, MemFlags::trusted(), left_addr, offset as i32);
472            let right_value = ctx.builder.ins().load(ty, MemFlags::trusted(), right_addr, offset as i32);
473            ctx.builder.ins().store(MemFlags::trusted(), left_value, right_addr, offset as i32);
474            ctx.builder.ins().store(MemFlags::trusted(), right_value, left_addr, offset as i32);
475            offset += size;
476        }
477        Ok(())
478    }
479
480    fn init_struct_from_dynamic(&mut self, ctx: &mut BuildContext, value: (Value, Type), ty: &Type) -> Result<Value> {
481        let Type::Struct { params: _, fields } = ty else {
482            return Err(anyhow!("不是结构体 {:?}", ty));
483        };
484        let base = self.struct_alloc(ctx, ty)?;
485        for (idx, (_, field_ty)) in fields.iter().enumerate() {
486            let idx_val = ctx.builder.ins().iconst(types::I64, idx as i64);
487            let item = self.call(ctx, self.get_method(&Type::Any, "get_idx")?, vec![value.0, idx_val])?;
488            self.store_struct_field(ctx, base, idx, field_ty, item, ty)?;
489        }
490        Ok(base)
491    }
492
493    fn init_struct_from_items(&mut self, ctx: &mut BuildContext, items: &[Expr], ty: &Type) -> Result<Value> {
494        let Type::Struct { params: _, fields } = ty else {
495            return Err(anyhow!("not a struct type: {:?}", ty));
496        };
497        let base = self.struct_alloc(ctx, ty)?;
498        for (idx, item) in items.iter().enumerate() {
499            let Some((_, field_ty)) = fields.get(idx) else {
500                break;
501            };
502            let value = self.eval(ctx, item)?.get(ctx).ok_or(anyhow!("struct field has no value"))?;
503            self.store_struct_field(ctx, base, idx, field_ty, value, ty)?;
504        }
505        Ok(base)
506    }
507
508    fn expr_assigned_var(expr: &Expr) -> Option<(u32, Type)> {
509        if let ExprKind::Binary { left, op, right } = &expr.kind
510            && op.is_assign()
511            && let ExprKind::Var(idx) = left.kind
512        {
513            return Some((idx, right.get_type()));
514        }
515        None
516    }
517
518    fn declare_assigned_vars(&mut self, ctx: &mut BuildContext, stmt: &Stmt) -> Result<()> {
519        match &stmt.kind {
520            StmtKind::Expr(expr, _) => {
521                if let Some((idx, ty)) = Self::expr_assigned_var(expr) {
522                    match ctx.get_var(idx).ok() {
523                        Some(LocalVar::Variable { .. }) | Some(LocalVar::Closure { .. }) => {}
524                        Some(LocalVar::Value { val, ty }) => {
525                            ctx.set_var(idx, LocalVar::Value { val, ty })?;
526                        }
527                        Some(LocalVar::None) | None => {
528                            let init = self.zero_value(ctx, &ty)?;
529                            ctx.set_var(idx, init.into())?;
530                        }
531                    }
532                }
533            }
534            StmtKind::Block(stmts) => {
535                for stmt in stmts {
536                    self.declare_assigned_vars(ctx, stmt)?;
537                }
538            }
539            StmtKind::If { then_body, else_body, .. } => {
540                self.declare_assigned_vars(ctx, then_body)?;
541                if let Some(else_body) = else_body {
542                    self.declare_assigned_vars(ctx, else_body)?;
543                }
544            }
545            StmtKind::While { body, .. } | StmtKind::Loop(body) => {
546                self.declare_assigned_vars(ctx, body)?;
547            }
548            StmtKind::For { body, .. } => {
549                self.declare_assigned_vars(ctx, body)?;
550            }
551            _ => {}
552        }
553        Ok(())
554    }
555
556    fn zero_value(&mut self, ctx: &mut BuildContext, ty: &Type) -> Result<(Value, Type)> {
557        if ty.is_struct() || ty.is_array() {
558            Ok((self.struct_alloc(ctx, ty)?, ty.clone()))
559        } else if ty.is_f32() {
560            Ok((ctx.builder.ins().f32const(0.0), ty.clone()))
561        } else if ty.is_f64() {
562            Ok((ctx.builder.ins().f64const(0.0), ty.clone()))
563        } else {
564            Ok((ctx.builder.ins().iconst(crate::get_type(ty)?, 0), ty.clone()))
565        }
566    }
567
568    fn assign(&mut self, ctx: &mut BuildContext, left: &Expr, value: LocalVar) -> Result<(Value, Type)> {
569        if let ExprKind::Var(idx) = &left.kind {
570            if value.is_closure() {
571                ctx.set_var(*idx, value)?;
572                return self.get_null_value(ctx);
573            }
574            let value_ty = value.get_ty();
575            if let Some(ty) = ctx.get_var_ty(*idx) {
576                if ty.is_struct() || ty.is_array() {
577                    let dst = ctx.get_var(*idx)?.get(ctx).ok_or(anyhow!("aggregate variable has no value"))?.0;
578                    let src = value.get(ctx).ok_or(anyhow!("aggregate assignment has no value"))?;
579                    let src = self.convert(ctx, src, ty.clone())?;
580                    self.copy_vec_element(ctx, dst, src, &ty);
581                } else if value_ty != ty {
582                    if let Some(vt) = value.get(ctx) {
583                        let val = self.convert(ctx, vt, ty.clone())?;
584                        ctx.set_var(*idx, LocalVar::Value { val, ty })?;
585                    } else if ty.is_any() {
586                        let const_idx = self.compiler.get_const(Dynamic::Null);
587                        let (val, ty) = self.get_const_value(ctx, const_idx)?;
588                        ctx.set_var(*idx, LocalVar::Value { val, ty })?;
589                    } else {
590                        ctx.set_var(*idx, LocalVar::None)?;
591                    }
592                } else {
593                    ctx.set_var(*idx, value)?;
594                }
595            } else if value_ty.is_struct() || value_ty.is_array() {
596                let src = value.get(ctx).ok_or(anyhow!("aggregate initializer has no value"))?;
597                let dst = self.struct_alloc(ctx, &value_ty)?;
598                let src = self.convert(ctx, src, value_ty.clone())?;
599                self.copy_vec_element(ctx, dst, src, &value_ty);
600                ctx.set_var(*idx, LocalVar::Value { val: dst, ty: value_ty })?;
601            } else {
602                ctx.set_var(*idx, value)?;
603            }
604            let assigned = ctx.get_var(*idx)?;
605            if assigned.is_closure() {
606                return self.get_null_value(ctx);
607            }
608            let val = assigned.get(ctx).ok_or(anyhow!("assigned variable has no value"))?;
609            return Ok(val);
610        } else if left.is_idx() {
611            let value = value.get(ctx).unwrap();
612            let (left, _, right) = left.clone().binary().unwrap();
613            let left = self.eval(ctx, &left)?.get(ctx).ok_or(anyhow!("未知局部变量 {:?}", left))?;
614            if let Type::Struct { params: _, fields } = &left.1 {
615                let idx = self.struct_field_index(&left.1, &right)?;
616                let field_ty = fields.get(idx).map(|(_, ty)| ty.clone()).ok_or_else(|| anyhow!("结构字段索引越界 {}", idx))?;
617                self.store_struct_field(ctx, left.0, idx, &field_ty, value.clone(), &left.1)?;
618                return Ok(value);
619            }
620            if let Some(elem_ty) = Self::vec_elem_ty(&left.1) {
621                let idx = if right.is_value() {
622                    let idx = right.clone().value()?.as_int().ok_or(anyhow!("Vec 索引必须是整数"))?;
623                    (ctx.builder.ins().iconst(types::I64, idx), Type::I64)
624                } else {
625                    self.eval(ctx, &right)?.get(ctx).ok_or(anyhow!("Vec 索引没有值"))?
626                };
627                self.store_vec_index(ctx, left.0, idx, &elem_ty, value.clone())?;
628                return Ok(value);
629            }
630            if let Some(elem_ty) = Self::array_elem_ty(&left.1) {
631                let idx = if right.is_value() {
632                    let idx = right.clone().value()?.as_int().ok_or(anyhow!("array index must be integer"))?;
633                    (ctx.builder.ins().iconst(types::I64, idx), Type::I64)
634                } else {
635                    self.eval(ctx, &right)?.get(ctx).ok_or(anyhow!("array index has no value"))?
636                };
637                self.store_array_index(ctx, left.0, idx, &elem_ty, value.clone())?;
638                return Ok(value);
639            }
640            if right.is_value() {
641                let right_value = right.clone().value()?;
642                if let Some(idx) = right_value.as_int() {
643                    let idx = ctx.builder.ins().iconst(types::I64, idx);
644                    let f = self.get_method(&left.1, "set_idx")?;
645                    let args = self.adjust_args(ctx, vec![left, (idx, Type::I64), value.clone()], f.arg_tys()?)?;
646                    self.call_for_side_effect(ctx, f, args)?;
647                } else {
648                    let key = ctx.get_const(&right_value)?;
649                    let f = self.get_method(&left.1, "set_key")?;
650                    let args = self.adjust_args(ctx, vec![left, key, value.clone()], f.arg_tys()?)?;
651                    self.call_for_side_effect(ctx, f, args)?;
652                }
653            } else {
654                let right = self.eval(ctx, &right)?.get(ctx).unwrap();
655                if right.1.is_any() || right.1.is_str() {
656                    let f = self.get_method(&left.1, "set_key")?;
657                    let args = self.adjust_args(ctx, vec![left, right, value.clone()], f.arg_tys()?)?;
658                    self.call_for_side_effect(ctx, f, args)?;
659                } else {
660                    let f = self.get_method(&left.1, "set_idx")?;
661                    let args = self.adjust_args(ctx, vec![left, right, value.clone()], f.arg_tys()?)?;
662                    self.call_for_side_effect(ctx, f, args)?;
663                }
664            }
665            return Ok(value);
666        } else {
667            panic!("赋值给 {:?} {:?}", left, value)
668        }
669    }
670
671    fn closure_value(&self, ctx: &mut BuildContext, id: u32) -> Result<LocalVar> {
672        let captures = match self.compiler.symbols.get_symbol(id)?.1 {
673            Symbol::Fn { cap, .. } => cap.vars.iter().map(|idx| ctx.get_var(*idx as u32)?.get(ctx).ok_or_else(|| anyhow!("捕获变量 {} 没有值", idx))).collect::<Result<Vec<_>>>()?,
674            _ => Vec::new(),
675        };
676        Ok(LocalVar::Closure { id, captures })
677    }
678
679    pub(crate) fn call_fn(&mut self, ctx: &mut BuildContext, id: u32, obj: Option<Expr>, params: &Vec<Expr>) -> Result<LocalVar> {
680        self.call_fn_with_params(ctx, id, &[], obj, params)
681    }
682
683    pub(crate) fn call_fn_with_params(&mut self, ctx: &mut BuildContext, id: u32, generic_args: &[Type], obj: Option<Expr>, params: &Vec<Expr>) -> Result<LocalVar> {
684        self.call_fn_with_capture_values(ctx, id, generic_args, obj, params, None)
685    }
686
687    pub(crate) fn call_fn_with_capture_values(&mut self, ctx: &mut BuildContext, id: u32, generic_args: &[Type], obj: Option<Expr>, params: &Vec<Expr>, capture_values: Option<Vec<(Value, Type)>>) -> Result<LocalVar> {
688        let mut args: Vec<(Value, Type)> = if let Some(obj) = obj { vec![self.eval(ctx, &obj)?.get(ctx).unwrap()] } else { Vec::new() };
689        for p in params {
690            args.push(self.eval(ctx, p)?.get(ctx).unwrap());
691        }
692        if let Some(captures) = &capture_values {
693            args.extend(captures.iter().cloned());
694        }
695        let fn_name = self.compiler.symbols.get_symbol(id).map(|(name, _)| name.clone())?;
696        if fn_name.as_str().ends_with("Vec::swap")
697            && let Some((base, vec_ty)) = args.first().cloned()
698            && let Some(elem_ty) = Self::vec_elem_ty(&vec_ty)
699        {
700            let [_, left_idx, right_idx]: [(Value, Type); 3] = args.try_into().map_err(|_| anyhow!("Vec::swap 需要 self 和两个索引参数"))?;
701            self.swap_vec_index(ctx, base, left_idx, right_idx, &elem_ty)?;
702            return Ok(LocalVar::None);
703        }
704        let visible_arg_len = args.len() - capture_values.as_ref().map(|captures| captures.len()).unwrap_or(0);
705        let arg_tys: Vec<Type> = args.iter().take(visible_arg_len).map(|(_, ty)| ty.clone()).collect();
706        let fn_info = match if generic_args.is_empty() { self.get_fn(id, &arg_tys) } else { Err(anyhow!("generic function needs specialization")) } {
707            Ok(info) => info,
708            Err(_) => self.gen_fn_with_params(Some(ctx), id, &arg_tys, generic_args).map_err(|e| {
709                log::error!("{:?}", self.compiler.symbols.get_symbol(id));
710                e
711            })?,
712        };
713        match &fn_info {
714            FnInfo::Call { fn_id: _, arg_tys: want_tys, caps, ret, context: _ } => {
715                let mut args = self.adjust_args(ctx, args, want_tys)?;
716                if capture_values.is_none() {
717                    for c in caps {
718                        args.push(ctx.get_var(*c as u32)?.get(ctx).unwrap().0);
719                    }
720                }
721                if ret.is_void() {
722                    self.call_for_side_effect(ctx, fn_info, args)?;
723                    Ok(LocalVar::None)
724                } else {
725                    self.call(ctx, fn_info, args).map(|r| r.into())
726                }
727            }
728            _ => panic!("不可能编译出 inline 函数"),
729        }
730    }
731
732    pub(crate) fn eval(&mut self, ctx: &mut BuildContext, expr: &Expr) -> Result<LocalVar> {
733        match &expr.kind {
734            ExprKind::Value(v) => Ok(ctx.get_const(v)?.into()),
735            ExprKind::Var(idx) => {
736                let v = ctx.get_var(*idx)?;
737                Ok(v)
738            }
739            ExprKind::Unary { op, value } => {
740                let v = self.eval(ctx, value)?.get(ctx).unwrap();
741                if op == &UnaryOp::Not {
742                    let cond = self.bool_value(ctx, v)?;
743                    let zero = ctx.builder.ins().iconst(types::I8, 0);
744                    let one = ctx.builder.ins().iconst(types::I8, 1);
745                    let is_zero = ctx.builder.ins().icmp_imm(IntCC::Equal, cond, 0);
746                    Ok((ctx.builder.ins().select(is_zero, one, zero), Type::Bool).into())
747                } else {
748                    Ok(Self::unary(ctx, v, op.clone())?.into())
749                }
750            }
751            ExprKind::Binary { left, op, right } => {
752                if op == &BinaryOp::Assign {
753                    match self.eval(ctx, right) {
754                        Ok(value) => self.assign(ctx, left, value).map(|v| v.into()),
755                        Err(e) => {
756                            log::error!("assign error {:?}", e);
757                            Err(e)
758                        }
759                    }
760                } else {
761                    let assign_expr = if op.is_assign() { Some(left.clone()) } else { None };
762                    let left = match self.eval(ctx, left)?.get(ctx) {
763                        Some(left) => left,
764                        None if matches!(op, BinaryOp::And | BinaryOp::Or) => self.get_null_value(ctx)?,
765                        None => return Err(anyhow!("binary left has no value: {:?}", left)),
766                    };
767                    if op == &BinaryOp::Idx {
768                        if let Type::Struct { params: _, fields: _ } = &left.1 {
769                            let idx = self.struct_field_index(&left.1, right)?;
770                            return self.load_struct_field(ctx, left.0, idx, &left.1).map(|r| r.into());
771                        }
772                        if let Some(elem_ty) = Self::vec_elem_ty(&left.1) {
773                            let idx = if right.is_value() {
774                                let idx = right.clone().value()?.as_int().ok_or(anyhow!("Vec 索引必须是整数"))?;
775                                (ctx.builder.ins().iconst(types::I64, idx), Type::I64)
776                            } else {
777                                self.eval(ctx, right)?.get(ctx).ok_or(anyhow!("Vec 索引没有值"))?
778                            };
779                            return self.load_vec_index(ctx, left.0, idx, &elem_ty).map(|r| r.into());
780                        }
781                        if let Some(elem_ty) = Self::array_elem_ty(&left.1) {
782                            let idx = if right.is_value() {
783                                let idx = right.clone().value()?.as_int().ok_or(anyhow!("array index must be integer"))?;
784                                (ctx.builder.ins().iconst(types::I64, idx), Type::I64)
785                            } else {
786                                self.eval(ctx, right)?.get(ctx).ok_or(anyhow!("array index has no value"))?
787                            };
788                            return self.load_array_index(ctx, left.0, idx, &elem_ty).map(|r| r.into());
789                        }
790                        if right.is_value() {
791                            let right_value = right.clone().value()?;
792                            if let Some(idx) = right_value.as_int() {
793                                let idx = ctx.builder.ins().iconst(types::I64, idx);
794                                self.call(ctx, self.get_method(&left.1, "get_idx")?, vec![left.0, idx]).map(|r| r.into())
795                            } else {
796                                let key = ctx.get_const(&right_value)?;
797                                self.call(ctx, self.get_method(&left.1, "get_key")?, vec![left.0, key.0]).map(|r| r.into())
798                            }
799                        } else if let ExprKind::Range { start, stop, inclusive } = &right.kind {
800                            let start = self.eval(ctx, start)?.get(ctx).ok_or(anyhow!("range start has no value"))?;
801                            let start = self.convert(ctx, start, Type::I64)?;
802                            let stop = self.eval(ctx, stop)?.get(ctx).ok_or(anyhow!("range stop has no value"))?;
803                            let stop = self.convert(ctx, stop, Type::Any)?;
804                            let inclusive = ctx.builder.ins().iconst(types::I8, i64::from(*inclusive));
805                            self.call(ctx, self.get_method(&left.1, "slice")?, vec![left.0, start, stop, inclusive]).map(|r| r.into())
806                        } else {
807                            let right = self.eval(ctx, right)?.get(ctx).ok_or(anyhow!("非Value {:?}", right))?;
808                            if right.1.is_any() || right.1.is_str() {
809                                let right = self.convert(ctx, right, Type::Any)?;
810                                self.call(ctx, self.get_method(&left.1, "get_key")?, vec![left.0, right]).map(|r| r.into())
811                            } else {
812                                let right = self.convert(ctx, right, Type::I64)?;
813                                self.call(ctx, self.get_method(&left.1, "get_idx")?, vec![left.0, right]).map(|r| r.into())
814                            }
815                        }
816                    } else {
817                        let result = self.binary(ctx, left, op.clone(), right)?.into();
818                        if let Some(expr) = assign_expr { self.assign(ctx, &expr, result).map(|r| r.into()) } else { Ok(result.into()) }
819                    }
820                }
821            }
822            ExprKind::Call { obj, params } => {
823                if let ExprKind::AssocId { id, params: generic_args } = &obj.kind {
824                    self.call_fn_with_params(ctx, *id, generic_args, None, params)
825                } else if let ExprKind::Id(id, obj) = &obj.kind {
826                    self.call_fn(ctx, *id, obj.as_ref().map(|o| *o.clone()), params)
827                } else if obj.is_value() {
828                    //直接忽略掉的代码 编译期就可以忽略
829                    return Ok(LocalVar::None);
830                } else {
831                    if obj.is_idx() {
832                        let (left, _, right) = obj.clone().binary().unwrap();
833                        let left = self.eval(ctx, &left)?.get(ctx).ok_or(anyhow!("obj {:?}", obj))?;
834                        let ty = self.compiler.symbols.get_type(&left.1)?;
835                        if let Some(name) = self.get_dynamic(&right) {
836                            if name.as_str() == "swap"
837                                && let Some(elem_ty) = Self::vec_elem_ty(&ty)
838                            {
839                                let [left_idx, right_idx]: [(Value, Type); 2] =
840                                    params.iter().map(|p| self.eval(ctx, p)?.get(ctx).ok_or(anyhow!("Vec::swap 参数没有值"))).collect::<Result<Vec<_>>>()?.try_into().map_err(|_| anyhow!("Vec::swap 需要两个索引参数"))?;
841                                self.swap_vec_index(ctx, left.0, left_idx, right_idx, &elem_ty)?;
842                                return Ok(LocalVar::None);
843                            }
844                            let mut args = vec![left];
845                            for p in params {
846                                args.push(self.eval(ctx, p)?.get(ctx).unwrap());
847                            }
848                            let (_, method_ty) = self.compiler.get_field(&ty, name.as_str())?;
849                            let Type::Symbol { id, .. } = method_ty else {
850                                return Err(anyhow!("不是成员函数"));
851                            };
852                            let arg_tys: Vec<Type> = args.iter().map(|(_, ty)| ty.clone()).collect();
853                            let method = self.get_fn(id, &arg_tys).or_else(|_| self.gen_fn_with_params(Some(ctx), id, &arg_tys, &[]))?;
854                            let args = self.adjust_args(ctx, args, method.arg_tys()?)?;
855                            self.call(ctx, method, args).map(|r| r.into())
856                        } else {
857                            self.eval(ctx, obj)
858                        }
859                    } else {
860                        let val = self.eval(ctx, obj)?;
861                        if let LocalVar::Closure { id, captures } = val {
862                            return self.call_fn_with_capture_values(ctx, id, &[], None, params, Some(captures));
863                        }
864                        panic!("暂未实现 {:?}", val)
865                    }
866                }
867            }
868            ExprKind::Typed { value, ty } => {
869                if let Type::Struct { params: _, fields: _ } = ty
870                    && let ExprKind::List(items) = &value.kind
871                {
872                    return Ok((self.init_struct_from_items(ctx, items, ty)?, ty.clone()).into());
873                }
874                if let Type::Array(_, _) = ty
875                    && let ExprKind::List(items) = &value.kind
876                {
877                    return Ok((self.init_array_from_items(ctx, items, ty)?, ty.clone()).into());
878                }
879                let evaluated = self.eval(ctx, value)?;
880                if evaluated.is_closure() {
881                    return Ok(evaluated);
882                }
883                let vt = if let Some(vt) = evaluated.get(ctx) {
884                    vt
885                } else if ty.is_any() {
886                    let idx = self.compiler.get_const(Dynamic::Null);
887                    self.get_const_value(ctx, idx)?
888                } else {
889                    return Ok(LocalVar::None);
890                };
891                if let Type::Struct { params: _, fields: _ } = ty {
892                    if &vt.1 == ty {
893                        Ok(vt.into())
894                    } else if vt.1.is_any() {
895                        Ok((self.init_struct_from_dynamic(ctx, vt, ty)?, ty.clone()).into())
896                    } else {
897                        Err(anyhow!("cannot convert {:?} to {:?}", vt.1, ty))
898                    }
899                } else if &vt.1 != ty {
900                    Ok((self.convert(ctx, vt, ty.clone())?, ty.clone()).into())
901                } else {
902                    Ok(vt.into())
903                }
904            }
905            ExprKind::List(_) => Err(anyhow!("未实现 {:?}", expr)),
906            ExprKind::Repeat { value, len } => {
907                let value = self.eval(ctx, value)?.get(ctx).ok_or(anyhow!("repeat value has no value"))?;
908                let Type::ConstInt(len) = len else {
909                    return Err(anyhow!("repeat length must be a compile-time integer"));
910                };
911                let len = u32::try_from(*len).map_err(|_| anyhow!("repeat length out of range"))?;
912                self.init_repeat_array(ctx, value, len).map(|r| r.into())
913            }
914            ExprKind::Const(idx) => self.get_const_value(ctx, *idx).map(|v| v.into()),
915            ExprKind::Id(id, _) => self.closure_value(ctx, *id),
916            ExprKind::AssocId { id, .. } => self.closure_value(ctx, *id),
917            expr => {
918                //结构就是一块固定大小 的内存(或者是动态大小 最后一个数据成员可扩展 跟 C 结构一样)
919                panic!("未实现 {:?}", expr)
920            }
921        }
922    }
923
924    fn gen_loop(&mut self, ctx: &mut BuildContext, cond: Option<&Expr>, body: &Stmt, f: Option<impl FnMut(&mut BuildContext)>) -> Result<()> {
925        let loop_block = ctx.builder.create_block();
926        let end_block = ctx.builder.create_block();
927        if let Some(cond) = cond {
928            let start_block = ctx.builder.create_block();
929            ctx.builder.ins().jump(start_block, &[]);
930            ctx.builder.switch_to_block(start_block);
931            let cond = self.eval(ctx, cond)?.get(ctx).unwrap();
932            let cond = self.bool_value(ctx, cond)?;
933            let continue_block = if f.is_some() { ctx.builder.create_block() } else { start_block };
934            ctx.builder.ins().brif(cond, loop_block, &[], end_block, &[]);
935            ctx.builder.switch_to_block(loop_block);
936            let body_terminated = self.gen_stmt(ctx, body, Some(end_block), Some(continue_block))?;
937            if !body_terminated {
938                ctx.builder.ins().jump(continue_block, &[]);
939            }
940            ctx.builder.seal_block(loop_block);
941            f.map(|mut f| {
942                ctx.builder.switch_to_block(continue_block);
943                f(ctx);
944                ctx.builder.ins().jump(start_block, &[]);
945                ctx.builder.seal_block(continue_block);
946            });
947        } else {
948            ctx.builder.ins().jump(loop_block, &[]);
949            ctx.builder.switch_to_block(loop_block);
950            let body_terminated = self.gen_stmt(ctx, body, Some(end_block), Some(loop_block))?;
951            if !body_terminated {
952                ctx.builder.ins().jump(loop_block, &[]);
953            }
954            ctx.builder.seal_block(loop_block);
955        }
956        ctx.builder.switch_to_block(end_block);
957        Ok(())
958    }
959
960    pub(crate) fn gen_stmt(&mut self, ctx: &mut BuildContext, stmt: &Stmt, break_block: Option<Block>, continue_block: Option<Block>) -> Result<bool> {
961        match &stmt.kind {
962            StmtKind::Expr(expr, _) => {
963                let _ = self.eval(ctx, expr)?;
964            }
965            StmtKind::Break => {
966                ctx.builder.ins().jump(break_block.unwrap(), &[]);
967                return Ok(true);
968            }
969            StmtKind::Continue => {
970                ctx.builder.ins().jump(continue_block.unwrap(), &[]);
971                return Ok(true);
972            }
973            StmtKind::Return(expr) => {
974                if let Some(expr) = expr {
975                    let value = self.eval(ctx, expr)?;
976                    if let Some((r, _)) = value.get(ctx) {
977                        ctx.builder.ins().return_(&[r]);
978                    } else {
979                        ctx.builder.ins().return_(&[]);
980                    }
981                } else {
982                    ctx.builder.ins().return_(&[]);
983                }
984                return Ok(true);
985            }
986            StmtKind::If { cond, then_body, else_body } => {
987                self.declare_assigned_vars(ctx, then_body)?;
988                if let Some(else_body) = else_body {
989                    self.declare_assigned_vars(ctx, else_body)?;
990                }
991                let then_block = ctx.builder.create_block();
992                let cond = self.eval(ctx, cond)?.get(ctx).ok_or(anyhow!("未知的条件 {:?}", cond))?;
993                let cond = self.bool_value(ctx, cond)?;
994                let mut end_block = None;
995                if let Some(else_body) = else_body {
996                    let else_block = ctx.builder.create_block();
997                    ctx.builder.ins().brif(cond, then_block, &[], else_block, &[]);
998                    ctx.builder.switch_to_block(then_block);
999                    if !self.gen_stmt(ctx, then_body, break_block, continue_block)? {
1000                        let block = ctx.builder.create_block();
1001                        ctx.builder.ins().jump(block, &[]);
1002                        end_block = Some(block);
1003                    }
1004                    ctx.builder.switch_to_block(else_block);
1005                    if !self.gen_stmt(ctx, else_body, break_block, continue_block)? {
1006                        if end_block.is_none() {
1007                            end_block = Some(ctx.builder.create_block());
1008                        }
1009                        ctx.builder.ins().jump(end_block.unwrap(), &[]);
1010                    }
1011                    ctx.builder.seal_block(else_block);
1012                } else {
1013                    let block = ctx.builder.create_block();
1014                    ctx.builder.ins().brif(cond, then_block, &[], block, &[]);
1015                    end_block = Some(block);
1016                    ctx.builder.switch_to_block(then_block);
1017                    if !self.gen_stmt(ctx, then_body, break_block, continue_block)? {
1018                        ctx.builder.ins().jump(end_block.unwrap(), &[]); //如果不是返回指令 增加跳转到 end_block
1019                    }
1020                }
1021                if let Some(block) = end_block {
1022                    ctx.builder.switch_to_block(block);
1023                }
1024                ctx.builder.seal_block(then_block);
1025                return Ok(end_block.is_none());
1026            }
1027            StmtKind::Block(stmts) => {
1028                for (idx, stmt) in stmts.iter().enumerate() {
1029                    let r = self.gen_stmt(ctx, stmt, break_block, continue_block)?;
1030                    if idx == stmts.len() - 1 {
1031                        return Ok(r);
1032                    }
1033                }
1034            }
1035            StmtKind::While { cond, body } => {
1036                self.declare_assigned_vars(ctx, body)?;
1037                let no_loop: Option<fn(&mut BuildContext)> = None;
1038                self.gen_loop(ctx, Some(cond), body, no_loop)?;
1039            }
1040            StmtKind::Loop(body) => {
1041                self.declare_assigned_vars(ctx, body)?;
1042                let no_loop: Option<fn(&mut BuildContext)> = None;
1043                self.gen_loop(ctx, None, body, no_loop)?;
1044            }
1045            StmtKind::For { pat, range, body } => {
1046                if let ExprKind::Range { start, stop, inclusive } = &range.kind {
1047                    if let PatternKind::Var { idx, .. } = &pat.kind {
1048                        let start = self.eval(ctx, start)?;
1049                        ctx.set_var(*idx, start)?;
1050                        self.declare_assigned_vars(ctx, body)?;
1051                        let op = if *inclusive { BinaryOp::Le } else { BinaryOp::Lt };
1052                        let cond = Self::expr(ExprKind::Binary { left: Box::new(Self::expr(ExprKind::Var(*idx))), op, right: Box::new(stop.as_ref().clone()) });
1053                        self.gen_loop(
1054                            ctx,
1055                            Some(&cond),
1056                            body,
1057                            Some(|ctx: &mut BuildContext| {
1058                                let v = ctx.get_var(*idx).unwrap().get(ctx).unwrap();
1059                                let step = if v.1 == Type::I64 {
1060                                    ctx.builder.ins().iconst(types::I64, 1)
1061                                } else if v.1 == Type::I32 {
1062                                    ctx.builder.ins().iconst(types::I32, 1)
1063                                } else {
1064                                    panic!("{:?} 不能作为增量", v.1)
1065                                };
1066                                let vt = (ctx.builder.ins().iadd(v.0, step), v.1).into();
1067                                let _ = ctx.set_var(*idx, vt);
1068                            }),
1069                        )?;
1070                    }
1071                } else if let PatternKind::Var { idx, .. } = &pat.kind {
1072                    let vt = self.eval(ctx, range)?.get(ctx).unwrap();
1073                    if vt.1.is_any() {
1074                        let iter = self.call(ctx, self.get_method(&vt.1, "iter")?, vec![vt.0])?;
1075                        let next = self.get_method(&vt.1, "next")?;
1076                        let next_id = next.get_id()?;
1077                        let start = self.call(ctx, next, vec![iter.0])?;
1078                        ctx.set_var(*idx, start.into())?;
1079                        let cond = Self::expr(ExprKind::Binary { left: Box::new(Self::expr(ExprKind::Var(*idx))), op: BinaryOp::Ne, right: Box::new(Self::expr(ExprKind::Value(Dynamic::Null))) });
1080                        self.gen_loop(
1081                            ctx,
1082                            Some(&cond),
1083                            body,
1084                            Some(|ctx: &mut BuildContext| {
1085                                let fn_ref = ctx.get_fn_ref(next_id).unwrap();
1086                                let call_inst = ctx.builder.ins().call(fn_ref, &[iter.0]);
1087                                let ret = ctx.builder.inst_results(call_inst)[0];
1088                                let _ = ctx.set_var(*idx, (ret, Type::Any).into());
1089                            }),
1090                        )?;
1091                    }
1092                } else if let PatternKind::Tuple(pats) = &pat.kind {
1093                    let vt = self.eval(ctx, range)?.get(ctx).unwrap();
1094                    if vt.1.is_any() && pats.len() == 2 {
1095                        //暂时只处理 kv
1096                        let iter = self.call(ctx, self.get_method(&vt.1, "iter")?, vec![vt.0])?;
1097                        let next = self.get_method(&vt.1, "next")?;
1098                        let next_id = next.get_id()?;
1099                        let get_idx = self.get_method(&vt.1, "get_idx")?.get_id()?;
1100
1101                        let start = self.call(ctx, next, vec![iter.0])?;
1102                        let key_idx = ctx.builder.ins().iconst(types::I64, 0);
1103                        let key = self.call(ctx, self.get_method(&start.1, "get_idx")?, vec![start.0, key_idx])?;
1104                        let value_idx = ctx.builder.ins().iconst(types::I64, 1);
1105                        let value = self.call(ctx, self.get_method(&start.1, "get_idx")?, vec![start.0, value_idx])?;
1106                        ctx.set_var(pats[0].var().unwrap(), key.into())?;
1107                        ctx.set_var(pats[1].var().unwrap(), value.into())?;
1108                        let cond = Self::expr(ExprKind::Binary { left: Box::new(Self::expr(ExprKind::Var(pats[0].var().unwrap()))), op: BinaryOp::Ne, right: Box::new(Self::expr(ExprKind::Value(Dynamic::Null))) });
1109                        self.gen_loop(
1110                            ctx,
1111                            Some(&cond),
1112                            body,
1113                            Some(|ctx: &mut BuildContext| {
1114                                let fn_ref = ctx.get_fn_ref(next_id).unwrap();
1115                                let call_inst = ctx.builder.ins().call(fn_ref, &[iter.0]);
1116                                let ret = ctx.builder.inst_results(call_inst)[0];
1117
1118                                let fn_ref = ctx.get_fn_ref(get_idx).unwrap();
1119                                let call_inst = ctx.builder.ins().call(fn_ref, &[ret, key_idx]);
1120                                let key_ret = ctx.builder.inst_results(call_inst)[0];
1121                                let call_inst = ctx.builder.ins().call(fn_ref, &[ret, value_idx]);
1122                                let value_ret = ctx.builder.inst_results(call_inst)[0];
1123
1124                                let _ = ctx.set_var(pats[0].var().unwrap(), (key_ret, Type::Any).into());
1125                                let _ = ctx.set_var(pats[1].var().unwrap(), (value_ret, Type::Any).into());
1126                            }),
1127                        )?;
1128                    }
1129                }
1130            }
1131            _ => {
1132                panic!("未实现 {:?}", stmt)
1133            }
1134        }
1135        Ok(false)
1136    }
1137}