about summary refs log tree commit diff stats
path: root/js/scripting-lang/baba-yaga-c/src/value.c
diff options
context:
space:
mode:
Diffstat (limited to 'js/scripting-lang/baba-yaga-c/src/value.c')
-rw-r--r--js/scripting-lang/baba-yaga-c/src/value.c25
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);
     }