| 1188 | // |
| 1189 | |
| 1190 | static gpre_nod* par_field( gpre_req* request) |
| 1191 | { |
| 1192 | const gpre_sym* symbol = gpreGlob.token_global.tok_symbol; |
| 1193 | if (!symbol) |
| 1194 | CPR_s_error("qualified field reference"); |
| 1195 | |
| 1196 | bool upcase_flag = false; |
| 1197 | gpre_nod* prefix_node = 0; |
| 1198 | if (MSC_match(KW_UPPERCASE)) |
| 1199 | { |
| 1200 | prefix_node = MSC_node(nod_upcase, 1); |
| 1201 | upcase_flag = true; |
| 1202 | if (!MSC_match(KW_LEFT_PAREN)) |
| 1203 | CPR_s_error("left parenthesis"); |
| 1204 | if (!(symbol = gpreGlob.token_global.tok_symbol)) |
| 1205 | CPR_s_error("qualified field reference"); |
| 1206 | } |
| 1207 | |
| 1208 | gpre_ctx* context = 0; |
| 1209 | gpre_nod* node = 0; |
| 1210 | gpre_fld* field = 0; |
| 1211 | if (symbol->sym_type == SYM_context) |
| 1212 | { |
| 1213 | field = EXP_field(&context); |
| 1214 | if (field->fld_array_info) |
| 1215 | node = par_array(request, field, false, false); |
| 1216 | |
| 1217 | if (MSC_match(KW_DOT)) |
| 1218 | { |
| 1219 | gpre_fld* cast = EXP_cast(field); |
| 1220 | if (cast) |
| 1221 | field = cast; |
| 1222 | } |
| 1223 | } |
| 1224 | else |
| 1225 | CPR_s_error("qualified field reference"); |
| 1226 | |
| 1227 | // There is a legit field reference. If the reference is |
| 1228 | // to a field in this request, make up a reference block |
| 1229 | // and a field node, and return. |
| 1230 | |
| 1231 | if (!field->fld_array_info) |
| 1232 | node = MSC_node(nod_field, 1); |
| 1233 | |
| 1234 | if (upcase_flag) |
| 1235 | prefix_node->nod_arg[0] = node; |
| 1236 | |
| 1237 | if (context->ctx_request == request) |
| 1238 | { |
| 1239 | ref* reference = (ref*) MSC_alloc(REF_LEN); |
| 1240 | reference->ref_field = field; |
| 1241 | reference->ref_context = context; |
| 1242 | if (node->nod_type == nod_array) |
| 1243 | reference->ref_flags |= REF_array_elem; |
| 1244 | node->nod_arg[0] = (gpre_nod*) reference; |
| 1245 | } |
| 1246 | else |
| 1247 | { |
no test coverage detected