Check-in [27339e7e0c]
Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2019 Conference, Houston/TX, US, Nov 4-8
Send your abstracts to [email protected]
or submit via the online form by Sep 9.

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

Overview
Comment:Add conversion to IMPURE ZEROONE INT, needed in booltest. Keep code motion from messing with the callframe for now. Patch out the handful of remaining tests that abort. Next up: fix the dictest tests involving 'dict update', lsetest, and re-add support for direct ops.
Timelines: family | ancestors | descendants | both | notworking | kbk-refactor-callframe
Files: files | file ages | folders
SHA3-256: 27339e7e0c465cb2b5799395b9181ae36ebebaf07eddf8a5e6e3f2d5574d3871
User & Date: kbk 2019-01-23 02:12:35
Context
2019-01-29
02:00
Fix translation bugs that broke [dict] tests check-in: ab6da27502 user: kbk tags: notworking, kbk-refactor-callframe
2019-01-23
02:12
Add conversion to IMPURE ZEROONE INT, needed in booltest. Keep code motion from messing with the callframe for now. Patch out the handful of remaining tests that abort. Next up: fix the dictest tests involving 'dict update', lsetest, and re-add support for direct ops. check-in: 27339e7e0c user: kbk tags: notworking, kbk-refactor-callframe
2019-01-22
02:52
Restore the 'timings' list - if 'transform' doesn't produce it, there's a crash. check-in: 3e49a05889 user: kbk tags: notworking, kbk-refactor-callframe
Changes

Changes to codegen/build.tcl.

5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
....
5491
5492
5493
5494
5495
5496
5497

















5498
5499
5500
5501
5502
5503
5504
    # Results:
    #	An IMPURE BOOLEAN LLVM value reference.

    method narrowToType.IMPURE_BOOLEAN(IMPURE\040ZEROONE\040BOOLEAN) {value {name ""}} {
	my addReference(STRING) [my impure.string $value]
	if {$name ne "" && [string match {[0-9]*} [GetValueName $value]]} {
	    SetValueName $value $name
	}
	return $value
    }

    # Builder:narrowToType.IMPURE_NUMERIC_BOOLEAN(STRING) --
    #
    #	Generate code to extract IMPURE NUMERIC BOOLEAN from a STRING.
    #
................................................................................
    #	An IMPURE NUMERIC LLVM value reference.

    method narrowToType.IMPURE_NUMERIC(STRING) {value {name ""}} {
	set nval [my call ${tcl.extractNumeric} [list $value]]
	my addReference(STRING) $value
	return [my impure NUMERIC $value $nval $name]
    }


















    # Builder:nothing --
    #
    #	Create a Nothing NEXIST of the given type.
    #
    # Parameters:
    #	type -	The type of the NEXIST.






|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
....
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
    # Results:
    #	An IMPURE BOOLEAN LLVM value reference.

    method narrowToType.IMPURE_BOOLEAN(IMPURE\040ZEROONE\040BOOLEAN) {value {name ""}} {
	my addReference(STRING) [my impure.string $value]
	if {$name ne "" && [string match {[0-9]*} [GetValueName $value]]} {
	    SetValueName $value $name
}
	return $value
    }

    # Builder:narrowToType.IMPURE_NUMERIC_BOOLEAN(STRING) --
    #
    #	Generate code to extract IMPURE NUMERIC BOOLEAN from a STRING.
    #
................................................................................
    #	An IMPURE NUMERIC LLVM value reference.

    method narrowToType.IMPURE_NUMERIC(STRING) {value {name ""}} {
	set nval [my call ${tcl.extractNumeric} [list $value]]
	my addReference(STRING) $value
	return [my impure NUMERIC $value $nval $name]
    }

    # Builder:narrowToType.IMPURE_ZEROONE_BOOLEAN(STRING) --
    #
    #	Generate code to parse the given STRING and extract a Boolean value,
    #	either the integer 0 or 1 or one of the Boolean words. The STRING
    #	is already known to contain a value of the right type. Quadcode
    #	implementation ('narrowToType')
    #
    # Parameters:
    #	value - The STRING LLVM reference to parse.
    #   name (optional) - A name to give to the result value.

    method narrowToType.IMPURE_ZEROONE_BOOLEAN(STRING) {value {name ""}} {
	set bval [my call ${tcl.extractZeroOneBoolean} [list $value]]
	my addReference(STRING) $value
	return [my impure {ZEROONE BOOLEAN} $value $bval $name]
    }

    # Builder:nothing --
    #
    #	Create a Nothing NEXIST of the given type.
    #
    # Parameters:
    #	type -	The type of the NEXIST.

Changes to codegen/mathlib.tcl.

28
29
30
31
32
33
34
35
36
37
38

39
40
41
42
43
44
45
....
1535
1536
1537
1538
1539
1540
1541
































1542
1543
1544
1545
1546
1547
1548
    variable tcl.add.numeric tcl.sub.numeric tcl.mult.numeric tcl.div.numeric
    variable tcl.pow.numeric tcl.land.numeric tcl.lor.numeric tcl.not.numeric
    variable tcl.not.numericOrBoolean
    variable tcl.neg.numeric tcl.eq.numeric tcl.ne.numeric tcl.lt.numeric
    variable tcl.le.numeric tcl.gt.numeric tcl.ge.numeric
    variable tcl.isBoolean tcl.isInteger tcl.isDouble
    variable tcl.isNumeric tcl.isNumericOrBoolean
    variable tcl.isTrue.numerc tcl.isTrue.numericOrBoolean
    variable tcl.isZeroOneBoolean
    variable tcl.extractNumeric tcl.extractNumericOrBoolean
    variable tcl.extractDouble tcl.extractInteger

    variable tcl.stringify.double tcl.stringify.int
    variable tcl.stringify.numeric
    variable tcl.cmp.strstr tcl.cmp.strnum

    # Builder:GrowingBinaryFunction --
    #
    #	Generate a function that implements a (normal) mathematical operator
................................................................................
	    my condBr [my extract $b 0] $returnBoolean $getDouble
	label returnBoolean:
	    my ret [my packNumericOrBooleanBoolean [my extract $b 1]]
	label getDouble:
	    set i [my GetDouble $value]
	    my br $testType
	}
































			
	##### Function tcl.extractDouble #####
	#
	# Type signature: value:STRING -> DOUBLE
	#
	# Parse a STRING as a DOUBLE; the value is known to be parseable.
	# Part of the implementation of quadcode "narrowToType".






|



>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
....
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
    variable tcl.add.numeric tcl.sub.numeric tcl.mult.numeric tcl.div.numeric
    variable tcl.pow.numeric tcl.land.numeric tcl.lor.numeric tcl.not.numeric
    variable tcl.not.numericOrBoolean
    variable tcl.neg.numeric tcl.eq.numeric tcl.ne.numeric tcl.lt.numeric
    variable tcl.le.numeric tcl.gt.numeric tcl.ge.numeric
    variable tcl.isBoolean tcl.isInteger tcl.isDouble
    variable tcl.isNumeric tcl.isNumericOrBoolean
    variable tcl.isTrue.numeric tcl.isTrue.numericOrBoolean
    variable tcl.isZeroOneBoolean
    variable tcl.extractNumeric tcl.extractNumericOrBoolean
    variable tcl.extractDouble tcl.extractInteger
    variable tcl.extractZeroOneBoolean
    variable tcl.stringify.double tcl.stringify.int
    variable tcl.stringify.numeric
    variable tcl.cmp.strstr tcl.cmp.strnum

    # Builder:GrowingBinaryFunction --
    #
    #	Generate a function that implements a (normal) mathematical operator
................................................................................
	    my condBr [my extract $b 0] $returnBoolean $getDouble
	label returnBoolean:
	    my ret [my packNumericOrBooleanBoolean [my extract $b 1]]
	label getDouble:
	    set i [my GetDouble $value]
	    my br $testType
	}

	##### Function tcl.extractZeroOneBoolean #####
	#
	# Type signature: value:STRING -> ZEROONE
	#
	# Parse a STRING as a Boolean value. The value is known to be
	# parsable.  Part of the implementation of quadcode 'narrowToType'.

	set f [$m local "tcl.extractZeroOneBoolean" "BOOLEAN<-STRING"]
	params value
	build {
	    nonnull $value
	    my br $testType
	label testType:
	    set type [my dereference $value 0 Tcl_Obj.typePtr]
	    my condBr [my nonnull $type] $testIsInt $testIsBoolean
	label testIsInt:
	    my condBr [my isInteger $value] $returnInt $testIsBoolean
	label returnInt:
	    set gw [my GetWide $value]
	    set i [my extract $gw 1]
	    my switch $i $no 0 $yes
	label no:
	    my ret [Const true bool]
	label yes:
	    my ret [Const false bool]
	label testIsBoolean:
	    set b [my GetBoolean $value]
	    my condBr [my extract $b 0] $returnBoolean $testIsInt
	label returnBoolean:
	    my ret [my extract $b 1]
	}
			
	##### Function tcl.extractDouble #####
	#
	# Type signature: value:STRING -> DOUBLE
	#
	# Parse a STRING as a DOUBLE; the value is known to be parseable.
	# Part of the implementation of quadcode "narrowToType".

Changes to demos/perftest/tester.tcl.

2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
....
2669
2670
2671
2672
2673
2674
2675
2676

2677


2678
2679
2680
2681
2682
2683
2684
2685
2686
....
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
    regsubtest
    # Failure handling, [subst], [try]
    wideretest
    substtest
    substtest2
    switchfail
    trimtest
    magicreturn
    returntest
    errortest1
    errortest2
    errortest2-caller
    errortest3
    errortest4 errortest4a errortest4b
    errortest5 errortest6
................................................................................
    rangetest
    numberitems numberitems2 numberitems3 doubleitems
    containment
    lsorttest
    lsortcmd
    # Dictionary operations (also see some [try] tests)
    dictest
    dictest2 dictest3

    dictest4 dictest5


    dictest6
    dictest7 dictest8 dictest9
    dictfor
    # Nonexistent variables
    nextest1
    nextest2
    nextest3
    nextest4
    # Array operations
................................................................................
    wordcounter3
    wordcounter4
    # Calls of uncompiled code
    calltest
    calltest2
    calltest3
    # Callframe tests
#    callframe::test1		direct ops
#    callframe::test2		direct ops
#    callframe::test3		direct ops
#    callframe::test4		direct ops
    # The interprocedural tests
    mrtest::*
    coscaller1
    coscaller2
    xsum xsum2
    # Namespace tests
    nstestaux::pts
    nstest::nstest0
    nstest::nstest1
    # nstest::nstest2   fails with command not found
    nstest::nstest3
    nstest::nstest4
    # nstest::nstest5   fails with invalid command name
    nstest::nstest6






|







 







|
>

>
>
|
<







 







|
|
|
|






|







2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
....
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681

2682
2683
2684
2685
2686
2687
2688
....
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
    regsubtest
    # Failure handling, [subst], [try]
    wideretest
    substtest
    substtest2
    switchfail
    trimtest
    # magicreturn TEMP - skip this, it doesn't compile
    returntest
    errortest1
    errortest2
    errortest2-caller
    errortest3
    errortest4 errortest4a errortest4b
    errortest5 errortest6
................................................................................
    rangetest
    numberitems numberitems2 numberitems3 doubleitems
    containment
    lsorttest
    lsortcmd
    # Dictionary operations (also see some [try] tests)
    dictest
    dictest2
    # dictest3			TEMP generates incorrect code
    dictest4 dictest5
    # dictest6 dictest7		TEMP generates incorrect code
    # dictest8			TEMP generates incorrect code
    dictest9

    dictfor
    # Nonexistent variables
    nextest1
    nextest2
    nextest3
    nextest4
    # Array operations
................................................................................
    wordcounter3
    wordcounter4
    # Calls of uncompiled code
    calltest
    calltest2
    calltest3
    # Callframe tests
#    callframe::test1		TEMP direct ops
#    callframe::test2		TEMP direct ops
#    callframe::test3		TEMP direct ops
#    callframe::test4		TEMP direct ops
    # The interprocedural tests
    mrtest::*
    coscaller1
    coscaller2
    xsum xsum2
    # Namespace tests
    # nstestaux::pts	depends on direct ops
    nstest::nstest0
    nstest::nstest1
    # nstest::nstest2   fails with command not found
    nstest::nstest3
    nstest::nstest4
    # nstest::nstest5   fails with invalid command name
    nstest::nstest6

Changes to quadcode/pre.tcl.

73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
	    ge gt
	    initIfNotExists
	    instanceOf
	    le
	    listAppend listConcat listIn listIndex listLength listRange
	    listSet
	    lshift lt
	    maptoint mod moveFromCallFrame mult
	    narrowToType neq not
	    purify
	    regexp retrieveResult rshift
	    strcase strcat strclass strcmp streq strfind strindex strlen
	    strmap strmatch strrange strreplace strrfind strtrim
	    sub
	    uminus






|







73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
	    ge gt
	    initIfNotExists
	    instanceOf
	    le
	    listAppend listConcat listIn listIndex listLength listRange
	    listSet
	    lshift lt
	    maptoint mod mult
	    narrowToType neq not
	    purify
	    regexp retrieveResult rshift
	    strcase strcat strclass strcmp streq strfind strindex strlen
	    strmap strmatch strrange strreplace strrfind strtrim
	    sub
	    uminus