| 3374 | } |
| 3375 | |
| 3376 | void fxFunctionNodeCode(void* it, void* param) |
| 3377 | { |
| 3378 | txFunctionNode* self = it; |
| 3379 | txCoder* coder = param; |
| 3380 | txInteger environmentLevel = coder->environmentLevel; |
| 3381 | txBoolean evalFlag = coder->evalFlag; |
| 3382 | txInteger line = coder->line; |
| 3383 | txBoolean programFlag = coder->programFlag; |
| 3384 | txInteger scopeLevel = coder->scopeLevel; |
| 3385 | txTargetCode* firstBreakTarget = coder->firstBreakTarget; |
| 3386 | txTargetCode* firstContinueTarget = coder->firstContinueTarget; |
| 3387 | txTargetCode* returnTarget = coder->returnTarget; |
| 3388 | txSymbol* name = self->symbol; |
| 3389 | txTargetCode* target = fxCoderCreateTarget(param); |
| 3390 | |
| 3391 | if ((self->flags & mxEvalFlag) && !(self->flags & mxStrictFlag)) |
| 3392 | coder->evalFlag = 1; |
| 3393 | coder->line = -1; |
| 3394 | coder->programFlag = 0; |
| 3395 | coder->scopeLevel = 0; |
| 3396 | coder->firstBreakTarget = NULL; |
| 3397 | coder->firstContinueTarget = NULL; |
| 3398 | |
| 3399 | if (name) { |
| 3400 | if (self->flags & mxGetterFlag) { |
| 3401 | txString buffer = coder->parser->buffer; |
| 3402 | c_strcpy(buffer, "get "); |
| 3403 | c_strcat(buffer, name->string); |
| 3404 | name = fxNewParserSymbol(coder->parser, buffer); |
| 3405 | } |
| 3406 | else if (self->flags & mxSetterFlag) { |
| 3407 | txString buffer = coder->parser->buffer; |
| 3408 | c_strcpy(buffer, "set "); |
| 3409 | c_strcat(buffer, name->string); |
| 3410 | name = fxNewParserSymbol(coder->parser, buffer); |
| 3411 | } |
| 3412 | } |
| 3413 | |
| 3414 | if (self->flags & mxAsyncFlag) { |
| 3415 | if (self->flags & mxGeneratorFlag) |
| 3416 | fxCoderAddSymbol(param, 1, XS_CODE_ASYNC_GENERATOR_FUNCTION, name); |
| 3417 | else |
| 3418 | fxCoderAddSymbol(param, 1, XS_CODE_ASYNC_FUNCTION, name); |
| 3419 | } |
| 3420 | else if (self->flags & mxGeneratorFlag) |
| 3421 | fxCoderAddSymbol(param, 1, XS_CODE_GENERATOR_FUNCTION, name); |
| 3422 | else if (self->flags & (mxArrowFlag | mxMethodFlag | mxGetterFlag | mxSetterFlag)) |
| 3423 | fxCoderAddSymbol(param, 1, XS_CODE_FUNCTION, name); |
| 3424 | else |
| 3425 | fxCoderAddSymbol(param, 1, XS_CODE_CONSTRUCTOR_FUNCTION, name); |
| 3426 | if (coder->parser->flags & mxDebugFlag) |
| 3427 | fxCoderAddByte(param, 0, XS_CODE_PROFILE); |
| 3428 | fxCoderAddBranch(param, 0, XS_CODE_CODE_1, target); |
| 3429 | if (self->flags & mxFieldFlag) |
| 3430 | fxCoderAddIndex(param, 0, XS_CODE_BEGIN_STRICT_FIELD, fxCoderCountParameters(coder, self->params)); |
| 3431 | else if (self->flags & mxDerivedFlag) |
| 3432 | fxCoderAddIndex(param, 0, XS_CODE_BEGIN_STRICT_DERIVED, fxCoderCountParameters(coder, self->params)); |
| 3433 | else if (self->flags & mxBaseFlag) |
nothing calls this directly
no test coverage detected