|
|
@@ -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;
|
|
|
}
|