File tree Expand file tree Collapse file tree 5 files changed +19
-3
lines changed Expand file tree Collapse file tree 5 files changed +19
-3
lines changed Original file line number Diff line number Diff line change @@ -185,5 +185,16 @@ namespace fastcode {
185
185
186
186
return gc->new_apartment (new value (VALUE_TYPE_NUMERICAL, new long double (1 )));
187
187
}
188
+
189
+ runtime::reference_apartment* system_call (std::list<value*> args, runtime::garbage_collector* gc) {
190
+ match_arg_len (args, 1 );
191
+ match_arg_type (args.front (), VALUE_TYPE_COLLECTION);
192
+
193
+ char * command = to_c_str (args.front ());
194
+ system (command);
195
+ delete[] command;
196
+
197
+ return gc->new_apartment (new value (VALUE_TYPE_NULL, nullptr ));
198
+ }
188
199
}
189
200
}
Original file line number Diff line number Diff line change @@ -16,6 +16,8 @@ namespace fastcode {
16
16
17
17
runtime::reference_apartment* file_read_text (std::list<value*> args, runtime::garbage_collector* gc);
18
18
runtime::reference_apartment* file_write_text (std::list<value*> args, runtime::garbage_collector* gc);
19
+
20
+ runtime::reference_apartment* system_call (std::list<value*> args, runtime::garbage_collector* gc);
19
21
}
20
22
void handle_syntax_err (int syntax_error, unsigned int pos, const char * source);
21
23
void handle_runtime_err (int runtime_error, parsing::token* err_tok);
Original file line number Diff line number Diff line change @@ -53,7 +53,7 @@ namespace fastcode {
53
53
}
54
54
55
55
void reference_apartment::remove_reference (reference_apartment* parent) {
56
- if (this ->references == 0 )
56
+ if (this ->references - parent-> references < 0 )
57
57
throw ERROR_CANNOT_DEREFERENCE;
58
58
this ->references -= parent->references ;
59
59
unsigned int children_count = 0 ;
Original file line number Diff line number Diff line change @@ -44,6 +44,7 @@ namespace fastcode {
44
44
import_func (" len" , builtins::get_length);
45
45
import_func (" range" , builtins::get_range);
46
46
import_func (" handle" , builtins::get_handle);
47
+ import_func (" system" , builtins::system_call);
47
48
import_func (" read@file" , builtins::file_read_text);
48
49
import_func (" write@file" , builtins::file_write_text);
49
50
import_func (" count@linq" , builtins::count_instances);
@@ -332,7 +333,7 @@ namespace fastcode {
332
333
call_stack.top ()->manager ->declare_var (set_tok->destination ->get_identifier (), eval->get_value ());
333
334
}
334
335
}
335
- }
336
+ }
336
337
}
337
338
else {
338
339
if (eval->type == VALUE_EVAL_TYPE_REF) {
Original file line number Diff line number Diff line change @@ -48,7 +48,8 @@ namespace fastcode {
48
48
if (parent == nullptr )
49
49
hash_buckets[id_hash % VARIABLE_HASH_BUCKET_SIZE] = new variable_bucket (id_hash, reference);
50
50
else
51
- parent = new variable_bucket (id_hash, reference);
51
+ parent->next_bucket = new variable_bucket (id_hash, reference);
52
+ size++;
52
53
return reference;
53
54
}
54
55
@@ -71,6 +72,7 @@ namespace fastcode {
71
72
parent->next_bucket = bucket->next_bucket ;
72
73
bucket->apartment ->remove_reference ();
73
74
delete bucket;
75
+ size--;
74
76
}
75
77
76
78
bool variable_manager::has_var (unsigned long id_hash)
You can’t perform that action at this time.
0 commit comments