bool EvalContextStackFrameContainsSoft(const EvalContext *ctx, const char *context) { if (SeqLength(ctx->stack) == 0) { return false; } size_t stack_index = SeqLength(ctx->stack) - 1; return StackFrameContainsSoftRecursive(ctx, context, stack_index); }
bool StackFrameContainsSoftRecursive(const EvalContext *ctx, const char *context, size_t stack_index) { StackFrame *frame = SeqAt(ctx->stack, stack_index); if (frame->type == STACK_FRAME_TYPE_BUNDLE && StringSetContains(frame->data.bundle.contexts, context)) { return true; } else if (stack_index > 0 && frame->inherits_previous) { return StackFrameContainsSoftRecursive(ctx, context, stack_index - 1); } else { return false; } }
bool StackFrameContainsSoftRecursive(const EvalContext *ctx, const char *context, size_t stack_index) { StackFrame *frame = SeqAt(ctx->stack, stack_index); if (StringSetContains(frame->contexts, context)) { return true; } else if (stack_index > 0 && frame->inherits_previous) { return StackFrameContainsSoftRecursive(ctx, context, stack_index - 1); } else { return false; } }