|
@@ -610,14 +610,14 @@ static void qi_scope_run_defers(qi_state_t *state, qi_scope_t *scope) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-bool qi_old_scope(qi_state_t *state) {
|
|
|
|
|
|
+static bool _qi_old_scope(qi_state_t *state, bool ignore_barriers) {
|
|
qi_scope_t *scope;
|
|
qi_scope_t *scope;
|
|
|
|
|
|
if (qi_list_empty(state->scopes))
|
|
if (qi_list_empty(state->scopes))
|
|
return false;
|
|
return false;
|
|
|
|
|
|
scope = qi_list_last(state->scopes);
|
|
scope = qi_list_last(state->scopes);
|
|
- if (scope->is_barrier)
|
|
|
|
|
|
+ if (!ignore_barriers && scope->is_barrier)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
qi_scope_run_defers(state, scope);
|
|
qi_scope_run_defers(state, scope);
|
|
@@ -627,6 +627,10 @@ bool qi_old_scope(qi_state_t *state) {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool qi_old_scope(qi_state_t *state) {
|
|
|
|
+ return _qi_old_scope(state, false);
|
|
|
|
+}
|
|
|
|
+
|
|
qi_value_t *qi_call_meta(qi_state_t *state, bool *fail_flag, qi_value_t *value,
|
|
qi_value_t *qi_call_meta(qi_state_t *state, bool *fail_flag, qi_value_t *value,
|
|
char *name, qi_size_t count, ...);
|
|
char *name, qi_size_t count, ...);
|
|
|
|
|
|
@@ -2868,14 +2872,7 @@ static qi_state_t *qi_state_clone(qi_state_t *state) {
|
|
}
|
|
}
|
|
|
|
|
|
void qi_exit(qi_state_t *state, int code) {
|
|
void qi_exit(qi_state_t *state, int code) {
|
|
- qi_ssize_t scopes_count = qi_list_length(state->scopes);
|
|
|
|
-
|
|
|
|
- if (scopes_count > 1)
|
|
|
|
- for (qi_ssize_t i = scopes_count - 1; i >= 0; i--) {
|
|
|
|
- qi_scope_t *scope = qi_list_index(state->scopes, i);
|
|
|
|
-
|
|
|
|
- qi_scope_run_defers(state, scope);
|
|
|
|
- }
|
|
|
|
|
|
+ while (_qi_old_scope(state, true)) ;
|
|
|
|
|
|
qi_finalize();
|
|
qi_finalize();
|
|
|
|
|