| 2621 | } |
| 2622 | |
| 2623 | void fxClassNodeCode(void* it, void* param) |
| 2624 | { |
| 2625 | txClassNode* self = it; |
| 2626 | txCoder* coder = param; |
| 2627 | txClassNode* former = coder->classNode; |
| 2628 | txFlag flag; |
| 2629 | txInteger prototype = fxCoderUseTemporaryVariable(coder); |
| 2630 | txInteger constructor = fxCoderUseTemporaryVariable(coder); |
| 2631 | txDeclareNode* declaration = self->scope->firstDeclareNode; |
| 2632 | txNode* item = self->items->first; |
| 2633 | if (self->symbol) |
| 2634 | fxScopeCodingBlock(self->symbolScope, param); |
| 2635 | if (self->heritage) { |
| 2636 | if (self->heritage->description->token == XS_TOKEN_HOST) { |
| 2637 | fxCoderAddByte(param, 1, XS_CODE_NULL); |
| 2638 | fxNodeDispatchCode(self->heritage, param); |
| 2639 | } |
| 2640 | else { |
| 2641 | fxNodeDispatchCode(self->heritage, param); |
| 2642 | fxCoderAddByte(param, 1, XS_CODE_EXTEND); |
| 2643 | } |
| 2644 | } |
| 2645 | else { |
| 2646 | fxCoderAddByte(param, 1, XS_CODE_NULL); |
| 2647 | fxCoderAddByte(param, 1, XS_CODE_OBJECT); |
| 2648 | } |
| 2649 | fxCoderAddIndex(param, 0, XS_CODE_SET_LOCAL_1, prototype); |
| 2650 | fxScopeCodingBlock(self->scope, param); |
| 2651 | |
| 2652 | coder->classNode = self; |
| 2653 | fxNodeDispatchCode(self->constructor, param); |
| 2654 | |
| 2655 | fxCoderAddByte(param, 0, XS_CODE_TO_INSTANCE); |
| 2656 | fxCoderAddIndex(param, 0, XS_CODE_SET_LOCAL_1, constructor); |
| 2657 | fxCoderAddByte(param, -3, XS_CODE_CLASS); |
| 2658 | fxCoderAddIndex(param, 1, XS_CODE_GET_LOCAL_1, constructor); |
| 2659 | if (self->symbol) |
| 2660 | fxCoderAddSymbol(param, 0, XS_CODE_NAME, self->symbol); |
| 2661 | |
| 2662 | while (item) { |
| 2663 | if (item->description->token == XS_TOKEN_PROPERTY) { |
| 2664 | txPropertyNode* property = (txPropertyNode*)item; |
| 2665 | if (item->flags & (mxMethodFlag | mxGetterFlag | mxSetterFlag)) { |
| 2666 | if (item->flags & mxStaticFlag) |
| 2667 | fxCoderAddByte(param, 1, XS_CODE_DUB); |
| 2668 | else |
| 2669 | fxCoderAddIndex(param, 1, XS_CODE_GET_LOCAL_1, prototype); |
| 2670 | fxNodeDispatchCode(property->value, param); |
| 2671 | fxCoderAddSymbol(param, -2, XS_CODE_NEW_PROPERTY, property->symbol); |
| 2672 | flag = XS_DONT_ENUM_FLAG; |
| 2673 | if (item->flags & mxMethodFlag) |
| 2674 | flag |= XS_NAME_FLAG | XS_METHOD_FLAG; |
| 2675 | else if (item->flags & mxGetterFlag) |
| 2676 | flag |= XS_NAME_FLAG | XS_METHOD_FLAG | XS_GETTER_FLAG; |
| 2677 | else if (item->flags & mxSetterFlag) |
| 2678 | flag |= XS_NAME_FLAG | XS_METHOD_FLAG | XS_SETTER_FLAG; |
| 2679 | fxCoderAddInteger(param, 0, XS_CODE_INTEGER_1, flag); |
| 2680 | } |
nothing calls this directly
no test coverage detected