From f7c75e03e543e2b65f89136fb3266527a8a79df6 Mon Sep 17 00:00:00 2001 From: peefy Date: Tue, 3 Sep 2024 19:21:47 +0800 Subject: [PATCH] refactor: crypto and base64 module encoding parameter Signed-off-by: peefy --- compiler_base/3rdparty/rustc_span/Cargo.toml | 2 +- compiler_base/3rdparty/rustc_span/src/lib.rs | 8 +- kclvm/Cargo.lock | 65 ++++++++++++++ kclvm/api/src/service/service_impl.rs | 6 +- .../kclvm_loader__tests__builtin_call_0.snap | 14 ++-- .../kclvm_loader__tests__builtin_call_1.snap | 42 +++++----- .../kclvm_loader__tests__builtin_call_2.snap | 42 +++++----- kclvm/runtime/Cargo.toml | 3 +- kclvm/runtime/src/_kclvm.bc | Bin 14648 -> 14684 bytes kclvm/runtime/src/_kclvm.h | 20 ++--- kclvm/runtime/src/_kclvm.ll | 20 +++-- kclvm/runtime/src/_kclvm.rs | 2 +- kclvm/runtime/src/_kclvm_addr.rs | 2 +- kclvm/runtime/src/_kclvm_api_spec.rs | 42 +++++----- kclvm/runtime/src/base64/mod.rs | 40 ++++----- kclvm/runtime/src/crypto/mod.rs | 79 ++++++++++++------ kclvm/runtime/src/encoding/mod.rs | 36 ++++++++ kclvm/runtime/src/lib.rs | 2 + kclvm/sema/src/builtin/system_module.rs | 6 -- kclvm/tools/src/LSP/src/state.rs | 1 - 20 files changed, 271 insertions(+), 161 deletions(-) create mode 100644 kclvm/runtime/src/encoding/mod.rs diff --git a/compiler_base/3rdparty/rustc_span/Cargo.toml b/compiler_base/3rdparty/rustc_span/Cargo.toml index f4108550f..d2188fcb8 100644 --- a/compiler_base/3rdparty/rustc_span/Cargo.toml +++ b/compiler_base/3rdparty/rustc_span/Cargo.toml @@ -23,4 +23,4 @@ tracing = "0.1" sha1 = { package = "sha-1", version = "0.10.0" } sha2 = "0.10.1" md5 = { package = "md-5", version = "0.10.0" } -blake3 = "1.5.4" \ No newline at end of file +blake3 = "1.5.4" diff --git a/compiler_base/3rdparty/rustc_span/src/lib.rs b/compiler_base/3rdparty/rustc_span/src/lib.rs index e3ee8193a..f4fcb4040 100644 --- a/compiler_base/3rdparty/rustc_span/src/lib.rs +++ b/compiler_base/3rdparty/rustc_span/src/lib.rs @@ -35,8 +35,9 @@ use std::path::{Path, PathBuf}; use std::rc::Rc; use std::str::FromStr; -use md5::Digest; +use blake3; use blake3::Hash as Blake3; +use md5::Digest; use md5::Md5; use sha1::Sha1; use sha2::Sha256; @@ -647,10 +648,7 @@ impl SourceFileHash { value.copy_from_slice(&Sha256::digest(data)); } SourceFileHashAlgorithm::Blake3 => { - let mut hasher = Blake3::new(); - hasher.update(data); - let result = hasher.finalize(); - value.copy_from_slice(result.as_bytes()); + value.copy_from_slice(blake3::hash(data).as_bytes()); } } hash diff --git a/kclvm/Cargo.lock b/kclvm/Cargo.lock index 14242249e..a3e8e4ba6 100644 --- a/kclvm/Cargo.lock +++ b/kclvm/Cargo.lock @@ -799,6 +799,70 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +dependencies = [ + "encoding-index-japanese", + "encoding-index-korean", + "encoding-index-simpchinese", + "encoding-index-singlebyte", + "encoding-index-tradchinese", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" + [[package]] name = "enquote" version = "1.1.0" @@ -2011,6 +2075,7 @@ dependencies = [ "blake3", "bstr", "chrono", + "encoding", "fancy-regex", "generational-arena", "glob", diff --git a/kclvm/api/src/service/service_impl.rs b/kclvm/api/src/service/service_impl.rs index 776fe7002..387173d32 100644 --- a/kclvm/api/src/service/service_impl.rs +++ b/kclvm/api/src/service/service_impl.rs @@ -220,9 +220,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(), 181); - /// assert_eq!(result.symbol_node_map.len(), 181); - /// assert_eq!(result.fully_qualified_name_map.len(), 191); + /// assert_eq!(result.node_symbol_map.len(), 182); + /// assert_eq!(result.symbol_node_map.len(), 182); + /// assert_eq!(result.fully_qualified_name_map.len(), 192); /// assert_eq!(result.pkg_scope_map.len(), 3); /// ``` #[inline] 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 71b8a2b15..bcc63eb43 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: 140, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 141, @@ -291,6 +284,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 169, + generation: 0, + }, + kind: Function, + }, ], 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 437a0af6f..ce5071998 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 @@ -240,13 +240,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 140, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 141, @@ -443,6 +436,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 169, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, @@ -482,13 +482,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 140, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 141, @@ -685,6 +678,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 169, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, @@ -724,13 +724,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 140, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 141, @@ -927,6 +920,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 169, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, 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 3e2d54eb9..be872595e 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 @@ -562,13 +562,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 140, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 141, @@ -765,6 +758,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 169, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, @@ -804,13 +804,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 140, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 141, @@ -1007,6 +1000,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 169, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, @@ -1046,13 +1046,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 140, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 141, @@ -1249,6 +1242,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 169, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, diff --git a/kclvm/runtime/Cargo.toml b/kclvm/runtime/Cargo.toml index 6c7ee47c5..fa66b45aa 100644 --- a/kclvm/runtime/Cargo.toml +++ b/kclvm/runtime/Cargo.toml @@ -21,7 +21,6 @@ regex = "1.5.5" md5 = "0.7.0" sha2 = "0.9.8" sha1 = "0.6.0" -blake3 = "1.5.4" chrono = "0.4.19" ahash = "0.7.2" indexmap = "1.0" @@ -33,6 +32,8 @@ uuid = { version = "1.7.0", features = ["serde", "v4"] } handlebars = "5.1.2" walkdir = "2.5.0" anyhow = "1" +blake3 = "1.5.4" +encoding = "0.2.33" [[bin]] name = "gen-api-spec" diff --git a/kclvm/runtime/src/_kclvm.bc b/kclvm/runtime/src/_kclvm.bc index 4f827e5a31b75da46030671fa853dd4a1df10f49..a222a266857f0bcdb05982be21e40b6cab667b07 100644 GIT binary patch delta 4778 zcmZWsYfw{17`+LP5WpbB5K6TKG=kTNw!RTG3Oa~XQ3)!b;seJ)X%*4&eS-)nmioX{ zt)i(##Vabvh-kG1E7qn~!5Yid$0(znnmQ^o;InG?<^kdC{gJ?C@9z1&bH20R)@0qu z+SW^SxKjPtBVs2bV%nbpwcFyZ<@Obc+eer*eXx#~B#2!*hH9B;KGo-7ajbL#mlmh* z_<;#Xi%owy8ke-R=JtUl4NoOgU`h6cPnoMn$6|U>exfQYLE5!rh;i{gx-g-}Pt`ue zF^qe_l;hu3xG!KjBV<#$nV2s6_L+k z*244$NUhs7G0M|(zZ)gbSg+3k8NbVaKO!61kBdiW&B-gB^l6o6PPGb=?Z^~i;i&Iz zPsqRAB(ROsg>jYfB=XNWCrJ1$njj6rkb^ePt6huw0?Cfc4kgBNe{LYKpDV53z9keyyvd zqU9dmZ@|h~n`Qh5D<^AsLKTMlNB4s>Fx*Vp#D0K}k1Xg1g`?Ocn`D!xUH^h3D|_ri zYNH~wNbO(QMwDlsg+Xcy&6Fp$9s3y*95+kCg#k3f6&aot>>e6f+6W5S{S|sdmh<#^ zFRc?Z#J*PF?Nrj7z}BN5a*H8ph3hEp&F^JXp{7~oCsfWNBO@_qw^mZ+(9&|>nlp$0 zFa+9-N5Ne%f}&QfJ1%!^b=O>E>S$CNPP@3~3a<9}Wd$(BmGUj333{g-k$jl{&PA#$ z*9$bjl;VUBx-Xv{WJF}IN5-5%aFSohPFx z<9yF;!+7gez7TJzU-VowPF=yJn_k-X6c9=X8Dqw7c#F=ty=P;di^DmE`NW&X>`2I6 zidC5Gmoyv%#SW5UTV&4kOL2E?-WqvNn%G@Zgl344 zQ^vHew{Z=U6(={31hOngq-8;RClZA7=2py2AFb0EAxoSY@MdVXJ<~=sZ^t zooVm$abh^Fdrpj0i$F~ug&Nl*zTNU0;{jjcwasB_y#tG|KLMz-xKaT5p8a4uwY)a;+or z@jcao1*Zv!gk& z>yPYue9>g;cA~Am--OLcWJ)6XL~}LOCK$d5MxQu$cMST3;YTjd0I9QZUf99tWXhQi z!i4AqzD9(f!o%leYBnNkI!ig&p6oeJ$VmKzhUUi`@L0_IlR{=X?S-zcSfxxtWbeYu z5!rxQl($|zZ#}T>`6odU3f`@n>;%n<>|k36A~QdwkYzmd!b^$ncja_I##i?*MPwW| zo4PN}{fRnTi#Uo-{)6~?>~K#Ta~iS1H8s?{LJh55xOlkDzU=V}EosW2^CeJPx~Ra( zlRzJ)UR}yV^@0rS4-xsJ;(V+H&+sC&2VF*BQh!*DvkWcz3U9)B2QCLtjrxk4wN#_N zEMtB)*c_WQIGl2bnm{GqaN}kd6_R~B_!n%r?Nt6)yh*SrJ+W-k&y2&W$yi>5XPDwy zpbi!AYH)RD1#tO^n#I(W?s5}#yf#)++Kfw|hsf%GyWA#s5F>nht13qu%Pb;Bt8r(T zU1VgShrauz2i+HR6Gd%`9#-}B$1lW#duvqx>AQG&II^)+McOSg_cK}7kd1ZX13u($ k;hE{pFo(!Gel9!1GONyh(qG~}ck!G>=>w~7tCQvb1Fs?E5&!@I delta 4718 zcmZWsTToM16un81n1DpV5C#>4H3C;aM3_+u7(pmdABe;kXf0~TGSuP&2eEo1H7Zy~ z5W*-_>H}#E>VOojs1>w)Xh)}7(^3apd_a||2qRXh+Mb&S3G3XCFr4h1v({c~?|p9D zy6@K&jTaoQQ#~FUp=Silz!TC`bnS-7UmzSaBG=>D$%{l& z7#l#2d`S?R{H3e3&T5B9*O0214+JS9rNf%DSIWJk?c*UVG;v!7hCQxQ*9qX@wv_f( z2JjiVfaEpI;MA~xjvP0203bP@$G2J9Di|DQ^pFQngE0MGX~if=9y?dJ(@pEZg5+3d z%wHik)8P5@521TnBgjV{2Wp1jLmtmGwe83wXkv06&@k4@$3-K)HfhD!LHM|)B4dtj z7Xs`!pIz<>unX3e7 zPt#BNlsymXCV)NV(_Q8QGNazJ8j(c@agh|XB}Eo!JUsFcWN#Z7mD>D|<%5Wo_gS<1 z5T(N!3Dcj|76`#~{b_~-0hlf{IJMd)mYF|ak5d$(si2nJ;6jz{BE=~r@hF%|Z|~Cm z$f54S@E&wh-m+RQ716Dqlz!5Nj^{_fu_lFaA%HV=yU2aeBJYNLCDS@2g;>2MUsQ#K zeZP4?R*U|8+>R^gxJ;SY&l9%O7skq6)DA}wEqYsgd$DjXK4@=6y8UajA7SBe6Q?C_ z0J_F+MjI9*-E_B`fk-z@{4L^BRa_~9Fk{qCKeQ+3HpgO5tN-~V%f}o-X(J+%(VlG^ zv?%TC$5c|k$^Gf%+Qe;9r=wQo{>iQ9!m z?V16dggx(5i(#jtR$@MGY;MI<3tnlVk#JSFdS;+hEuFEHiEi&irSvCd$%t(I*duA^ z+>5gL!C=Xx4sn*ktb&`hl!ywdmsd(libtq8s_C?ir8?)6=?Td94QK7?)-6d#yr`TE ze5>4JGrF*GntYqz+8ZY?2@xZs_|awTP0tbx%~OGk)K5|~+RVjHrK4;+UW*FD3W7vJ zYY6$n5B1O8Tc^QpUC|P5;uzS@bY#29O>O@zKdrsz$K;8X4r_$2DWK;^5e$F?eQqbx zs85RQgPy~#Rh_VU%3?|W_Vg-gH70pw8CCuTK_f89QH@D8iz>3L{S>kTlPP44D=1_+*PI3+R1o3YhX7X}%v~S^d=KW#3POCF{SIvfeEO>% z8pN0Rm*kNO@HKERx8o#cyCst*KwQqhPS~Wn-b#XD(wU^5tBN2iQn%fK5T;>0Gi+fN z{}U5rj&Y&3OZ1eFf$a+YToQ)?xQ?>8228T|^^6LMlCeJ|$FD!x*5U*e%RQ;j#>QQ| z`X1g*_uY)a8jGur(|D-u2k?F3+AqRJJoQ*+4|O@oZZKHiPAvQxz5zU4lAQ&O!dMz) z#NiX2MqLvgo}q5B#cO=APn^Dc89B84!0AxeYuk5ILU<__L!V%ygBuaqxpb<7b)Kum z>>k_D?0}5$CwXK4rl2+aro*nzo^hE7Rx)i;EC6K2cfq#iY8Ho2?UZHIz;3-@;E`GL zPa=syba}-N(9Fng^-;)%bn6DSFk;@Mhc0Mx{S8G5AY;!=qF$G{tshadb@?Sq&H`@R zO}yd0xYR`5a6?z8e}Ntf3p?{QvB_aAf2m1X14lNi0n;HNd`%<@6{SNLA%U(w`C z5@XRvrjmHdM!~~sEVmBpj(oQ+kB_&!30v1(L%1q-?h03mhkxdByr{Dw;h_=0LsRLk zzz!i@uxB^E;pUu*kAs7&?k~J@M5MIw=K&E1Ts=VzG4HgaNLP0@9v#5u>|w#1`fl$u zaDeemIK0s<+L0QPMUB_Xt!8stvt&m0d);L8X40w${gQzgo;M1& diff --git a/kclvm/runtime/src/_kclvm.h b/kclvm/runtime/src/_kclvm.h index 8b2caff69..cff0e8c81 100644 --- a/kclvm/runtime/src/_kclvm.h +++ b/kclvm/runtime/src/_kclvm.h @@ -69,9 +69,9 @@ typedef struct kclvm_value_t kclvm_value_t; void kclvm_assert(kclvm_context_t* ctx, kclvm_value_ref_t* value, kclvm_value_ref_t* msg); -kclvm_value_ref_t* kclvm_base64_decode(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_base64_decode(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); -kclvm_value_ref_t* kclvm_base64_encode(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_base64_encode(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); kclvm_value_ref_t* kclvm_builtin_abs(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); @@ -225,21 +225,21 @@ void kclvm_context_set_strict_range_check(kclvm_context_t* p, kclvm_bool_t v); kclvm_value_ref_t* kclvm_convert_collection_value(kclvm_context_t* ctx, kclvm_value_ref_t* value, kclvm_char_t* tpe, kclvm_value_ref_t* is_in_schema); -kclvm_value_ref_t* kclvm_crypto_filesha256(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_crypto_blake3(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); -kclvm_value_ref_t* kclvm_crypto_md5(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_crypto_filesha256(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); -kclvm_value_ref_t* kclvm_crypto_sha1(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_crypto_md5(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); -kclvm_value_ref_t* kclvm_crypto_sha224(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_crypto_sha1(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); -kclvm_value_ref_t* kclvm_crypto_sha256(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_crypto_sha224(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); -kclvm_value_ref_t* kclvm_crypto_sha384(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_crypto_sha256(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); -kclvm_value_ref_t* kclvm_crypto_sha512(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_crypto_sha384(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); -kclvm_value_ref_t* kclvm_crypto_blake3(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); +kclvm_value_ref_t* kclvm_crypto_sha512(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); kclvm_value_ref_t* kclvm_crypto_uuid(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 734b2d34b..9f5599886 100644 --- a/kclvm/runtime/src/_kclvm.ll +++ b/kclvm/runtime/src/_kclvm.ll @@ -32,9 +32,9 @@ declare void @kclvm_assert(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %value, %kclvm_value_ref_t* %msg); -declare %kclvm_value_ref_t* @kclvm_base64_decode(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_base64_decode(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); -declare %kclvm_value_ref_t* @kclvm_base64_encode(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_base64_encode(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); declare %kclvm_value_ref_t* @kclvm_builtin_abs(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); @@ -188,19 +188,21 @@ declare void @kclvm_context_set_strict_range_check(%kclvm_context_t* %p, %kclvm_ declare %kclvm_value_ref_t* @kclvm_convert_collection_value(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %value, %kclvm_char_t* %tpe, %kclvm_value_ref_t* %is_in_schema); -declare %kclvm_value_ref_t* @kclvm_crypto_filesha256(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_crypto_blake3(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); -declare %kclvm_value_ref_t* @kclvm_crypto_md5(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_crypto_filesha256(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); -declare %kclvm_value_ref_t* @kclvm_crypto_sha1(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_crypto_md5(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); -declare %kclvm_value_ref_t* @kclvm_crypto_sha224(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_crypto_sha1(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); -declare %kclvm_value_ref_t* @kclvm_crypto_sha256(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_crypto_sha224(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); -declare %kclvm_value_ref_t* @kclvm_crypto_sha384(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_crypto_sha256(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); -declare %kclvm_value_ref_t* @kclvm_crypto_sha512(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +declare %kclvm_value_ref_t* @kclvm_crypto_sha384(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); + +declare %kclvm_value_ref_t* @kclvm_crypto_sha512(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); declare %kclvm_value_ref_t* @kclvm_crypto_uuid(%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 cc9cdd721..0e45fb162 100644 --- a/kclvm/runtime/src/_kclvm.rs +++ b/kclvm/runtime/src/_kclvm.rs @@ -105,6 +105,7 @@ pub enum ApiFunc { kclvm_context_set_kcl_workdir, kclvm_context_set_strict_range_check, kclvm_convert_collection_value, + kclvm_crypto_blake3, kclvm_crypto_filesha256, kclvm_crypto_md5, kclvm_crypto_sha1, @@ -112,7 +113,6 @@ pub enum ApiFunc { kclvm_crypto_sha256, kclvm_crypto_sha384, kclvm_crypto_sha512, - kclvm_crypto_blake3, kclvm_crypto_uuid, kclvm_datetime_date, kclvm_datetime_now, diff --git a/kclvm/runtime/src/_kclvm_addr.rs b/kclvm/runtime/src/_kclvm_addr.rs index 81794a939..25012b473 100644 --- a/kclvm/runtime/src/_kclvm_addr.rs +++ b/kclvm/runtime/src/_kclvm_addr.rs @@ -106,6 +106,7 @@ pub fn _kclvm_get_fn_ptr_by_name(name: &str) -> u64 { "kclvm_convert_collection_value" => { crate::kclvm_convert_collection_value as *const () as u64 } + "kclvm_crypto_blake3" => crate::kclvm_crypto_blake3 as *const () as u64, "kclvm_crypto_filesha256" => crate::kclvm_crypto_filesha256 as *const () as u64, "kclvm_crypto_md5" => crate::kclvm_crypto_md5 as *const () as u64, "kclvm_crypto_sha1" => crate::kclvm_crypto_sha1 as *const () as u64, @@ -113,7 +114,6 @@ pub fn _kclvm_get_fn_ptr_by_name(name: &str) -> u64 { "kclvm_crypto_sha256" => crate::kclvm_crypto_sha256 as *const () as u64, "kclvm_crypto_sha384" => crate::kclvm_crypto_sha384 as *const () as u64, "kclvm_crypto_sha512" => crate::kclvm_crypto_sha512 as *const () as u64, - "kclvm_crypto_blake3" => crate::kclvm_crypto_blake3 as *const () as u64, "kclvm_crypto_uuid" => crate::kclvm_crypto_uuid as *const () as u64, "kclvm_datetime_date" => crate::kclvm_datetime_date as *const () as u64, "kclvm_datetime_now" => crate::kclvm_datetime_now as *const () as u64, diff --git a/kclvm/runtime/src/_kclvm_api_spec.rs b/kclvm/runtime/src/_kclvm_api_spec.rs index 53c63f753..db63ead8d 100644 --- a/kclvm/runtime/src/_kclvm_api_spec.rs +++ b/kclvm/runtime/src/_kclvm_api_spec.rs @@ -759,52 +759,52 @@ // api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_builtin_str_title(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); // api-spec: kclvm_base64_encode -// api-spec(c): kclvm_value_ref_t* kclvm_base64_encode(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_base64_encode(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_base64_encode(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_base64_encode(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_base64_decode -// api-spec(c): kclvm_value_ref_t* kclvm_base64_decode(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_base64_decode(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_base64_decode(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_base64_decode(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_value_union_all // api-spec(c): kclvm_value_ref_t* kclvm_value_union_all(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); // api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_value_union_all(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); // api-spec: kclvm_crypto_md5 -// api-spec(c): kclvm_value_ref_t* kclvm_crypto_md5(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_md5(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_crypto_md5(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_md5(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_crypto_sha1 -// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha1(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha1(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha1(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha1(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_crypto_sha224 -// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha224(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha224(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha224(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha224(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_crypto_sha256 -// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha256(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha256(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha256(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha256(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_crypto_sha384 -// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha384(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha384(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha384(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha384(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_crypto_sha512 -// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha512(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha512(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_crypto_sha512(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_sha512(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); -/// api-spec: kclvm_crypto_blake3 -/// api-spec(c): kclvm_value_ref_t* kclvm_crypto_blake3(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -/// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_blake3(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec: kclvm_crypto_blake3 +// api-spec(c): kclvm_value_ref_t* kclvm_crypto_blake3(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_blake3(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_crypto_uuid // api-spec(c): kclvm_value_ref_t* kclvm_crypto_uuid(kclvm_context_t* ctx, kclvm_value_ref_t* _args, kclvm_value_ref_t* _kwargs); // api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_uuid(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %_args, %kclvm_value_ref_t* %_kwargs); // api-spec: kclvm_crypto_filesha256 -// api-spec(c): kclvm_value_ref_t* kclvm_crypto_filesha256(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* _kwargs); -// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_filesha256(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %_kwargs); +// api-spec(c): kclvm_value_ref_t* kclvm_crypto_filesha256(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_crypto_filesha256(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); // api-spec: kclvm_datetime_today // api-spec(c): kclvm_value_ref_t* kclvm_datetime_today(kclvm_context_t* ctx, kclvm_value_ref_t* _args, kclvm_value_ref_t* _kwargs); diff --git a/kclvm/runtime/src/base64/mod.rs b/kclvm/runtime/src/base64/mod.rs index 58cd2b6e8..5ed481346 100644 --- a/kclvm/runtime/src/base64/mod.rs +++ b/kclvm/runtime/src/base64/mod.rs @@ -10,22 +10,16 @@ use crate::*; pub extern "C" fn kclvm_base64_encode( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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); - let p = args.arg_0().unwrap(); - match &*p.rc.borrow() { - Value::str_value(x) => { - let s = encode(x.clone()); - return ValueRef::str(s.as_str()).into_raw(ctx); - } - _ => { - ctx.set_err_type(&RuntimeErrorType::TypeError); - - panic!("a string object is required, not '{}'", p.as_str()); - } - }; + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let s = encode(s); + return ValueRef::str(s.as_str()).into_raw(ctx); + } + panic!("encode() missing 1 required positional argument: 'value'"); } #[no_mangle] @@ -33,20 +27,14 @@ pub extern "C" fn kclvm_base64_encode( pub extern "C" fn kclvm_base64_decode( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *const kclvm_value_ref_t, + kwargs: *const kclvm_value_ref_t, ) -> *mut kclvm_value_ref_t { let args = ptr_as_ref(args); + let kwargs = ptr_as_ref(kwargs); let ctx = mut_ptr_as_ref(ctx); - let p = args.arg_0().unwrap(); - match &*p.rc.borrow() { - Value::str_value(x) => { - let de_str = decode(x.clone()).unwrap(); - return ValueRef::str(std::str::from_utf8(&de_str).unwrap()).into_raw(ctx); - } - _ => { - ctx.set_err_type(&RuntimeErrorType::TypeError); - - panic!("argument should be a string object, not '{}'", p.as_str()); - } - }; + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let de_str = decode(s).unwrap(); + return ValueRef::str(std::str::from_utf8(&de_str).unwrap()).into_raw(ctx); + } + panic!("decode() missing 1 required positional argument: 'value'"); } diff --git a/kclvm/runtime/src/crypto/mod.rs b/kclvm/runtime/src/crypto/mod.rs index 8e84d3c8a..281cc7f81 100644 --- a/kclvm/runtime/src/crypto/mod.rs +++ b/kclvm/runtime/src/crypto/mod.rs @@ -8,6 +8,7 @@ extern crate sha2; use core::panic; use std::{fs::File, io::Read}; +use crate::encoding::encode_text; use sha2::{Digest, Sha224, Sha256, Sha384, Sha512}; use crate::*; @@ -23,13 +24,16 @@ type kclvm_value_ref_t = ValueRef; pub extern "C" fn kclvm_crypto_md5( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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(s) = args.arg_i_str(0, None) { - let hex = format!("{:x}", md5::compute(s)); + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let encoding = get_call_arg_str(args, kwargs, 1, Some("encoding")); + let bytes = encode_text(&s, encoding).unwrap(); + let hex = format!("{:x}", md5::compute(bytes)); return ValueRef::str(hex.as_ref()).into_raw(ctx); } panic!("md5() missing 1 required positional argument: 'value'"); @@ -42,13 +46,16 @@ pub extern "C" fn kclvm_crypto_md5( pub extern "C" fn kclvm_crypto_sha1( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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(s) = args.arg_i_str(0, None) { - let hex = sha1::Sha1::from(s).digest().to_string(); + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let encoding = get_call_arg_str(args, kwargs, 1, Some("encoding")); + let bytes = encode_text(&s, encoding).unwrap(); + let hex = sha1::Sha1::from(bytes).digest().to_string(); return ValueRef::str(hex.as_ref()).into_raw(ctx); } panic!("sha1() missing 1 required positional argument: 'value'"); @@ -61,14 +68,17 @@ pub extern "C" fn kclvm_crypto_sha1( pub extern "C" fn kclvm_crypto_sha224( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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(s) = args.arg_i_str(0, None) { + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let encoding = get_call_arg_str(args, kwargs, 1, Some("encoding")); + let bytes = encode_text(&s, encoding).unwrap(); let mut hasher = Sha224::new(); - hasher.update(&s); + hasher.update(bytes); let result = hasher.finalize(); let mut hex = String::with_capacity(2 * Sha256::output_size()); @@ -90,13 +100,17 @@ pub extern "C" fn kclvm_crypto_sha224( pub extern "C" fn kclvm_crypto_sha256( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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(s) = args.arg_i_str(0, None) { + + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let encoding = get_call_arg_str(args, kwargs, 1, Some("encoding")); + let bytes = encode_text(&s, encoding).unwrap(); let mut hasher = Sha256::new(); - hasher.update(&s); + hasher.update(bytes); let result = hasher.finalize(); let mut hex = String::with_capacity(2 * Sha256::output_size()); @@ -118,14 +132,17 @@ pub extern "C" fn kclvm_crypto_sha256( pub extern "C" fn kclvm_crypto_sha384( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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(s) = args.arg_i_str(0, None) { + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let encoding = get_call_arg_str(args, kwargs, 1, Some("encoding")); + let bytes = encode_text(&s, encoding).unwrap(); let mut hasher = Sha384::new(); - hasher.update(&s); + hasher.update(bytes); let result = hasher.finalize(); let mut hex = String::with_capacity(2 * Sha256::output_size()); @@ -147,13 +164,17 @@ pub extern "C" fn kclvm_crypto_sha384( pub extern "C" fn kclvm_crypto_sha512( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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(s) = args.arg_i_str(0, None) { + + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let encoding = get_call_arg_str(args, kwargs, 1, Some("encoding")); + let bytes = encode_text(&s, encoding).unwrap(); let mut hasher = Sha512::new(); - hasher.update(&s); + hasher.update(bytes); let result = hasher.finalize(); let mut hex = String::with_capacity(2 * Sha256::output_size()); @@ -175,19 +196,21 @@ pub extern "C" fn kclvm_crypto_sha512( pub extern "C" fn kclvm_crypto_blake3( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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(s) = args.arg_i_str(0, None) { - let mut hasher = blake3::Hasher::new(); - hasher.update(s.as_bytes()); - let result = hasher.finalize(); - let mut hex = String::with_capacity(2 * Sha256::output_size()); + if let Some(s) = get_call_arg_str(args, kwargs, 0, Some("value")) { + let encoding = get_call_arg_str(args, kwargs, 1, Some("encoding")); + let bytes = encode_text(&s, encoding).unwrap(); + let hasher = blake3::hash(&bytes); + + let mut hex = String::with_capacity(2 * blake3::OUT_LEN); use std::fmt::Write; - for byte in result.as_bytes() { + for byte in hasher.as_bytes() { let _ = write!(&mut hex, "{byte:02x}"); } @@ -212,11 +235,13 @@ pub extern "C" fn kclvm_crypto_uuid( pub extern "C" fn kclvm_crypto_filesha256( ctx: *mut kclvm_context_t, args: *const kclvm_value_ref_t, - _kwargs: *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(filepath) = args.arg_i_str(0, None) { + + if let Some(filepath) = get_call_arg_str(args, kwargs, 0, Some("filepath")) { // Open the file let mut file = File::open(&filepath) .unwrap_or_else(|e| panic!("failed to access file '{}': {}", filepath, e)); diff --git a/kclvm/runtime/src/encoding/mod.rs b/kclvm/runtime/src/encoding/mod.rs new file mode 100644 index 000000000..31555ed11 --- /dev/null +++ b/kclvm/runtime/src/encoding/mod.rs @@ -0,0 +1,36 @@ +use anyhow::{bail, Result}; +use encoding::{all::encodings, EncoderTrap}; + +/// Encoding string value to bytes with specific encoding format. +pub fn encode_text(value: &str, encoding: Option) -> Result> { + if let Some(encoding) = encoding { + let encoding = normalize_encoding_name(&encoding)?; + let valid_encodings = encodings(); + for valid_encoding in valid_encodings { + if valid_encoding.name() == encoding { + return valid_encoding + .encode(value, EncoderTrap::Strict) + .map_err(|e| anyhow::anyhow!(e)); + } + } + bail!("unknown encoding {encoding}") + } else { + Ok(value.as_bytes().to_vec()) + } +} + +fn normalize_encoding_name(encoding: &str) -> Result { + if let Some(i) = encoding.find(|c: char| c == ' ' || c.is_ascii_uppercase()) { + let mut out = encoding.as_bytes().to_owned(); + for byte in &mut out[i..] { + if *byte == b' ' { + *byte = b'-'; + } else { + byte.make_ascii_lowercase(); + } + } + String::from_utf8(out).map_err(|e| anyhow::anyhow!(e)) + } else { + Ok(encoding.into()) + } +} diff --git a/kclvm/runtime/src/lib.rs b/kclvm/runtime/src/lib.rs index 517a340ab..d3c630e80 100644 --- a/kclvm/runtime/src/lib.rs +++ b/kclvm/runtime/src/lib.rs @@ -86,6 +86,8 @@ mod eval; pub mod datetime; pub use self::datetime::*; +pub mod encoding; + pub mod json; pub use self::json::*; diff --git a/kclvm/sema/src/builtin/system_module.rs b/kclvm/sema/src/builtin/system_module.rs index 26de42b45..39ce9f87a 100644 --- a/kclvm/sema/src/builtin/system_module.rs +++ b/kclvm/sema/src/builtin/system_module.rs @@ -56,12 +56,6 @@ register_base64_member! { has_default: false, range: dummy_range(), }, - Parameter { - name: "encoding".to_string(), - ty: Type::str_ref(), - has_default: true, - range: dummy_range(), - }, ], r#"Decode the string `value` using the codec registered for encoding."#, false, diff --git a/kclvm/tools/src/LSP/src/state.rs b/kclvm/tools/src/LSP/src/state.rs index 6d6a3cc11..4d196f6ab 100644 --- a/kclvm/tools/src/LSP/src/state.rs +++ b/kclvm/tools/src/LSP/src/state.rs @@ -356,7 +356,6 @@ impl LanguageServerState { if let Some(workspace) = temporary_workspace.remove(&file.file_id) { let mut workspaces = self.analysis.workspaces.write(); if let Some(w) = workspace { - let mut contain = false; let opened_file = self.opened_files.read(); let contain = opened_file.values().any(|f| f.workspaces.contains(&w));