| 2703 | // |
| 2704 | |
| 2705 | static act* par_returning_values() |
| 2706 | { |
| 2707 | if (!cur_store) |
| 2708 | PAR_error("STORE must precede RETURNING_VALUES"); |
| 2709 | |
| 2710 | act* begin_action = (act*) MSC_pop(&cur_store); |
| 2711 | gpre_req* request = begin_action->act_request; |
| 2712 | |
| 2713 | // First take care of the impending store: |
| 2714 | // Make up an assignment list for all field references and |
| 2715 | // clone the references while we are at it |
| 2716 | |
| 2717 | int count = 0; |
| 2718 | for (ref* reference = request->req_references; reference; reference = reference->ref_next) |
| 2719 | { |
| 2720 | if (!reference->ref_master) |
| 2721 | count++; |
| 2722 | } |
| 2723 | |
| 2724 | gpre_nod* assignments = MSC_node(nod_list, (SSHORT) count); |
| 2725 | request->req_node = |
| 2726 | MSC_ternary(nod_store, (gpre_nod*) request->req_contexts, assignments, NULL); |
| 2727 | count = 0; |
| 2728 | |
| 2729 | for (ref* reference = request->req_references; reference; reference = reference->ref_next) |
| 2730 | { |
| 2731 | ref* save_ref = MSC_reference(&begin_action->act_object); |
| 2732 | save_ref->ref_context = reference->ref_context; |
| 2733 | save_ref->ref_field = reference->ref_field; |
| 2734 | save_ref->ref_source = reference; |
| 2735 | save_ref->ref_flags = reference->ref_flags; |
| 2736 | |
| 2737 | if (reference->ref_master) |
| 2738 | continue; |
| 2739 | gpre_nod* item = MSC_node(nod_assignment, 2); |
| 2740 | item->nod_arg[0] = MSC_unary(nod_value, (gpre_nod*) save_ref); |
| 2741 | item->nod_arg[1] = MSC_unary(nod_field, (gpre_nod*) save_ref); |
| 2742 | assignments->nod_arg[count++] = item; |
| 2743 | } |
| 2744 | |
| 2745 | // Next make an updated context for post_store actions |
| 2746 | |
| 2747 | upd* new_values = (upd*) MSC_alloc(UPD_LEN); |
| 2748 | gpre_ctx* source = request->req_contexts; |
| 2749 | request->req_type = REQ_store2; |
| 2750 | |
| 2751 | gpre_ctx* new_ctx = MSC_context(request); |
| 2752 | new_ctx->ctx_symbol = source->ctx_symbol; |
| 2753 | new_ctx->ctx_relation = source->ctx_relation; |
| 2754 | new_ctx->ctx_symbol->sym_object = new_ctx; // pointing to itself? |
| 2755 | |
| 2756 | // make an update block to hold everything known about referenced fields |
| 2757 | |
| 2758 | act* action = MSC_action(request, ACT_store2); |
| 2759 | action->act_object = (ref*) new_values; |
| 2760 | |
| 2761 | new_values->upd_request = request; |
| 2762 | new_values->upd_source = source; |
no test coverage detected