summaryrefslogtreecommitdiffstats
path: root/lib/environment.tcl
blob: 6a83802e56545299738a3475ca9e279fbc05fde8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
proc serializeEnvironment {} {
    set argnames [list]
    set argvalues [list]
    # Get all variables and serialize them, to fake lexical scope.
    foreach name [uplevel {info locals}] {
        if {![string match "__*" $name]} {
            lappend argnames $name
            lappend argvalues [uplevel [list set $name]]
        }
    }
    list $argnames $argvalues
}

set ::Evaluator::totalTimesMap [dict create]
set ::Evaluator::runsMap [dict create]

proc runInSerializedEnvironment {lambda env} {
    dict incr ::Evaluator::runsMap $lambda
    if {![dict exists $::Evaluator::totalTimesMap $lambda]} {
        dict set ::Evaluator::totalTimesMap $lambda [dict create loadTime 0 runTime 0 unloadTime 0]
    }
    set loadTime_ [baretime {}]

    try {
        set runTime_ [baretime {set ret [apply $lambda {*}$env]}]
        set ::stepRunTime [+ $::stepRunTime $runTime_]
        set ret

    } finally {
        set unloadTime_ [baretime {}]
        dict with ::Evaluator::totalTimesMap $lambda {
            incr loadTime $loadTime_
            if {[info exists runTime_]} {
                incr runTime $runTime_
            }
            incr unloadTime $unloadTime_
        }
    }
}