| 1508 | } |
| 1509 | |
| 1510 | void fxScopeCodingEval(txScope* self, txCoder* coder) |
| 1511 | { |
| 1512 | txProgramNode* programNode = (txProgramNode*)self->node; |
| 1513 | txDeclareNode* node; |
| 1514 | if (self->flags & mxStrictFlag) { |
| 1515 | if (programNode->scopeCount) { |
| 1516 | fxCoderAddIndex(coder, 0, XS_CODE_RESERVE_1, programNode->scopeCount); |
| 1517 | fxScopeCodingBlock(self, coder); |
| 1518 | node = self->firstDeclareNode; |
| 1519 | while (node) { |
| 1520 | if (node->description->token == XS_TOKEN_PRIVATE) { |
| 1521 | fxCoderAddSymbol(coder, 1, XS_CODE_EVAL_PRIVATE, node->symbol); |
| 1522 | fxCoderAddIndex(coder, 0, XS_CODE_CONST_CLOSURE_1, node->index); |
| 1523 | fxCoderAddByte(coder, -1, XS_CODE_POP); |
| 1524 | } |
| 1525 | node = node->nextDeclareNode; |
| 1526 | } |
| 1527 | } |
| 1528 | } |
| 1529 | else { |
| 1530 | txInteger count = 0; |
| 1531 | node = self->firstDeclareNode; |
| 1532 | while (node) { |
| 1533 | if ((node->description->token == XS_TOKEN_DEFINE) || (node->description->token == XS_TOKEN_VAR)) |
| 1534 | count++; |
| 1535 | node = node->nextDeclareNode; |
| 1536 | } |
| 1537 | if (count) { |
| 1538 | fxCoderAddIndex(coder, 0, XS_CODE_RESERVE_1, count); |
| 1539 | node = self->firstDeclareNode; |
| 1540 | while (node) { |
| 1541 | if (node->description->token == XS_TOKEN_DEFINE) { |
| 1542 | node->index = coder->scopeLevel++; |
| 1543 | fxCoderAddVariable(coder, 0, XS_CODE_NEW_LOCAL, node->symbol, node->index); |
| 1544 | fxCoderAddByte(coder, 1, XS_CODE_NULL); |
| 1545 | fxCoderAddIndex(coder, 0, XS_CODE_VAR_LOCAL_1, node->index); |
| 1546 | fxCoderAddByte(coder, -1, XS_CODE_POP); |
| 1547 | } |
| 1548 | else if (node->description->token == XS_TOKEN_VAR) { |
| 1549 | node->index = coder->scopeLevel++; |
| 1550 | fxCoderAddVariable(coder, 0, XS_CODE_NEW_LOCAL, node->symbol, node->index); |
| 1551 | fxCoderAddByte(coder, 1, XS_CODE_UNDEFINED); |
| 1552 | fxCoderAddIndex(coder, 0, XS_CODE_VAR_LOCAL_1, node->index); |
| 1553 | fxCoderAddByte(coder, -1, XS_CODE_POP); |
| 1554 | } |
| 1555 | node = node->nextDeclareNode; |
| 1556 | } |
| 1557 | } |
| 1558 | fxCoderAddByte(coder, 0, XS_CODE_EVAL_ENVIRONMENT); |
| 1559 | coder->scopeLevel = 0; |
| 1560 | if (programNode->scopeCount) { |
| 1561 | fxCoderAddIndex(coder, 0, XS_CODE_RESERVE_1, programNode->scopeCount); |
| 1562 | if (self->declareNodeCount) { |
| 1563 | node = self->firstDeclareNode; |
| 1564 | while (node) { |
| 1565 | if ((node->description->token != XS_TOKEN_DEFINE) && (node->description->token != XS_TOKEN_VAR)) { |
| 1566 | node->index = coder->scopeLevel++; |
| 1567 | if (node->flags & mxDeclareNodeClosureFlag) { |
no test coverage detected