From 8c3c8d3d62df7befcc4746e50e9339062f1db7a9 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Mon, 27 Nov 2023 20:25:02 +0800 Subject: [PATCH] :zap: add ghost type timestamp --- doc/benchmark.md | 11 +++--- makefile | 4 +-- src/nasal_builtin.cpp | 75 ++++++++++++++++++++++++++++++++++++---- src/nasal_builtin.h | 5 ++- std/fg_env.nas | 4 +-- std/file.nas | 1 - std/lib.nas | 17 ++++++--- tools/compiling_test.nas | 2 +- 8 files changed, 98 insertions(+), 21 deletions(-) diff --git a/doc/benchmark.md b/doc/benchmark.md index 763a1fa..417ba72 100644 --- a/doc/benchmark.md +++ b/doc/benchmark.md @@ -113,7 +113,10 @@ In 2022/2/17 update we added `\e` into the lexer. And the `bfcolored.nas` uses t ## More Nasal Generated Pictures -|Mandelbrot Set|Mandelbrot Set|Burning Ship|Burning Ship|Feigenbaum| -|:----:|:----:|:----:|:----:|:----:| -|[mandelbrotset.nas](../test/mandelbrotset.nas)|[mandelbrotset.nas](../test/mandelbrotset.nas)|[burningship.nas](../test/burningship.nas)|[burningship.nas](../test/burningship.nas)|[feigenbaum.nas](../test/feigenbaum.nas)| -|![mandelbrotset](../doc/pic/mandelbrotset.png)|![mandelbrotset_reverse](../doc/pic/mandelbrotset_reverse.png)|![burningship](../doc/pic/burningship.png)|![burningship_reverse](../doc/pic/burningship_reverse.png)|![feigenbaum](../doc/pic/feigenbaum.png)| +|Mandelbrot Set|Mandelbrot Set|Julia Set| +|:----:|:----:|:----:| +|[mandelbrotset.nas](../test/mandelbrotset.nas)|[mandelbrotset.nas](../test/mandelbrotset.nas)|[juliaset.nas](../test/juliaset.nas)| +|![mandelbrotset](../doc/pic/mandelbrotset.png)|![mandelbrotset_reverse](../doc/pic/mandelbrotset_reverse.png)|![juliaset](../doc/pic/juliaset.png)| +|__Burning Ship__|__Burning Ship__|__Feigenbaum__| +|[burningship.nas](../test/burningship.nas)|[burningship.nas](../test/burningship.nas)|[feigenbaum.nas](../test/feigenbaum.nas)| +|![burningship](../doc/pic/burningship.png)|![burningship_reverse](../doc/pic/burningship_reverse.png)|![feigenbaum](../doc/pic/feigenbaum.png)| \ No newline at end of file diff --git a/makefile b/makefile index 404ac74..3b1fc37 100644 --- a/makefile +++ b/makefile @@ -9,7 +9,7 @@ else CXXFLAGS = -std=$(STD) -c -O3 -fno-exceptions -fPIC endif -NASAL_HEADER=\ +NASAL_HEADER = \ src/ast_dumper.h\ src/ast_visitor.h\ src/nasal_ast.h\ @@ -36,7 +36,7 @@ NASAL_HEADER=\ src/coroutine.h\ src/repl.h -NASAL_OBJECT=\ +NASAL_OBJECT = \ build/nasal_err.o\ build/nasal_ast.o\ build/ast_visitor.o\ diff --git a/src/nasal_builtin.cpp b/src/nasal_builtin.cpp index 2268adb..e3bc834 100644 --- a/src/nasal_builtin.cpp +++ b/src/nasal_builtin.cpp @@ -569,11 +569,71 @@ var builtin_md5(context* ctx, gc* ngc) { return ngc->newstr(md5(str.str())); } -var builtin_millisec(context* ctx, gc* ngc) { - f64 res = std::chrono::duration_cast - (std::chrono::high_resolution_clock::now().time_since_epoch()) - .count(); - return var::num(res); +class time_stamp { +private: + std::chrono::high_resolution_clock::time_point stamp; + +public: + time_stamp() { + stamp = std::chrono::high_resolution_clock::now(); + } + + void make_stamp() { + stamp = std::chrono::high_resolution_clock::now(); + } + + f64 elapsed_milliseconds() { + auto duration = std::chrono::high_resolution_clock::now() - stamp; + return std::chrono::duration_cast(duration).count(); + } + + f64 elapsed_microseconds() { + auto duration = std::chrono::high_resolution_clock::now() - stamp; + return std::chrono::duration_cast(duration).count(); + } +}; + +void time_stamp_destructor(void* ptr) { + delete static_cast(ptr); +} + +var builtin_maketimestamp(context* ctx, gc* ngc) { + auto res = ngc->alloc(vm_type::vm_ghost); + res.ghost().set( + "nasal-time-stamp", + time_stamp_destructor, + nullptr, + new time_stamp + ); + return res; +} + +var builtin_time_stamp(context* ctx, gc* ngc) { + auto object = ctx->localr[1]; + if (!object.object_check("nasal-time-stamp")) { + return nil; + } + auto stamp = static_cast(object.ghost().pointer); + stamp->make_stamp(); + return nil; +} + +var builtin_elapsed_millisecond(context* ctx, gc* ngc) { + auto object = ctx->localr[1]; + if (!object.object_check("nasal-time-stamp")) { + return var::num(-1); + } + auto stamp = static_cast(object.ghost().pointer); + return var::num(stamp->elapsed_milliseconds()); +} + +var builtin_elapsed_microsecond(context* ctx, gc* ngc) { + auto object = ctx->localr[1]; + if (!object.object_check("nasal-time-stamp")) { + return var::num(-1); + } + auto stamp = static_cast(object.ghost().pointer); + return var::num(stamp->elapsed_microseconds()); } var builtin_gcextend(context* ctx, gc* ngc) { @@ -684,7 +744,10 @@ nasal_builtin_table builtin[] = { {"__platform", builtin_platform}, {"__arch", builtin_arch}, {"__md5", builtin_md5}, - {"__millisec", builtin_millisec}, + {"__maketimestamp", builtin_maketimestamp}, + {"__time_stamp", builtin_time_stamp}, + {"__elapsed_millisecond", builtin_elapsed_millisecond}, + {"__elapsed_microsecond", builtin_elapsed_microsecond}, {"__gcextd", builtin_gcextend}, {"__gcinfo", builtin_gcinfo}, {"__logtime", builtin_logtime}, diff --git a/src/nasal_builtin.h b/src/nasal_builtin.h index d7c3dd5..d366879 100644 --- a/src/nasal_builtin.h +++ b/src/nasal_builtin.h @@ -69,7 +69,10 @@ var builtin_arch(context*, gc*); std::string tohex(u32); std::string md5(const std::string&); var builtin_md5(context*, gc*); -var builtin_millisec(context*, gc*); +var builtin_maketimestamp(context*, gc*); +var builtin_time_stamp(context*, gc*); +var builtin_elapsed_millisecond(context*, gc*); +var builtin_elapsed_microsecond(context*, gc*); var builtin_gcextend(context*, gc*); var builtin_gcinfo(context*, gc*); var builtin_logtime(context*, gc*); diff --git a/std/fg_env.nas b/std/fg_env.nas index bba128a..ffe40f7 100644 --- a/std/fg_env.nas +++ b/std/fg_env.nas @@ -6,8 +6,8 @@ use std.coroutine; println("-------------------------------------------------------------"); println(" FlightGear simulated-env for developers project, since 2019"); println(" Developed by:"); -println(" Sidi Liang (FGPRC-0762)"); -println(" Haokun Lee (FGPRC-0818 aka ValKmjolnir)"); +println(" Sidi762 (FGPRC-0762)"); +println(" ValKmjolnir (FGPRC-0818)"); println("-------------------------------------------------------------"); println(" See help using command line argument: --fg-env-help"); println("-------------------------------------------------------------"); diff --git a/std/file.nas b/std/file.nas index bf1d5f3..cc033fa 100644 --- a/std/file.nas +++ b/std/file.nas @@ -7,7 +7,6 @@ var SEEK_CUR = io.SEEK_CUR; var SEEK_END = io.SEEK_END; - var new = func(filename, mode="r") { if (!io.exists(filename)) { return nil; diff --git a/std/lib.nas b/std/lib.nas index fcf4139..bb2a408 100644 --- a/std/lib.nas +++ b/std/lib.nas @@ -327,11 +327,20 @@ var assert = func(condition, message = "assertion failed!") { # get time stamp, this will return a timestamp object var maketimestamp = func() { - var t = 0; + var stamp = __maketimestamp(); + var time_stamp = func(stamp) { + return __time_stamp(stamp); + } + var elapsed_millisecond = func(stamp) { + return __elapsed_millisecond(stamp); + } + var elapsed_microsecond = func(stamp) { + return __elapsed_microsecond(stamp); + } return { - stamp: func() {t = __millisec();}, - elapsedMSec: func() {return __millisec()-t;}, - elapsedUSec: func() {return (__millisec()-t)*1000;} + stamp: func() {return time_stamp(stamp);}, + elapsedMSec: func() {return elapsed_millisecond(stamp);}, + elapsedUSec: func() {return elapsed_microsecond(stamp);} }; } diff --git a/tools/compiling_test.nas b/tools/compiling_test.nas index 6409426..ad419da 100644 --- a/tools/compiling_test.nas +++ b/tools/compiling_test.nas @@ -10,7 +10,7 @@ var check = func(dir_name) { println("\e[31merror\e[0m ", f); append(res, f); } - println("compiling ", f, " in \e[32m", ts.elapsedMSec(), "\e[0m ms"); + println("compiling ", f, " in \e[32m", ts.elapsedUSec()/1000, "\e[0m ms"); } return res; }