diff --git a/README.md b/README.md
index a90f40c..f5a72e8 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,6 @@
-

[](./LICENSE)

diff --git a/doc/README_zh.md b/doc/README_zh.md
index 1e2a96b..2f655e9 100644
--- a/doc/README_zh.md
+++ b/doc/README_zh.md
@@ -2,7 +2,6 @@
-

[](../LICENSE)

diff --git a/module/fib.cpp b/module/fib.cpp
index 68e7264..d618a37 100644
--- a/module/fib.cpp
+++ b/module/fib.cpp
@@ -53,7 +53,9 @@ struct ghost_obj {
void ghost_for_test_destructor(void* ptr) {
std::cout << "ghost_for_test::destructor (0x";
std::cout << std::hex << reinterpret_cast(ptr) << std::dec << ") {\n";
+
delete static_cast(ptr);
+
std::cout << " delete 0x" << std::hex;
std::cout << reinterpret_cast(ptr) << std::dec << ";\n";
std::cout << "}\n";
@@ -62,7 +64,9 @@ void ghost_for_test_destructor(void* ptr) {
void ghost_for_test_gc_marker(void* ptr, std::vector* bfs_queue) {
std::cout << "ghost_for_test::mark (0x";
std::cout << std::hex << reinterpret_cast(ptr) << std::dec << ") {\n";
+
bfs_queue->push_back(static_cast(ptr)->test_string);
+
std::cout << " mark 0x" << std::hex;
std::cout << reinterpret_cast(ptr) << std::dec << "->test_string;\n";
std::cout << "}\n";
@@ -86,8 +90,10 @@ var set_new_ghost(var* args, usize size, gc* ngc) {
return nil;
}
f64 num = args[1].num();
+
reinterpret_cast(res.ghost().pointer)->number = static_cast(num);
std::cout << "set_new_ghost: successfully set ghost.number = " << num << "\n";
+
reinterpret_cast(res.ghost().pointer)->test_string = ngc->newstr("just for test");
std::cout << "set_new_ghost: successfully set ghost.test_string = just for test\n";
return nil;
diff --git a/src/ast_dumper.h b/src/ast_dumper.h
index e20f5c4..2049044 100644
--- a/src/ast_dumper.h
+++ b/src/ast_dumper.h
@@ -35,8 +35,7 @@ private:
std::string format_location(const span& location) {
std::stringstream ss;
ss << " -> ";
- ss << location.file << ":";
- ss << location.begin_line << ":" << location.begin_column + 1;
+ location.dump_begin(ss);
ss << "\n";
return ss.str();
}
diff --git a/src/nasal_ast.h b/src/nasal_ast.h
index 2d2a88c..3913ff9 100644
--- a/src/nasal_ast.h
+++ b/src/nasal_ast.h
@@ -8,7 +8,7 @@
namespace nasal {
-enum class expr_type: u32 {
+enum class expr_type {
ast_null = 0, // null node
ast_use, // use statement
ast_block, // code block
@@ -65,13 +65,13 @@ public:
expr(const span& location, expr_type node_type):
nd_loc(location), nd_type(node_type) {}
virtual ~expr() = default;
- void set_begin(u32 line, u32 column) {
+ void set_begin(u64 line, u64 column) {
nd_loc.begin_line = line;
nd_loc.begin_column = column;
}
- const span& get_location() const {return nd_loc;}
- const u32 get_line() const {return nd_loc.begin_line;}
- expr_type get_type() const {return nd_type;}
+ const auto& get_location() const { return nd_loc; }
+ const auto get_line() const { return nd_loc.begin_line; }
+ auto get_type() const { return nd_type; }
void update_location(const span& location) {
nd_loc.end_line = location.end_line;
nd_loc.end_column = location.end_column;
diff --git a/src/nasal_dbg.cpp b/src/nasal_dbg.cpp
index 38c9e39..0975d3b 100644
--- a/src/nasal_dbg.cpp
+++ b/src/nasal_dbg.cpp
@@ -260,7 +260,7 @@ void dbg::run(
std::vector code;
std::vector code_file_index;
std::vector code_line;
- for(auto& i : gen.codes()) {
+ for(const auto& i : gen.codes()) {
code.push_back(i.op);
code_file_index.push_back(i.fidx);
code_line.push_back(i.line);
diff --git a/src/nasal_err.cpp b/src/nasal_err.cpp
index 4f201ac..42a71d3 100644
--- a/src/nasal_err.cpp
+++ b/src/nasal_err.cpp
@@ -127,15 +127,15 @@ void error::err(
++cnt;
- std::cerr
- << red << stage << ": " << white << info << reset << "\n" << cyan << " --> "
- << red << loc.file << ":" << loc.begin_line << ":" << loc.begin_column+1
- << reset << "\n";
+ std::cerr << red << stage << ": " << white << info << reset << "\n";
+ std::cerr << cyan << " --> " << red;
+ loc.dump_begin(std::cerr);
+ std::cerr << reset << "\n";
const usize maxlen = std::to_string(loc.end_line).length();
const std::string iden = identation(maxlen);
- for(u32 line = loc.begin_line; line<=loc.end_line; ++line) {
+ for(u64 line = loc.begin_line; line<=loc.end_line; ++line) {
// skip line 0
if (!line) {
continue;
@@ -164,25 +164,25 @@ void error::err(
// output underline
std::cerr << cyan << iden << " | " << reset;
if (loc.begin_line==loc.end_line) {
- for(u32 i = 0; i toks;
- const std::unordered_map typetbl {
+ const std::unordered_map token_mapper = {
{"use" ,tok::use },
{"true" ,tok::tktrue },
{"false" ,tok::tkfalse },
diff --git a/src/nasal_opcode.h b/src/nasal_opcode.h
index 687a32c..9a3b835 100644
--- a/src/nasal_opcode.h
+++ b/src/nasal_opcode.h
@@ -101,7 +101,7 @@ struct opcode {
u8 op; // opcode
u16 fidx; // source code file index
u32 num; // immediate num
- u32 line; // location line of source code
+ u64 line; // location line of source code
opcode() = default;
opcode(const opcode&) = default;
opcode& operator=(const opcode&) = default;
diff --git a/src/nasal_parse.cpp b/src/nasal_parse.cpp
index 06e40a1..dc3b1a2 100644
--- a/src/nasal_parse.cpp
+++ b/src/nasal_parse.cpp
@@ -105,7 +105,7 @@ bool parse::check_comma(const tok* panic_set) {
}
bool parse::check_tuple() {
- u32 check_ptr=ptr, curve=1, bracket=0, brace=0;
+ u64 check_ptr = ptr, curve = 1, bracket = 0, brace = 0;
while(toks[++check_ptr].type!=tok::eof && curve) {
switch(toks[check_ptr].type) {
case tok::lcurve: ++curve; break;
@@ -157,7 +157,7 @@ bool parse::check_in_curve_multi_definition() {
bool parse::check_special_call() {
// special call means like this: function_name(a:1,b:2,c:3);
- u32 check_ptr = ptr, curve = 1, bracket = 0, brace = 0;
+ u64 check_ptr = ptr, curve = 1, bracket = 0, brace = 0;
while(toks[++check_ptr].type!=tok::eof && curve) {
switch(toks[check_ptr].type) {
case tok::lcurve: ++curve; break;
diff --git a/src/nasal_parse.h b/src/nasal_parse.h
index f662770..2d8ff27 100644
--- a/src/nasal_parse.h
+++ b/src/nasal_parse.h
@@ -15,9 +15,9 @@ class parse {
#define prevspan (ptr!=0? toks[ptr-1].loc:toks[ptr].loc)
private:
- u32 ptr;
- u32 in_func; // count function block
- u32 in_loop; // count loop block
+ u64 ptr;
+ u64 in_func; // count function block
+ u64 in_loop; // count loop block
const token* toks;
code_block* root;
error err;
diff --git a/src/nasal_vm.cpp b/src/nasal_vm.cpp
index 68f8031..496155f 100644
--- a/src/nasal_vm.cpp
+++ b/src/nasal_vm.cpp
@@ -451,7 +451,7 @@ void vm::run(
&&mcallv, &&mcallh, &&ret
};
std::vector code;
- for(auto& i : gen.codes()) {
+ for(const auto& i : gen.codes()) {
code.push_back(oprs[i.op]);
imm.push_back(i.num);
}
@@ -506,7 +506,7 @@ void vm::run(
&vm::o_ret
};
std::vector code;
- for(auto& i : gen.codes()) {
+ for(const auto& i : gen.codes()) {
code.push_back(oprs[i.op]);
imm.push_back(i.num);
}
diff --git a/src/natives/nasal_builtin.cpp b/src/natives/nasal_builtin.cpp
index 04e695b..15af44a 100644
--- a/src/natives/nasal_builtin.cpp
+++ b/src/natives/nasal_builtin.cpp
@@ -339,6 +339,7 @@ var builtin_left(context* ctx, gc* ngc) {
auto local = ctx->localr;
var str = local[1];
var len = local[2];
+
if (!str.is_str()) {
return nas_err("left", "\"string\" must be string");
}
@@ -355,20 +356,23 @@ var builtin_right(context* ctx, gc* ngc) {
auto local = ctx->localr;
var str = local[1];
var len = local[2];
+
if (!str.is_str()) {
return nas_err("right", "\"string\" must be string");
}
if (!len.is_num()) {
return nas_err("right", "\"length\" must be number");
}
+
i32 length = static_cast(len.num());
- i32 srclen = str.str().length();
+ i32 srclen = static_cast(str.str().length());
if (length>srclen) {
length = srclen;
}
if (length<0) {
length = 0;
}
+
return ngc->newstr(str.str().substr(srclen-length, srclen));
}
@@ -566,12 +570,12 @@ public:
}
f64 elapsed_milliseconds() {
- auto duration = std::chrono::high_resolution_clock::now() - stamp;
+ const 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;
+ const auto duration = std::chrono::high_resolution_clock::now() - stamp;
return std::chrono::duration_cast(duration).count();
}
};
diff --git a/src/natives/nasal_builtin.h b/src/natives/nasal_builtin.h
index 9ca7503..28674cd 100644
--- a/src/natives/nasal_builtin.h
+++ b/src/natives/nasal_builtin.h
@@ -66,10 +66,12 @@ var builtin_values(context*, gc*);
var builtin_sleep(context*, gc*);
var builtin_platform(context*, gc*);
var builtin_arch(context*, gc*);
+
// md5 related functions
std::string tohex(u32);
std::string md5(const std::string&);
var builtin_md5(context*, gc*);
+
var builtin_maketimestamp(context*, gc*);
var builtin_time_stamp(context*, gc*);
var builtin_elapsed_millisecond(context*, gc*);
diff --git a/tools/pack.py b/tools/pack.py
index 63aa477..3be7d00 100644
--- a/tools/pack.py
+++ b/tools/pack.py
@@ -4,8 +4,6 @@ import os
import platform
import shutil
-nasal_version = "11.2"
-
build_directory = pathlib.Path("build")
if not os.path.exists(build_directory):
print("pack binaries failed: build directory not found")