From 8e5e592cca1c6ef8bd71d2e56d219d730f2631f3 Mon Sep 17 00:00:00 2001 From: peefy Date: Thu, 16 May 2024 15:36:05 +0800 Subject: [PATCH] feat: impl read_env func Signed-off-by: peefy --- kclvm/api/src/service/service_impl.rs | 6 +- .../kclvm_loader__tests__assign_stmt_0.snap | 2 +- .../kclvm_loader__tests__assign_stmt_1.snap | 2 +- .../kclvm_loader__tests__assign_stmt_2.snap | 2 +- .../kclvm_loader__tests__builtin_call_0.snap | 14 ++--- .../kclvm_loader__tests__builtin_call_1.snap | 48 ++++++++-------- .../kclvm_loader__tests__builtin_call_2.snap | 52 +++++++++--------- .../kclvm_loader__tests__import_stmt_0.snap | 2 +- .../kclvm_loader__tests__import_stmt_1.snap | 2 +- kclvm/runtime/src/_kclvm.bc | Bin 14416 -> 14452 bytes kclvm/runtime/src/_kclvm.h | 2 + kclvm/runtime/src/_kclvm.ll | 2 + kclvm/runtime/src/_kclvm.rs | 1 + kclvm/runtime/src/_kclvm_addr.rs | 1 + kclvm/runtime/src/_kclvm_api_spec.rs | 4 ++ kclvm/runtime/src/file/mod.rs | 21 +++++++ kclvm/sema/src/builtin/system_module.rs | 14 +++++ 17 files changed, 110 insertions(+), 65 deletions(-) diff --git a/kclvm/api/src/service/service_impl.rs b/kclvm/api/src/service/service_impl.rs index d3f3b375a..4e7330d52 100644 --- a/kclvm/api/src/service/service_impl.rs +++ b/kclvm/api/src/service/service_impl.rs @@ -176,9 +176,9 @@ impl KclvmServiceImpl { /// assert_eq!(result.type_errors.len(), 0); /// assert_eq!(result.symbols.len(), 12); /// assert_eq!(result.scopes.len(), 3); - /// assert_eq!(result.node_symbol_map.len(), 176); - /// assert_eq!(result.symbol_node_map.len(), 176); - /// assert_eq!(result.fully_qualified_name_map.len(), 185); + /// assert_eq!(result.node_symbol_map.len(), 177); + /// assert_eq!(result.symbol_node_map.len(), 177); + /// assert_eq!(result.fully_qualified_name_map.len(), 186); /// assert_eq!(result.pkg_scope_map.len(), 3); /// ``` #[inline] diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_0.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_0.snap index 90ca6733c..3cabd1912 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_0.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_0.snap @@ -38,7 +38,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 164, + index: 165, generation: 0, }, kind: Value, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_1.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_1.snap index 15d610a88..3041ea0fb 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_1.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_1.snap @@ -38,7 +38,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 164, + index: 165, generation: 0, }, kind: Value, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_2.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_2.snap index a478f4e60..49364f4d5 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_2.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__assign_stmt_2.snap @@ -38,7 +38,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 164, + index: 165, generation: 0, }, kind: Value, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_0.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_0.snap index 4fac45d7f..0ab77f544 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_0.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_0.snap @@ -88,13 +88,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 135, - generation: 0, - }, - kind: Value, - }, SymbolRef { id: Index { index: 136, @@ -291,6 +284,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Value, }, + SymbolRef { + id: Index { + index: 164, + generation: 0, + }, + kind: Value, + }, ], is_global: false, }, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_1.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_1.snap index 5c89ad4e5..7d3e01618 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_1.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_1.snap @@ -38,7 +38,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 164, + index: 165, generation: 0, }, kind: Value, @@ -180,13 +180,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 135, - generation: 0, - }, - kind: Value, - }, SymbolRef { id: Index { index: 136, @@ -383,6 +376,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Value, }, + SymbolRef { + id: Index { + index: 164, + generation: 0, + }, + kind: Value, + }, ], is_global: false, }, @@ -415,20 +415,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 165, + index: 166, generation: 0, }, kind: Value, }, ), attrs: [ - SymbolRef { - id: Index { - index: 135, - generation: 0, - }, - kind: Value, - }, SymbolRef { id: Index { index: 136, @@ -625,6 +618,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Value, }, + SymbolRef { + id: Index { + index: 164, + generation: 0, + }, + kind: Value, + }, ], is_global: false, }, @@ -664,13 +664,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 135, - generation: 0, - }, - kind: Value, - }, SymbolRef { id: Index { index: 136, @@ -867,6 +860,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Value, }, + SymbolRef { + id: Index { + index: 164, + generation: 0, + }, + kind: Value, + }, ], is_global: false, }, @@ -899,7 +899,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 166, + index: 167, generation: 0, }, kind: Value, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_2.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_2.snap index bce516396..0628821f2 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_2.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_2.snap @@ -99,7 +99,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 164, + index: 165, generation: 0, }, kind: Value, @@ -240,7 +240,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 165, + index: 166, generation: 0, }, kind: Value, @@ -337,7 +337,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 164, + index: 165, generation: 0, }, kind: Value, @@ -382,13 +382,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 135, - generation: 0, - }, - kind: Value, - }, SymbolRef { id: Index { index: 136, @@ -585,6 +578,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Value, }, + SymbolRef { + id: Index { + index: 164, + generation: 0, + }, + kind: Value, + }, ], is_global: false, }, @@ -617,20 +617,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 166, + index: 167, generation: 0, }, kind: Value, }, ), attrs: [ - SymbolRef { - id: Index { - index: 135, - generation: 0, - }, - kind: Value, - }, SymbolRef { id: Index { index: 136, @@ -827,6 +820,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Value, }, + SymbolRef { + id: Index { + index: 164, + generation: 0, + }, + kind: Value, + }, ], is_global: false, }, @@ -866,13 +866,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 135, - generation: 0, - }, - kind: Value, - }, SymbolRef { id: Index { index: 136, @@ -1069,6 +1062,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Value, }, + SymbolRef { + id: Index { + index: 164, + generation: 0, + }, + kind: Value, + }, ], is_global: false, }, @@ -1101,7 +1101,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 167, + index: 168, generation: 0, }, kind: Value, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__import_stmt_0.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__import_stmt_0.snap index 4a6044c96..dc09f2cb8 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__import_stmt_0.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__import_stmt_0.snap @@ -195,7 +195,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 164, + index: 165, generation: 0, }, kind: Value, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__import_stmt_1.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__import_stmt_1.snap index 8286b6c47..e464b2559 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__import_stmt_1.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__import_stmt_1.snap @@ -38,7 +38,7 @@ expression: "format!(\"{:#?}\", p.symbols.values())" def: Some( SymbolRef { id: Index { - index: 164, + index: 165, generation: 0, }, kind: Value, diff --git a/kclvm/runtime/src/_kclvm.bc b/kclvm/runtime/src/_kclvm.bc index 6752000fdf69f152aeb7346822740671c1a4f3ef..fa4c57282b21d55c98e0afd44b030f3ca328b9bf 100644 GIT binary patch delta 3891 zcmZWsdrVVT9KJ0SEX9I!r9?rBQZQEvXlACsM#sZJMTU>Epk<;f)2TD)bRsd_DjI@>Q^AQwu;Nm7SvpUqxhz=jPWy9DlW1>5^m#&xZ_K(}-^mots9>4RQ z)4rmoMYWNl>NZWdKa(X5q&y!l|Ca4}#X)M%2;~#9*xs(z=y*f^@l7MEMS3%DD5N06 zd2Of056b9uB85cFt0S{H?K%6z?nN2)H?pc}xiw2P!Bc1!?OOUkYqC<_p0Q3Ul@3%j zdPCW)SR-=iGwwzXgQw$>!>TP2cNs6WX91S0^Grd@|LEAC2)O(Cr{>0FbN*#^r}fA!UIOSqoIvXYBkZ34E;z@0vk+YGjn(9PXwc}RiC=jZ0MBi(JG zjd@5nQ=Y8_eEO(LEzmG5m%k}?Im_{L1^q5sVCHE=^k}|ShE`Q~RK|c)hN^%?pa(rA z+=9s7eJ$;4?A*lg&y8H?%DI)vPOY~E^v52^n51D)Wx6h05IXac1;N>0T8n)D84U!! zO(ml%hcFSVUUZInGKaN|B^q;;VKKkZ+QmRnf!WctM!lJy3ifX{hx{ zPP9a&`EtxTt|i$6pisXCo9cO;V3T#wlTc*wTVgz&B&})KQ?yBnyWjAA&>{w#s!bzk zs!a>h5ZU~L0%TWW1<0nY5FkrG?>!C~!yXak0%*#KioRFTt-V!i!_7Ps$mXfPf?Vf_YqyX?*!-XgR9rO zk1or>-B@ZDgmL$}2+WDeH!dKD`gW!QeOX(nmW@5)JROJFP+8*l;SC=`gw3d7mYPRXDl|?qDKdB@Q za(e4N9yIQnFf2gkxK}YQ!btNDU6EmvJ6cqW0h!Gh*MyoekKfKfXd@j0J3F@T_yL=! z_gtso=E|%vZpR+F6?d`$;=%AtbvxU&v)uey5|SEgwArN@_aIwKvdiZ>Hu;6rRP3YX z>iL2;3a!~IhuOM6>Is1hIOE?^dQHe<>wBin$fN(|*aYC=*fv>(32`~OrWzNX^VzO+ z{D+`lGM&(H^Cyf6-R3XmW77>8YVh1to|`r?6Oi?Hd| z=D&jqOV0H;6+CY!e|6jI7VA9`rHk>Q+GSIuUUPb8s-KyieiPiBHmb?pio7#h9yqQ1 rthg*-?EQRyimLRXs35Pp`1S3XQ}g^LY${x7T2Z*+!}fzSP6qr395`P^ delta 3848 zcmZXXdrVVz6vuB{9xITduu^ph#ZhrZDiActx>->W>U0%bHxLAMxD80e46#w?Z6=PF zW?i5@V!|dvz`JP#ggBj!$1oEgn+Y&wS;90#2e=8d)2YDjy>02;_t!t#^w)FG?{m)g zob&tjapBK})^O2*CRL~(t(DH8+%JjWsiJgifYQA}dCf{|YN1p*!IEEe-QD*)0zAR& z>N!if7`*jnG^U7NazASkeQKnmjP;a1p7Hs6>_kTD55BrDo!MzWJ5kC3eMmyT468qI*g?0SS`xBjwvaRE5<&jPWnzuTvXzfO<+++Uh zH6Z-(P45B)uY$}e1*?L6xU0G?%Vs46Wn$#l-|+y`6hiAkN9z@f??4vSzmg-S=!o4l&T zhTalZ)17(VO2HQFG_k9~E=gc`ZmKfh#W*gfYX6>&gLT2R^*`Y?yHOH4U;`+po~=6P z%(0^+xr3rWPc+%nY9h(4Y7rDw-LPpMk&-hW*#14)Ou~|6HSu1VCnTe*IzKlOGH;ECW8D>*WmcneKZ$Mn3hhVf#0q(l)2 zaa8OQueJ!nVC`(<9!FqTX0$vu1js}^a8`avVM(oCKGKgWkx0SfXcI0oy7-H`v zqO6{6bdpO6UT{_jW_#sAIE-x%gR+2(`8Ucn!uSWd5{}Az7t?#?{2*p`Vuz57ji2po zW{8;Ttv3(YpyJeZzL7xIw?=`(m1)y7W6tWcj7U~|@kfr#m4Ax6`rq0mMB~ZQ#u9Oa zb>H*EBCojVix(K%DMcFOOr5!?4$0`@O@y3JFSQd_*SPE);^x}6Nb@F)hrS1jjcXxo zJx_eMM?hzFPbKy8Z9g49t3uv#$p{v??F7*a7goGV)KO(}vbT;e1jifeO}}cZ9}&jF z4 zIP7jn#&eS~9a2Nl+0M_|2+}h9788Hf;_`{RX-|J6v_nkVAE#pwEidcdGpQh(l$Z6k z(hxUBQOY1mOXw?7iC0^s@`YurN)w`(bwNBSa~fy)QPh4fiVBcaPvo~`g{1qmTwU u64 { "kclvm_file_modpath" => crate::kclvm_file_modpath as *const () as u64, "kclvm_file_mv" => crate::kclvm_file_mv as *const () as u64, "kclvm_file_read" => crate::kclvm_file_read as *const () as u64, + "kclvm_file_read_env" => crate::kclvm_file_read_env as *const () as u64, "kclvm_file_size" => crate::kclvm_file_size as *const () as u64, "kclvm_file_workdir" => crate::kclvm_file_workdir as *const () as u64, "kclvm_file_write" => crate::kclvm_file_write as *const () as u64, diff --git a/kclvm/runtime/src/_kclvm_api_spec.rs b/kclvm/runtime/src/_kclvm_api_spec.rs index 15da4b435..3269f9579 100644 --- a/kclvm/runtime/src/_kclvm_api_spec.rs +++ b/kclvm/runtime/src/_kclvm_api_spec.rs @@ -1250,6 +1250,10 @@ // api-spec(c): kclvm_value_ref_t* kclvm_file_append(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); // api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_file_append(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); +// api-spec: kclvm_file_read_env +// api-spec(c): kclvm_value_ref_t* kclvm_file_read_env(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_file_read_env(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); + // api-spec: kclvm_template_execute // api-spec(c): kclvm_value_ref_t* kclvm_template_execute(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); // api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_template_execute(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); diff --git a/kclvm/runtime/src/file/mod.rs b/kclvm/runtime/src/file/mod.rs index f38ae4142..fba39e5bb 100644 --- a/kclvm/runtime/src/file/mod.rs +++ b/kclvm/runtime/src/file/mod.rs @@ -333,3 +333,24 @@ pub extern "C" fn kclvm_file_append( panic!("append() requires 'filepath' argument"); } } + +#[no_mangle] +#[runtime_fn] +pub extern "C" fn kclvm_file_read_env( + ctx: *mut kclvm_context_t, + args: *const kclvm_value_ref_t, + kwargs: *const kclvm_value_ref_t, +) -> *const kclvm_value_ref_t { + let args = ptr_as_ref(args); + let kwargs = ptr_as_ref(kwargs); + let ctx = mut_ptr_as_ref(ctx); + + if let Some(key) = get_call_arg_str(args, kwargs, 0, Some("key")) { + match std::env::var(key) { + Ok(v) => ValueRef::str(&v).into_raw(ctx), + Err(_) => ValueRef::undefined().into_raw(ctx), + } + } else { + panic!("read_env() requires 'key' argument"); + } +} diff --git a/kclvm/sema/src/builtin/system_module.rs b/kclvm/sema/src/builtin/system_module.rs index e2c6122f3..e036973a7 100644 --- a/kclvm/sema/src/builtin/system_module.rs +++ b/kclvm/sema/src/builtin/system_module.rs @@ -1761,6 +1761,20 @@ register_file_member! { false, None, ) + read_env => Type::function( + None, + Type::str_ref(), + &[ + Parameter { + name: "key".to_string(), + ty: Type::str_ref(), + has_default: false, + }, + ], + r#"Read the environment variable key from the current process."#, + false, + None, + ) } // ------------------------------