txlyre há 1 dia atrás
pai
commit
6e64e77ea5
1 ficheiros alterados com 24 adições e 11 exclusões
  1. 24 11
      qirt.c

+ 24 - 11
qirt.c

@@ -1643,7 +1643,7 @@ qi_bool _qi_truthy(qi_state_t *state, qi_value_t *value) {
   qi_value_t *meta;
   if ((meta = qi_call_meta(state, NULL, value, "__bool", 1, value))) {
     if (meta->type != QI_BOOLEAN)
-      qi_throw_format(state, "__qi_bool returned non-boolean value (%s)",
+      qi_throw_format(state, "__bool returned non-boolean value (%s)",
                       _qi_type(state, meta));
 
     return meta->value.boolean;
@@ -1659,11 +1659,16 @@ qi_bool _qi_truthy(qi_state_t *state, qi_value_t *value) {
   case QI_NUMBER:
     return value->value.number != 0;
 
+  case QI_TABLE: {
+    qi_bool res = false;
+    LOCKED(value, { res = qi_has_metatable(value) && qi_table_length(qi_get_metatable(value)) != 0; });
+
+    if (res) return true;
+  }
   case QI_STRING:
   case QI_BYTES:
   case QI_LIST:
   case QI_TUPLE:
-  case QI_TABLE:
     return _qi_length(state, value) != 0;
 
   default:
@@ -2094,18 +2099,26 @@ qi_value_t *qi_index_set(qi_state_t *state, qi_bool is_pf, qi_value_t *value,
   qi_value_t *meta;
   qi_bool fail = false;
 
-  if (value->type == QI_TABLE && qi_has_metatable(value) &&
-      index->type == QI_STRING &&
-      qi_table_has(qi_get_metatable(value), index->value.string)) {
-    qi_value_t *old;
+  if (value->type == QI_TABLE && index->type == QI_STRING) {
+    qi_bool has_mt = false;
+
+    LOCKED(value, { has_mt = qi_has_metatable(value) && qi_table_has(qi_get_metatable(value), index->value.string); });
 
-    if (!is_pf)
-      old = qi_table_get(qi_get_metatable(value), index->value.string);
+    if (has_mt) {
+      qi_value_t *old;
 
-    qi_table_set(qi_get_metatable(value), index->value.string, newvalue);
+      LOCKED(value, {
+        if (!is_pf)
+          old = qi_table_get(qi_get_metatable(value), index->value.string);
+
+        qi_table_set(qi_get_metatable(value), index->value.string, newvalue);
+      });
+
+      return !is_pf && old ? old : newvalue;
+    }
+  }
 
-    return !is_pf && old ? old : newvalue;
-  } else if ((meta = qi_call_meta(state, &fail, value, "__index_set", 3, value,
+  if ((meta = qi_call_meta(state, &fail, value, "__index_set", 3, value,
                                   index, newvalue)))
     return meta;