Remove unneeded parameters from public interface of stack_iterate callback

This commit is contained in:
Max Brunsfeld 2017-06-29 16:43:56 -07:00
parent 009d6d1534
commit a89322c5f1
4 changed files with 52 additions and 54 deletions

View file

@ -634,10 +634,15 @@ static StackPopResult parser__reduce(Parser *self, StackVersion version,
return pop;
}
static inline const TSParseAction *parser__reductions_after_sequence(
Parser *self, TSStateId start_state, const TreeArray *trees_below,
uint32_t tree_count_below, const TreeArray *trees_above,
TSSymbol lookahead_symbol, uint32_t *count) {
static const TSParseAction *parser__reductions_after_sequence(
Parser *self,
TSStateId start_state,
const TreeArray *trees_below,
uint32_t tree_count_below,
const TreeArray *trees_above,
TSSymbol lookahead_symbol,
uint32_t *count
) {
TSStateId state = start_state;
uint32_t child_count = 0;
*count = 0;
@ -687,11 +692,10 @@ static inline const TSParseAction *parser__reductions_after_sequence(
return actions;
}
static StackIterateAction parser__repair_error_callback(
void *payload, TSStateId state, TreeArray *trees, uint32_t tree_count,
bool is_done, bool is_pending) {
ErrorRepairSession *session = (ErrorRepairSession *)payload;
static StackIterateAction parser__repair_error_callback(void *payload, TSStateId state,
const TreeArray *trees,
uint32_t tree_count) {
ErrorRepairSession *session = payload;
Parser *self = session->parser;
TSSymbol lookahead_symbol = session->lookahead_symbol;
ReduceActionSet *repairs = &self->reduce_actions;
@ -957,8 +961,7 @@ static bool parser__do_potential_reductions(Parser *self, StackVersion version)
}
static StackIterateAction parser__skip_preceding_trees_callback(
void *payload, TSStateId state, TreeArray *trees, uint32_t tree_count,
bool is_done, bool is_pending) {
void *payload, TSStateId state, const TreeArray *trees, uint32_t tree_count) {
if (tree_count > 0 && state != ERROR_STATE) {
uint32_t bytes_skipped = 0;
for (uint32_t i = 0; i < trees->size; i++) {

View file

@ -47,6 +47,11 @@ typedef struct {
bool found_valid_path;
} StackPopSession;
typedef struct {
void *payload;
StackIterateCallback callback;
} StackIterateSession;
typedef Array(StackNode *) StackNodeArray;
typedef struct {
@ -65,6 +70,8 @@ struct Stack {
StackNode *base_node;
};
typedef StackIterateAction (*StackIterateInternalCallback)(void *, const Iterator *);
static void stack_node_retain(StackNode *self) {
if (!self)
return;
@ -214,7 +221,7 @@ static void ts_stack__add_slice(Stack *self, StackNode *node, TreeArray *trees,
}
INLINE StackPopResult stack__iter(Stack *self, StackVersion version,
StackIterateCallback callback, void *payload) {
StackIterateInternalCallback callback, void *payload) {
array_clear(&self->slices);
array_clear(&self->iterators);
@ -235,17 +242,8 @@ INLINE StackPopResult stack__iter(Stack *self, StackVersion version,
for (uint32_t i = 0, size = self->iterators.size; i < size; i++) {
Iterator *iterator = &self->iterators.contents[i];
StackNode *node = iterator->node;
bool is_done = node == self->base_node;
StackIterateAction action = callback(
payload,
node->state,
&iterator->trees,
iterator->tree_count,
is_done,
iterator->is_pending
);
StackIterateAction action = callback(payload, iterator);
bool should_pop = action & StackIteratePop;
bool should_stop = action & StackIterateStop || node->link_count == 0;
@ -411,22 +409,26 @@ void ts_stack_push(Stack *self, StackVersion version, Tree *tree,
head->node = new_node;
}
StackPopResult ts_stack_iterate(Stack *self, StackVersion version,
StackIterateCallback callback, void *payload) {
return stack__iter(self, version, callback, payload);
INLINE StackIterateAction iterate_callback(void *payload, const Iterator *iterator) {
StackIterateSession *session = payload;
return session->callback(session->payload, iterator->node->state, &iterator->trees, iterator->tree_count);
}
INLINE StackIterateAction pop_count_callback(void *payload, TSStateId state,
TreeArray *trees, uint32_t tree_count,
bool is_done, bool is_pending) {
StackPopResult ts_stack_iterate(Stack *self, StackVersion version,
StackIterateCallback callback, void *payload) {
StackIterateSession session = {payload, callback};
return stack__iter(self, version, iterate_callback, &session);
}
INLINE StackIterateAction pop_count_callback(void *payload, const Iterator *iterator) {
StackPopSession *pop_session = (StackPopSession *)payload;
if (tree_count == pop_session->goal_tree_count) {
if (iterator->tree_count == pop_session->goal_tree_count) {
pop_session->found_valid_path = true;
return StackIteratePop | StackIterateStop;
}
if (state == ERROR_STATE) {
if (iterator->node->state == ERROR_STATE) {
if (pop_session->found_valid_path || pop_session->found_error) {
return StackIterateStop;
} else {
@ -466,12 +468,9 @@ StackPopResult ts_stack_pop_count(Stack *self, StackVersion version,
return pop;
}
INLINE StackIterateAction pop_pending_callback(void *payload, TSStateId state,
TreeArray *trees,
uint32_t tree_count, bool is_done,
bool is_pending) {
if (tree_count >= 1) {
if (is_pending) {
INLINE StackIterateAction pop_pending_callback(void *payload, const Iterator *iterator) {
if (iterator->tree_count >= 1) {
if (iterator->is_pending) {
return StackIteratePop | StackIterateStop;
} else {
return StackIterateStop;
@ -490,10 +489,10 @@ StackPopResult ts_stack_pop_pending(Stack *self, StackVersion version) {
return pop;
}
INLINE StackIterateAction pop_all_callback(void *payload, TSStateId state,
TreeArray *trees, uint32_t tree_count,
bool is_done, bool is_pending) {
return is_done ? (StackIteratePop | StackIterateStop) : StackIterateNone;
INLINE StackIterateAction pop_all_callback(void *payload, const Iterator *iterator) {
return iterator->node->link_count == 0 ?
(StackIteratePop | StackIterateStop) :
StackIterateNone;
}
StackPopResult ts_stack_pop_all(Stack *self, StackVersion version) {

View file

@ -12,8 +12,7 @@ extern "C" {
typedef struct Stack Stack;
typedef unsigned int StackVersion;
typedef unsigned StackVersion;
#define STACK_VERSION_NONE ((StackVersion)-1)
typedef struct {
@ -28,19 +27,16 @@ typedef struct {
StackSliceArray slices;
} StackPopResult;
typedef unsigned StackIterateAction;
enum {
StackIterateNone,
StackIterateStop = 1 << 0,
StackIteratePop = 1 << 1,
StackIterateStop = 1,
StackIteratePop = 2,
};
typedef unsigned int StackIterateAction;
typedef StackIterateAction (*StackIterateCallback)(void *, TSStateId state,
TreeArray *trees,
uint32_t tree_count,
bool is_done,
bool is_pending);
const TreeArray *trees,
uint32_t tree_count);
/*
* Create a parse stack.
@ -91,8 +87,7 @@ void ts_stack_push(Stack *, StackVersion, Tree *, bool, TSStateId);
*/
StackPopResult ts_stack_pop_count(Stack *, StackVersion, uint32_t count);
StackPopResult ts_stack_iterate(Stack *, StackVersion, StackIterateCallback,
void *);
StackPopResult ts_stack_iterate(Stack *, StackVersion, StackIterateCallback, void *);
StackPopResult ts_stack_pop_pending(Stack *, StackVersion);

View file

@ -54,11 +54,12 @@ vector<StackEntry> get_stack_entries(Stack *stack, StackVersion version) {
ts_stack_iterate(
stack,
version,
[](void *payload, TSStateId state, TreeArray *trees, uint32_t tree_count, bool is_done, bool is_pending) -> StackIterateAction {
[](void *payload, TSStateId state, const TreeArray *trees, uint32_t tree_count) -> StackIterateAction {
auto entries = static_cast<vector<StackEntry> *>(payload);
StackEntry entry = {state, tree_count};
if (find(entries->begin(), entries->end(), entry) == entries->end())
if (find(entries->begin(), entries->end(), entry) == entries->end()) {
entries->push_back(entry);
}
return StackIterateNone;
}, &result);
return result;