set up so reusing scope when in a loop
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
let i = 10000000
|
let i = 1e7
|
||||||
while (i) do
|
while (i) do
|
||||||
i=i-1
|
i=i-1
|
||||||
@@ -21,9 +21,16 @@ struct hashmap_GC *createHashmap_GC() {
|
|||||||
t->order = 1;
|
t->order = 1;
|
||||||
t->list = (struct node_GC **)ar_alloc(sizeof(struct node_GC *) * size);
|
t->list = (struct node_GC **)ar_alloc(sizeof(struct node_GC *) * size);
|
||||||
memset(t->list, 0, sizeof(struct node_GC *) * size);
|
memset(t->list, 0, sizeof(struct node_GC *) * size);
|
||||||
|
t->count = 0;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear_hashmap_GC(struct hashmap_GC *t) {
|
||||||
|
t->order = 1;
|
||||||
|
t->count = 0;
|
||||||
|
memset(t->list, 0, sizeof(struct node_GC *) * t->size);
|
||||||
|
}
|
||||||
|
|
||||||
void resize_hashmap_GC(struct hashmap_GC *t) {
|
void resize_hashmap_GC(struct hashmap_GC *t) {
|
||||||
int old_size = t->size;
|
int old_size = t->size;
|
||||||
int new_size = old_size * 2;
|
int new_size = old_size * 2;
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ struct hashmap_GC {
|
|||||||
|
|
||||||
struct hashmap_GC *createHashmap_GC();
|
struct hashmap_GC *createHashmap_GC();
|
||||||
|
|
||||||
|
void clear_hashmap_GC(struct hashmap_GC *t);
|
||||||
|
|
||||||
int hashCode_GC(struct hashmap_GC *t, uint64_t hash);
|
int hashCode_GC(struct hashmap_GC *t, uint64_t hash);
|
||||||
|
|
||||||
int hashmap_remove_GC(struct hashmap_GC *t, uint64_t hash);
|
int hashmap_remove_GC(struct hashmap_GC *t, uint64_t hash);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const char *built_in_field_names[BUILT_IN_FIELDS_COUNT] = {
|
|||||||
"__string__", "__subtract__", "__multiply__", "__division__",
|
"__string__", "__subtract__", "__multiply__", "__division__",
|
||||||
"__new__", "__init__", "__boolean__", "__get_attr__",
|
"__new__", "__init__", "__boolean__", "__get_attr__",
|
||||||
"__binding__", "__function__", "address", "__call__",
|
"__binding__", "__function__", "address", "__call__",
|
||||||
"__number__", "log"};
|
"__number__", "log", "length"};
|
||||||
|
|
||||||
uint64_t built_in_field_hashes[BUILT_IN_FIELDS_COUNT];
|
uint64_t built_in_field_hashes[BUILT_IN_FIELDS_COUNT];
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ typedef enum {
|
|||||||
__call__,
|
__call__,
|
||||||
__number__,
|
__number__,
|
||||||
field_log,
|
field_log,
|
||||||
|
field_length,
|
||||||
BUILT_IN_FIELDS_COUNT
|
BUILT_IN_FIELDS_COUNT
|
||||||
} built_in_fields;
|
} built_in_fields;
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ ArgonObject *new_string_object(char *data, size_t length, uint64_t prehash,
|
|||||||
uint64_t hash) {
|
uint64_t hash) {
|
||||||
ArgonObject *object = new_object();
|
ArgonObject *object = new_object();
|
||||||
add_builtin_field(object, __class__, ARGON_STRING_TYPE);
|
add_builtin_field(object, __class__, ARGON_STRING_TYPE);
|
||||||
add_builtin_field(object, length,
|
add_builtin_field(object, field_length,
|
||||||
new_number_object_from_num_and_den(length, 1));
|
new_number_object_from_num_and_den(length, 1));
|
||||||
object->type = TYPE_STRING;
|
object->type = TYPE_STRING;
|
||||||
object->value.as_str.data = ar_alloc_atomic(length);
|
object->value.as_str.data = ar_alloc_atomic(length);
|
||||||
|
|||||||
@@ -683,6 +683,7 @@ static inline void run_instructions(Translated *translated, RuntimeState *state,
|
|||||||
[OP_JUMP_IF_FALSE] = &&DO_JUMP_IF_FALSE,
|
[OP_JUMP_IF_FALSE] = &&DO_JUMP_IF_FALSE,
|
||||||
[OP_JUMP] = &&DO_JUMP,
|
[OP_JUMP] = &&DO_JUMP,
|
||||||
[OP_NEW_SCOPE] = &&DO_NEW_SCOPE,
|
[OP_NEW_SCOPE] = &&DO_NEW_SCOPE,
|
||||||
|
[OP_EMPTY_SCOPE] = &&DO_EMPTY_SCOPE,
|
||||||
[OP_POP_SCOPE] = &&DO_POP_SCOPE,
|
[OP_POP_SCOPE] = &&DO_POP_SCOPE,
|
||||||
[OP_INIT_CALL] = &&DO_INIT_CALL,
|
[OP_INIT_CALL] = &&DO_INIT_CALL,
|
||||||
[OP_INSERT_ARG] = &&DO_INSERT_ARG,
|
[OP_INSERT_ARG] = &&DO_INSERT_ARG,
|
||||||
@@ -745,6 +746,9 @@ DO_JUMP:
|
|||||||
DO_NEW_SCOPE:
|
DO_NEW_SCOPE:
|
||||||
*stack = create_scope(*stack);
|
*stack = create_scope(*stack);
|
||||||
goto START;
|
goto START;
|
||||||
|
DO_EMPTY_SCOPE:
|
||||||
|
clear_hashmap_GC((*stack)->scope);
|
||||||
|
goto START;
|
||||||
DO_POP_SCOPE:
|
DO_POP_SCOPE:
|
||||||
*stack = (*stack)->prev;
|
*stack = (*stack)->prev;
|
||||||
goto START;
|
goto START;
|
||||||
|
|||||||
@@ -93,6 +93,10 @@ jumps unconditionally to an index.
|
|||||||
|
|
||||||
creates a new stack
|
creates a new stack
|
||||||
|
|
||||||
|
## OP_EMPTY_SCOPE
|
||||||
|
|
||||||
|
empties the current scope so the same memory can be reused.
|
||||||
|
|
||||||
## OP_POP_SCOPE
|
## OP_POP_SCOPE
|
||||||
|
|
||||||
pops the top scope off the current
|
pops the top scope off the current
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ typedef enum {
|
|||||||
OP_JUMP_IF_FALSE,
|
OP_JUMP_IF_FALSE,
|
||||||
OP_JUMP,
|
OP_JUMP,
|
||||||
OP_NEW_SCOPE,
|
OP_NEW_SCOPE,
|
||||||
|
OP_EMPTY_SCOPE,
|
||||||
OP_POP_SCOPE,
|
OP_POP_SCOPE,
|
||||||
OP_INIT_CALL,
|
OP_INIT_CALL,
|
||||||
OP_INSERT_ARG,
|
OP_INSERT_ARG,
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ size_t translate_parsed_while(Translated *translated, ParsedWhile *parsedWhile,
|
|||||||
translated->return_jumps = &return_jumps;
|
translated->return_jumps = &return_jumps;
|
||||||
}
|
}
|
||||||
size_t first = push_instruction_byte(translated, OP_NEW_SCOPE);
|
size_t first = push_instruction_byte(translated, OP_NEW_SCOPE);
|
||||||
translate_parsed(translated, parsedWhile->condition, err);
|
size_t start_of_loop = translate_parsed(translated, parsedWhile->condition, err);
|
||||||
if (err->exists) {
|
if (err->exists) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -28,9 +28,9 @@ size_t translate_parsed_while(Translated *translated, ParsedWhile *parsedWhile,
|
|||||||
push_instruction_byte(translated, 0);
|
push_instruction_byte(translated, 0);
|
||||||
uint64_t jump_index = push_instruction_code(translated, 0);
|
uint64_t jump_index = push_instruction_code(translated, 0);
|
||||||
translate_parsed(translated, parsedWhile->content, err);
|
translate_parsed(translated, parsedWhile->content, err);
|
||||||
push_instruction_byte(translated, OP_POP_SCOPE);
|
push_instruction_byte(translated, OP_EMPTY_SCOPE);
|
||||||
push_instruction_byte(translated, OP_JUMP);
|
push_instruction_byte(translated, OP_JUMP);
|
||||||
push_instruction_code(translated, first);
|
push_instruction_code(translated, start_of_loop);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user