diff --git a/.gitignore b/.gitignore index 940719b0..62465364 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ bin/ -externLog.txt \ No newline at end of file +externLog.txt +*.memoized \ No newline at end of file diff --git a/kiss/src/kiss/KissInterp.hx b/kiss/src/kiss/KissInterp.hx index 5fdb3fd9..36a6a7f7 100644 --- a/kiss/src/kiss/KissInterp.hx +++ b/kiss/src/kiss/KissInterp.hx @@ -48,8 +48,23 @@ class KissInterp extends Interp { variables.set("kiss", {}); } + public var cacheConvertedHScript = false; + public function evalKiss(kissStr:String):Dynamic { - return evalHaxe(Prelude.convertToHScript(kissStr)); + #if !(sys || hxnodejs) + if (cacheConvertedHScript) { + throw "Cannot used cacheConvertedHScript on a non-sys target"; + } + #end + + var convert = + #if (sys || hxnodejs) + if (cacheConvertedHScript) { + Prelude.cachedConvertToHScript; + } else + #end + Prelude.convertToHScript; + return evalHaxe(convert(kissStr)); } public function evalHaxe(hscriptStr:String):Dynamic { diff --git a/kiss/src/kiss/Prelude.hx b/kiss/src/kiss/Prelude.hx index 336275bc..8fa2723a 100644 --- a/kiss/src/kiss/Prelude.hx +++ b/kiss/src/kiss/Prelude.hx @@ -506,6 +506,10 @@ class Prelude { #end } + #if (sys || hxnodejs) + public static var cachedConvertToHScript:String->String = cast(fsMemoize(convertToHScript, "convertToHScript")); + #end + public static function getTarget():KissTarget { return #if cpp Cpp; diff --git a/projects/kiss-vscode/src/ktxt2/KTxt2.kiss b/projects/kiss-vscode/src/ktxt2/KTxt2.kiss index fe3b8712..7916c296 100644 --- a/projects/kiss-vscode/src/ktxt2/KTxt2.kiss +++ b/projects/kiss-vscode/src/ktxt2/KTxt2.kiss @@ -69,6 +69,7 @@ (let [&mut sourceText "" &mut outputText "" interp (new KissInterp)] + (set interp.cacheConvertedHScript true) (doFor ktxtElement (splitFileElements fileStream) (case ktxtElement ((Block (objectWith source output))