| 1632 | } |
| 1633 | |
| 1634 | void fxScopeCodingProgram(txScope* self, txCoder* coder) |
| 1635 | { |
| 1636 | txProgramNode* programNode = (txProgramNode*)self->node; |
| 1637 | txDeclareNode* node; |
| 1638 | txInteger count = 0; |
| 1639 | if (programNode->variableCount) { |
| 1640 | fxCoderAddIndex(coder, 0, XS_CODE_RESERVE_1, programNode->variableCount); |
| 1641 | node = self->firstDeclareNode; |
| 1642 | while (node) { |
| 1643 | if ((node->description->token != XS_TOKEN_DEFINE) && (node->description->token != XS_TOKEN_VAR)) { |
| 1644 | node->index = coder->scopeLevel++; |
| 1645 | fxCoderAddVariable(coder, 0, XS_CODE_NEW_CLOSURE, node->symbol, node->index); |
| 1646 | } |
| 1647 | node = node->nextDeclareNode; |
| 1648 | } |
| 1649 | count = coder->scopeLevel; |
| 1650 | node = self->firstDeclareNode; |
| 1651 | while (node) { |
| 1652 | if (node->description->token == XS_TOKEN_DEFINE) { |
| 1653 | // closure -> global property |
| 1654 | node->index = coder->scopeLevel++; |
| 1655 | fxCoderAddVariable(coder, 0, XS_CODE_NEW_LOCAL, node->symbol, node->index); |
| 1656 | fxCoderAddByte(coder, 1, XS_CODE_NULL); |
| 1657 | fxCoderAddIndex(coder, 0, XS_CODE_VAR_LOCAL_1, node->index); |
| 1658 | fxCoderAddByte(coder, -1, XS_CODE_POP); |
| 1659 | } |
| 1660 | else if (node->description->token == XS_TOKEN_VAR) { |
| 1661 | // closure -> global property |
| 1662 | node->index = coder->scopeLevel++; |
| 1663 | fxCoderAddVariable(coder, 0, XS_CODE_NEW_LOCAL, node->symbol, node->index); |
| 1664 | fxCoderAddByte(coder, 1, XS_CODE_UNDEFINED); |
| 1665 | fxCoderAddIndex(coder, 0, XS_CODE_VAR_LOCAL_1, node->index); |
| 1666 | fxCoderAddByte(coder, -1, XS_CODE_POP); |
| 1667 | } |
| 1668 | node = node->nextDeclareNode; |
| 1669 | } |
| 1670 | fxCoderAddByte(coder, 0, XS_CODE_PROGRAM_ENVIRONMENT); |
| 1671 | coder->scopeLevel = count; |
| 1672 | } |
| 1673 | if (programNode->scopeCount > count) |
| 1674 | fxCoderAddIndex(coder, 0, XS_CODE_RESERVE_1, programNode->scopeCount - count); |
| 1675 | } |
| 1676 | |
| 1677 | void fxScopeCodeDefineNodes(txScope* self, txCoder* coder) |
| 1678 | { |
no test coverage detected