| 592 | } |
| 593 | |
| 594 | void fxPushNodeStruct(txParser* parser, txInteger count, txToken token, txInteger line) |
| 595 | { |
| 596 | const txNodeDescription* description = &gxTokenDescriptions[token]; |
| 597 | txNode* node; |
| 598 | if ((count > parser->nodeCount) || ((sizeof(txNode) + (count * sizeof(txNode*))) > (size_t)(description->size))) { |
| 599 | fxReportParserError(parser, parser->states[0].line, "invalid %s", gxTokenNames[token]); |
| 600 | } |
| 601 | node = fxNewParserChunkClear(parser, description->size); |
| 602 | node->description = description; |
| 603 | node->flags |= parser->flags & (mxStrictFlag | mxGeneratorFlag | mxAsyncFlag); |
| 604 | node->path = parser->path; |
| 605 | node->line = line; |
| 606 | parser->nodeCount -= count; |
| 607 | if (count) { |
| 608 | txNode** dst = (txNode**)&node[1]; |
| 609 | txNode* src = parser->root; |
| 610 | while (count) { |
| 611 | txNode* next = src->next; |
| 612 | src->next = NULL; |
| 613 | count--; |
| 614 | if (src->description) |
| 615 | dst[count] = src; |
| 616 | else if (src->path) |
| 617 | dst[count] = (txNode*)(src->path); |
| 618 | src = next; |
| 619 | } |
| 620 | parser->root = src; |
| 621 | } |
| 622 | fxPushNode(parser, node); |
| 623 | } |
| 624 | |
| 625 | void fxPushNodeList(txParser* parser, txInteger count) |
| 626 | { |
no test coverage detected