| 1955 | // |
| 1956 | |
| 1957 | static act* par_end_store(bool special) |
| 1958 | { |
| 1959 | if (!cur_store) |
| 1960 | PAR_error("unmatched END_STORE"); |
| 1961 | |
| 1962 | PAR_end(); |
| 1963 | |
| 1964 | act* begin_action = (act*) MSC_pop(&cur_store); |
| 1965 | gpre_req* request = begin_action->act_request; |
| 1966 | |
| 1967 | if (request->req_type == REQ_store) |
| 1968 | { |
| 1969 | if (gpreGlob.errors_global) |
| 1970 | return NULL; |
| 1971 | |
| 1972 | // Make up an assignment list for all field references |
| 1973 | |
| 1974 | int count = 0; |
| 1975 | for (ref* reference = request->req_references; reference; reference = reference->ref_next) |
| 1976 | { |
| 1977 | if (!reference->ref_master) |
| 1978 | count++; |
| 1979 | } |
| 1980 | |
| 1981 | gpre_nod* const assignments = MSC_node(nod_list, (SSHORT) count); |
| 1982 | request->req_node = |
| 1983 | MSC_ternary(nod_store, (gpre_nod*) request->req_contexts, assignments, NULL); |
| 1984 | count = 0; |
| 1985 | |
| 1986 | for (ref* reference = request->req_references; reference; reference = reference->ref_next) |
| 1987 | { |
| 1988 | if (reference->ref_master) |
| 1989 | continue; |
| 1990 | gpre_nod* item = MSC_node(nod_assignment, 2); |
| 1991 | item->nod_arg[0] = MSC_unary(nod_value, (gpre_nod*) reference); |
| 1992 | item->nod_arg[1] = MSC_unary(nod_field, (gpre_nod*) reference); |
| 1993 | assignments->nod_arg[count++] = item; |
| 1994 | } |
| 1995 | } |
| 1996 | else |
| 1997 | { |
| 1998 | // if the request type is store2, we have store ...returning_values. |
| 1999 | // The next action on the cur_store stack points to a upd structure |
| 2000 | // which will give us the assignments for this one. |
| 2001 | |
| 2002 | act* action2 = (act*) MSC_pop(&cur_store); |
| 2003 | upd* return_values = (upd*) action2->act_object; |
| 2004 | |
| 2005 | // Build assignments for all fields and null flags referenced |
| 2006 | |
| 2007 | gpre_lls* stack = NULL; |
| 2008 | int count = 0; |
| 2009 | |
| 2010 | for (ref* reference = request->req_references; reference; reference = reference->ref_next) |
| 2011 | { |
| 2012 | if (reference->ref_context == return_values->upd_update && |
| 2013 | reference->ref_level >= return_values->upd_level && |
| 2014 | !reference->ref_master) |
no test coverage detected