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