From 5c3d4ce6100293eaeffdd35e6125b0dab6820eb3 Mon Sep 17 00:00:00 2001 From: TheRealMichaelWang <44185024+TheRealMichaelWang@users.noreply.github.com> Date: Fri, 21 May 2021 21:23:39 -0700 Subject: [PATCH] fixed issue #22 --- src/io.cpp | 11 +++++++++++ src/io.h | 2 ++ src/references.cpp | 2 +- src/runtime.cpp | 3 ++- src/variables.cpp | 4 +++- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/io.cpp b/src/io.cpp index b2e0fb9..5b96d25 100644 --- a/src/io.cpp +++ b/src/io.cpp @@ -185,5 +185,16 @@ namespace fastcode { return gc->new_apartment(new value(VALUE_TYPE_NUMERICAL, new long double(1))); } + + runtime::reference_apartment* system_call(std::list args, runtime::garbage_collector* gc) { + match_arg_len(args, 1); + match_arg_type(args.front(), VALUE_TYPE_COLLECTION); + + char* command = to_c_str(args.front()); + system(command); + delete[] command; + + return gc->new_apartment(new value(VALUE_TYPE_NULL, nullptr)); + } } } \ No newline at end of file diff --git a/src/io.h b/src/io.h index d16a5ed..ac27fe4 100644 --- a/src/io.h +++ b/src/io.h @@ -16,6 +16,8 @@ namespace fastcode { runtime::reference_apartment* file_read_text(std::list args, runtime::garbage_collector* gc); runtime::reference_apartment* file_write_text(std::list args, runtime::garbage_collector* gc); + + runtime::reference_apartment* system_call(std::list args, runtime::garbage_collector* gc); } void handle_syntax_err(int syntax_error, unsigned int pos, const char* source); void handle_runtime_err(int runtime_error, parsing::token* err_tok); diff --git a/src/references.cpp b/src/references.cpp index fe3fc10..23ea300 100644 --- a/src/references.cpp +++ b/src/references.cpp @@ -53,7 +53,7 @@ namespace fastcode { } void reference_apartment::remove_reference(reference_apartment* parent) { - if (this->references == 0) + if (this->references - parent->references < 0) throw ERROR_CANNOT_DEREFERENCE; this->references -= parent->references; unsigned int children_count = 0; diff --git a/src/runtime.cpp b/src/runtime.cpp index 15a4f52..adac1e0 100644 --- a/src/runtime.cpp +++ b/src/runtime.cpp @@ -44,6 +44,7 @@ namespace fastcode { import_func("len", builtins::get_length); import_func("range", builtins::get_range); import_func("handle", builtins::get_handle); + import_func("system", builtins::system_call); import_func("read@file", builtins::file_read_text); import_func("write@file", builtins::file_write_text); import_func("count@linq", builtins::count_instances); @@ -332,7 +333,7 @@ namespace fastcode { call_stack.top()->manager->declare_var(set_tok->destination->get_identifier(), eval->get_value()); } } - } + } } else { if (eval->type == VALUE_EVAL_TYPE_REF) { diff --git a/src/variables.cpp b/src/variables.cpp index 907d175..697c051 100644 --- a/src/variables.cpp +++ b/src/variables.cpp @@ -48,7 +48,8 @@ namespace fastcode { if (parent == nullptr) hash_buckets[id_hash % VARIABLE_HASH_BUCKET_SIZE] = new variable_bucket(id_hash, reference); else - parent = new variable_bucket(id_hash, reference); + parent->next_bucket = new variable_bucket(id_hash, reference); + size++; return reference; } @@ -71,6 +72,7 @@ namespace fastcode { parent->next_bucket = bucket->next_bucket; bucket->apartment->remove_reference(); delete bucket; + size--; } bool variable_manager::has_var(unsigned long id_hash)