builtin_commandline_scoped_transient_t::~builtin_commandline_scoped_transient_t() {
    ASSERT_IS_MAIN_THREAD();
    scoped_lock locker(transient_commandline_lock);
    wcstring_list_t *stack = get_transient_stack();
    assert(this->token == stack->size());
    stack->pop_back();
}
builtin_commandline_scoped_transient_t::builtin_commandline_scoped_transient_t(
    const wcstring &cmd) {
    ASSERT_IS_MAIN_THREAD();
    auto stack = get_transient_stack().acquire();
    stack->push_back(cmd);
    this->token = stack->size();
}
builtin_commandline_scoped_transient_t::~builtin_commandline_scoped_transient_t() {
    ASSERT_IS_MAIN_THREAD();
    auto locked = get_transient_stack().acquire();
    wcstring_list_t &stack = locked.value;
    assert(this->token == stack.size());
    stack.pop_back();
}
builtin_commandline_scoped_transient_t::builtin_commandline_scoped_transient_t(const wcstring &cmd)
{
    ASSERT_IS_MAIN_THREAD();
    scoped_lock locker(transient_commandline_lock);
    wcstring_list_t *stack = get_transient_stack();
    stack->push_back(cmd);
    this->token = stack->size();
}
static bool get_top_transient(wcstring *out_result) {
    auto stack = get_transient_stack().acquire();
    if (stack->empty()) {
        return false;
    }
    out_result->assign(stack->back());
    return true;
}
builtin_commandline_scoped_transient_t::builtin_commandline_scoped_transient_t(
    const wcstring &cmd) {
    ASSERT_IS_MAIN_THREAD();
    auto locked = get_transient_stack().acquire();
    wcstring_list_t &stack = locked.value;
    stack.push_back(cmd);
    this->token = stack.size();
}
static bool get_top_transient(wcstring *out_result) {
    auto locked = get_transient_stack().acquire();
    wcstring_list_t &stack = locked.value;
    if (stack.empty()) {
        return false;
    }
    out_result->assign(stack.back());
    return true;
}
static bool get_top_transient(wcstring *out_result) {
    ASSERT_IS_MAIN_THREAD();
    bool result = false;
    scoped_lock locker(transient_commandline_lock);
    const wcstring_list_t *stack = get_transient_stack();
    if (!stack->empty()) {
        out_result->assign(stack->back());
        result = true;
    }
    return result;
}
builtin_commandline_scoped_transient_t::~builtin_commandline_scoped_transient_t() {
    ASSERT_IS_MAIN_THREAD();
    auto stack = get_transient_stack().acquire();
    assert(this->token == stack->size());
    stack->pop_back();
}