tclquadcode

Check-in [407e1ef055]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Fix mislinking of phi operations on the error branch of 'invoke'
Timelines: family | ancestors | descendants | both | notworking | kbk-refactor-callframe
Files: files | file ages | folders
SHA3-256:407e1ef055bfeceffdc509a45e9881752d36026523e934c9e97f2a34d0559f43
User & Date: kbk 2019-01-21 19:45:39
Context
2019-01-21
22:33
Enough partial implementation for expandtest::test1-test3 check-in: 89030dcc42 user: kbk tags: notworking, kbk-refactor-callframe
19:45
Fix mislinking of phi operations on the error branch of 'invoke' check-in: 407e1ef055 user: kbk tags: notworking, kbk-refactor-callframe
18:14
Enough changes to get through first two 'expandtest' tests check-in: 5557b1e592 user: kbk tags: notworking, kbk-refactor-callframe
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to quadcode/varargs.tcl.

161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
...
224
225
226
227
228
229
230

231
232
233
234
235
236
237
....
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115

1116
1117
1118
1119
1120
1121
1122
    }
    set cf [lindex $q2 1]
    $B emit [list extractCallFrame [$B maketemp "callframe"] [lindex $newq 1]]
    my debug-varargs {
        $B log-last
    }

    set cfin [lindex $q 1]
    my va_ConvergeErrorPath $B $result $cf $cfin [lreplace $bb[set bb ""] 0 1]

    $B destroy

    return
}
 
................................................................................
#
# The command name being invoked, and the expected arguments, are always known
# at this point.

oo::define quadcode::transformer method va_PrepareArgs {B b pc q arginfo} {
    
    set argl [lassign $q opcode result cfin cmd]


    # Create the first part of the 'invoke' instruction.
    
    set iresult [my newVarInstance $result]
    set newq [list invoke $iresult $cfin $cmd]

    # Find out how many plain parameters (that is, not 'args') the
................................................................................
        $B emit [list jump [list bb $finalb]]
        my debug-varargs {
            $B log-last
        }

        # Move to the error block, and emit a jump to the join point
        set errResult [$B gettemp "error"]
        set errFail [$B gettemp "error"]
        $B buildin $errorb
        $B emit [list extractFail $errFail $errResult]
        my debug-varargs {
            $B log-last
        }
        $B emit [list jump [list bb $finalb]]
        my debug-varargs {
            $B log-last
        }

        # Move to the finalization block, and emit phis for the callframe
        # and the result


        $B buildin $finalb
        $B emit [list phi $cf \
                     [list bb $errorb] $cfin [list bb $normb] $normcf]
        my debug-varargs {
            $B log-last
        }
        $B emit [list phi $result \







|







 







>







 







|













>







161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
...
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
....
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
    }
    set cf [lindex $q2 1]
    $B emit [list extractCallFrame [$B maketemp "callframe"] [lindex $newq 1]]
    my debug-varargs {
        $B log-last
    }

    set cfin [lindex $newq 2]
    my va_ConvergeErrorPath $B $result $cf $cfin [lreplace $bb[set bb ""] 0 1]

    $B destroy

    return
}
 
................................................................................
#
# The command name being invoked, and the expected arguments, are always known
# at this point.

oo::define quadcode::transformer method va_PrepareArgs {B b pc q arginfo} {
    
    set argl [lassign $q opcode result cfin cmd]
    set callee [lindex $cmd 1]

    # Create the first part of the 'invoke' instruction.
    
    set iresult [my newVarInstance $result]
    set newq [list invoke $iresult $cfin $cmd]

    # Find out how many plain parameters (that is, not 'args') the
................................................................................
        $B emit [list jump [list bb $finalb]]
        my debug-varargs {
            $B log-last
        }

        # Move to the error block, and emit a jump to the join point
        set errResult [$B gettemp "error"]
        set errFail [$B maketemp "error"]
        $B buildin $errorb
        $B emit [list extractFail $errFail $errResult]
        my debug-varargs {
            $B log-last
        }
        $B emit [list jump [list bb $finalb]]
        my debug-varargs {
            $B log-last
        }

        # Move to the finalization block, and emit phis for the callframe
        # and the result

        puts "* cfin = $cfin"
        $B buildin $finalb
        $B emit [list phi $cf \
                     [list bb $errorb] $cfin [list bb $normb] $normcf]
        my debug-varargs {
            $B log-last
        }
        $B emit [list phi $result \