diff options
Diffstat (limited to 'js/scripting-lang/baba-yaga-c/src/value.c')
-rw-r--r-- | js/scripting-lang/baba-yaga-c/src/value.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/js/scripting-lang/baba-yaga-c/src/value.c b/js/scripting-lang/baba-yaga-c/src/value.c index 42b033c..562f3a7 100644 --- a/js/scripting-lang/baba-yaga-c/src/value.c +++ b/js/scripting-lang/baba-yaga-c/src/value.c @@ -86,6 +86,8 @@ Value baba_yaga_value_copy(const Value* value) { return baba_yaga_value_nil(); } + DEBUG_DEBUG("baba_yaga_value_copy: copying value with type %d", value->type); + switch (value->type) { case VAL_NUMBER: return baba_yaga_value_number(value->data.number); @@ -99,9 +101,22 @@ Value baba_yaga_value_copy(const Value* value) { return baba_yaga_value_nil(); } - /* Copy all entries from the original table */ - /* This is a simplified copy - in practice we'd need to iterate through all entries */ - table_increment_ref(&new_table); + /* Copy all entries from the original table using the public API */ + size_t old_size = baba_yaga_table_size(value); + if (old_size > 0) { + /* Get all keys from the original table */ + char* keys[100]; /* Assume max 100 keys */ + size_t key_count = baba_yaga_table_get_keys(value, keys, 100); + + /* Copy each key-value pair */ + for (size_t i = 0; i < key_count; i++) { + Value old_value = baba_yaga_table_get(value, keys[i]); + new_table = baba_yaga_table_set(&new_table, keys[i], &old_value); + baba_yaga_value_destroy(&old_value); + free(keys[i]); + } + } + return new_table; } case VAL_FUNCTION: { @@ -157,11 +172,11 @@ char* baba_yaga_value_to_string(const Value* value) { switch (value->type) { case VAL_NUMBER: { - char buffer[64]; + char buffer[128]; if (value->data.number == (long)value->data.number) { snprintf(buffer, sizeof(buffer), "%ld", (long)value->data.number); } else { - snprintf(buffer, sizeof(buffer), "%.15g", value->data.number); + snprintf(buffer, sizeof(buffer), "%.16g", value->data.number); } return strdup(buffer); } |