txlyre 5 小時之前
父節點
當前提交
cb11f82a41
共有 1 個文件被更改,包括 28 次插入5 次删除
  1. 28 5
      qirt.c

+ 28 - 5
qirt.c

@@ -1735,7 +1735,11 @@ leave:
 qi_value_t *qi_del(qi_state_t *state, qi_value_t *value, qi_value_t *index) {
   qi_value_t *meta;
   qi_bool fail = false;
-  if ((meta = qi_call_meta(state, &fail, value, "__del", 2, value, index)))
+  if (index == NULL) {
+    if ((meta = qi_call_meta(state, &fail, value, "__delval", 1, value)))
+      return meta;
+  }
+  else if ((meta = qi_call_meta(state, &fail, value, "__del", 2, value, index)))
     return meta;
 
   if (fail)
@@ -1743,7 +1747,13 @@ qi_value_t *qi_del(qi_state_t *state, qi_value_t *value, qi_value_t *index) {
 
   switch (value->type) {
   case QI_LIST:
-    if (index->type == QI_NUMBER) {
+    if (index == NULL) {
+      LOCKED(value, {
+        value->value.list = qi_list_resize(value->value.list, 0);
+      });
+
+      return value;
+    } else if (index->type == QI_NUMBER) {
       qi_bool res;
 
       LOCKED(value,
@@ -1758,7 +1768,17 @@ qi_value_t *qi_del(qi_state_t *state, qi_value_t *value, qi_value_t *index) {
     break;
 
   case QI_TABLE:
-    if (index->type == QI_STRING) {
+    if (index == NULL) {
+      LOCKED(value, {
+        qi_free(value->value.table.table->entries);
+
+        value->value.table.table->used = 0;
+        value->value.table.table->capacity = QI_TABLE_MIN_CAP;
+        value->value.table.table->entries = qi_calloc(value->value.table.table->capacity, sizeof(qi_table_entry_t));
+      });
+
+      return value;
+    } else if (index->type == QI_STRING) {
       qi_bool res;
 
       LOCKED(value, {
@@ -1777,8 +1797,11 @@ qi_value_t *qi_del(qi_state_t *state, qi_value_t *value, qi_value_t *index) {
   }
 
 leave:
-  qi_throw_format(state, "cannot delete index %s with %s",
-                  _qi_type(state, value), _qi_type(state, index));
+  if (index == NULL)
+    qi_throw_format(state, "cannot delete-value %s", _qi_type(state, value));
+  else
+    qi_throw_format(state, "cannot delete index %s with %s",
+                    _qi_type(state, value), _qi_type(state, index));
 
   return NULL;
 }