MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / fxClassNodeCode

Function fxClassNodeCode

xs/sources/xsCode.c:2623–2746  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2621}
2622
2623void 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 }

Callers

nothing calls this directly

Calls 9

fxScopeCodingBlockFunction · 0.85
fxCoderAddByteFunction · 0.85
fxNodeDispatchCodeFunction · 0.85
fxCoderAddIndexFunction · 0.85
fxCoderAddSymbolFunction · 0.85
fxCoderAddIntegerFunction · 0.85
fxScopeCodedFunction · 0.85

Tested by

no test coverage detected