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 6752000fd..fa4c57282 100644 Binary files a/kclvm/runtime/src/_kclvm.bc and b/kclvm/runtime/src/_kclvm.bc differ diff --git a/kclvm/runtime/src/_kclvm.h b/kclvm/runtime/src/_kclvm.h index 312e8db22..06fd9eb7b 100644 --- a/kclvm/runtime/src/_kclvm.h +++ b/kclvm/runtime/src/_kclvm.h @@ -324,6 +324,8 @@ kclvm_value_ref_t* kclvm_file_mv(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kclvm_file_read(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +kclvm_value_ref_t* kclvm_file_read_env(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); + kclvm_value_ref_t* kclvm_file_size(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); kclvm_value_ref_t* kclvm_file_workdir(kclvm_context_t* ctx, kclvm_value_ref_t* _args, kclvm_value_ref_t* _kwargs); diff --git a/kclvm/runtime/src/_kclvm.ll b/kclvm/runtime/src/_kclvm.ll index 35e2ee88a..893e8d926 100644 --- a/kclvm/runtime/src/_kclvm.ll +++ b/kclvm/runtime/src/_kclvm.ll @@ -272,6 +272,8 @@ declare %kclvm_value_ref_t* @kclvm_file_mv(%kclvm_context_t* %ctx, %kclvm_value_ declare %kclvm_value_ref_t* @kclvm_file_read(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); +declare %kclvm_value_ref_t* @kclvm_file_read_env(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); + declare %kclvm_value_ref_t* @kclvm_file_size(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); declare %kclvm_value_ref_t* @kclvm_file_workdir(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %_args, %kclvm_value_ref_t* %_kwargs); diff --git a/kclvm/runtime/src/_kclvm.rs b/kclvm/runtime/src/_kclvm.rs index e3f1a7849..f79213faa 100644 --- a/kclvm/runtime/src/_kclvm.rs +++ b/kclvm/runtime/src/_kclvm.rs @@ -147,6 +147,7 @@ pub enum ApiFunc { kclvm_file_modpath, kclvm_file_mv, kclvm_file_read, + kclvm_file_read_env, kclvm_file_size, kclvm_file_workdir, kclvm_file_write, diff --git a/kclvm/runtime/src/_kclvm_addr.rs b/kclvm/runtime/src/_kclvm_addr.rs index cf79c027e..5018c9c98 100644 --- a/kclvm/runtime/src/_kclvm_addr.rs +++ b/kclvm/runtime/src/_kclvm_addr.rs @@ -152,6 +152,7 @@ pub fn _kclvm_get_fn_ptr_by_name(name: &str) -> 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, + ) } // ------------------------------