add ghost type timestamp

This commit is contained in:
ValKmjolnir 2023-11-27 20:25:02 +08:00
parent 2bb9655422
commit 8c3c8d3d62
8 changed files with 98 additions and 21 deletions

View File

@ -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)|

View File

@ -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\

View File

@ -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::milliseconds>
(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<std::chrono::milliseconds>(duration).count();
}
f64 elapsed_microseconds() {
auto duration = std::chrono::high_resolution_clock::now() - stamp;
return std::chrono::duration_cast<std::chrono::microseconds>(duration).count();
}
};
void time_stamp_destructor(void* ptr) {
delete static_cast<time_stamp*>(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<time_stamp*>(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<time_stamp*>(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<time_stamp*>(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},

View File

@ -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*);

View File

@ -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("-------------------------------------------------------------");

View File

@ -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;

View File

@ -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);}
};
}

View File

@ -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;
}