| 2905 | } |
| 2906 | |
| 2907 | void fxFunctionExpression(txParser* parser, txInteger theLine, txSymbol** theSymbol, txUnsigned flag) |
| 2908 | { |
| 2909 | txUnsigned flags = parser->flags; |
| 2910 | parser->flags = (flags & (mxParserFlags | mxStrictFlag)) | mxFunctionFlag | mxTargetFlag | flag; |
| 2911 | if ((parser->states[0].token == XS_TOKEN_IDENTIFIER) |
| 2912 | || ((flags & mxGeneratorFlag) && !(flags & mxStrictFlag) && (parser->states[0].token == XS_TOKEN_YIELD)) |
| 2913 | || ((theSymbol == C_NULL) && (parser->states[0].token == XS_TOKEN_AWAIT))) { |
| 2914 | fxPushSymbol(parser, parser->states[0].symbol); |
| 2915 | if (theSymbol) |
| 2916 | *theSymbol = parser->states[0].symbol; |
| 2917 | fxCheckStrictSymbol(parser, parser->states[0].symbol); |
| 2918 | fxGetNextToken(parser); |
| 2919 | } |
| 2920 | else |
| 2921 | fxPushNULL(parser); |
| 2922 | fxParametersBinding(parser); |
| 2923 | if (parser->states[0].token == XS_TOKEN_HOST) { |
| 2924 | fxGetNextToken(parser); |
| 2925 | if (parser->states[0].token == XS_TOKEN_STRING) { |
| 2926 | fxPushStringNode(parser, parser->states[0].stringLength, parser->states[0].string, theLine); |
| 2927 | fxGetNextToken(parser); |
| 2928 | } |
| 2929 | else { |
| 2930 | fxReportParserError(parser, parser->states[0].line, "invalid host function"); |
| 2931 | fxPushNULL(parser); |
| 2932 | } |
| 2933 | fxPushNodeStruct(parser, 3, XS_TOKEN_HOST, theLine); |
| 2934 | parser->root->flags = parser->flags & (mxStrictFlag | mxNotSimpleParametersFlag | mxTargetFlag | mxArgumentsFlag | mxEvalFlag | flag); |
| 2935 | if (!(flags & mxStrictFlag) && (parser->flags & mxStrictFlag)) |
| 2936 | fxCheckStrictFunction(parser, (txFunctionNode*)parser->root); |
| 2937 | parser->flags = flags; |
| 2938 | } |
| 2939 | else { |
| 2940 | fxMatchToken(parser, XS_TOKEN_LEFT_BRACE); |
| 2941 | fxBody(parser); |
| 2942 | fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, theLine); |
| 2943 | fxPushNodeStruct(parser, 3, XS_TOKEN_FUNCTION, theLine); |
| 2944 | parser->root->flags = parser->flags & (mxStrictFlag | mxNotSimpleParametersFlag | mxTargetFlag | mxArgumentsFlag | mxEvalFlag | flag); |
| 2945 | if (!(flags & mxStrictFlag) && (parser->flags & mxStrictFlag)) |
| 2946 | fxCheckStrictFunction(parser, (txFunctionNode*)parser->root); |
| 2947 | if (parser->flags & mxNativeFlag) { |
| 2948 | fxCheckNativeFunction(parser); |
| 2949 | } |
| 2950 | parser->flags = flags; |
| 2951 | fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE); |
| 2952 | } |
| 2953 | } |
| 2954 | |
| 2955 | void fxGeneratorExpression(txParser* parser, txInteger theLine, txSymbol** theSymbol, txUnsigned flag) |
| 2956 | { |
no test coverage detected