Tcl Source Code

View Ticket
Login
Ticket UUID: 9b352768e6d78c8dbf522a8d58b794b376187246
Title: memleak in dict-20.16
Type: Bug Version: trunk
Submitter: dgp Created on: 2014-07-11 13:25:14
Subsystem: 47. Bytecode Compiler Assigned To: dgp
Priority: 5 Medium Severity: Important
Status: Closed Last Modified: 2014-07-11 15:45:40
Resolution: Fixed Closed By: dgp
    Closed on: 2014-07-11 15:45:40
Description:
==21764== 58 (48 direct, 10 indirect) bytes in 1 blocks are definitely lost in loss record 5 of 7
==21764==    at 0x4A0610C: malloc (vg_replace_malloc.c:195)
==21764==    by 0x5D142A: TclpAlloc (tclAlloc.c:699)
==21764==    by 0x43D1AE: Tcl_Alloc (tclCkalloc.c:1059)
==21764==    by 0x548506: TclCreateLiteral (tclLiteral.c:236)
==21764==    by 0x54890F: TclRegisterLiteral (tclLiteral.c:434)
==21764==    by 0x4667ED: TclCompileDictMergeCmd (tclCompCmds.c:1272)
==21764==    by 0x4F99E2: TclAttemptCompileProc (tclEnsemble.c:3081)
==21764==    by 0x4F977F: TclCompileEnsemble (tclEnsemble.c:3004)
User Comments: dgp added on 2014-07-11 15:45:40:
Fixed on trunk.

dgp added on 2014-07-11 15:31:07:
No, that's not it.  Trouble is some missing
refcount management in the INST_DICT_FIRST
instruction.

dgp added on 2014-07-11 14:32:36:
I see 

    (7) beginCatch4 0 
...
    (51) endCatch 
...
    (64) endCatch 

which looks like something's out of balance to me.

dgp added on 2014-07-11 14:31:20:
I see 

    (7) beginCatch4 0 
...
    (51) endCatch 
...
    (64) endCatch 

which looks like something's out of balance to me.

dgp added on 2014-07-11 14:29:43:
% proc demo {} {dict merge {a b c d} {e f g h i}}
% tcl::unsupported::disassemble proc demo
ByteCode 0x0x15c2cc10, refCt 1, epoch 15, interp 0x0x15bda5d0 (epoch 15)
  Source "dict merge {a b c d} {e f g h i}"
  Cmds 1, src 32, inst 79, litObjs 2, aux 0, stkDepth 3, code/src 0.00
  Proc 0x0x15c27a70, refCt 1, args 0, compiled locals 4
      slot 0, scalar, temp
      slot 1, scalar, temp
      slot 2, scalar, temp
      slot 3, scalar, temp
  Exception ranges 1, depth 1:
      0: level 0, catch, pc 12-50, catch 62
  Commands 1:
      1: pc 0-77, src 0-31
  Command 1: "dict merge {a b c d} {e f g h i}"
    (0) push1 0 	# "a b c d"
    (2) dup 
    (3) verifyDict 
    (4) storeScalar1 %v2 	# temp var 2
    (6) pop 
    (7) beginCatch4 0 
    (12) push1 1 	# "e f g h i"
    (14) dictFirst %v3 	# temp var 3
    (19) jumpTrue1 +24 	# pc 43
    (21) reverse 2 
    (26) dictSet 1 %v2 	# temp var 2
    (35) pop 
    (36) dictNext %v3 	# temp var 3
    (41) jumpFalse1 -20 	# pc 21
    (43) pop 
    (44) pop 
    (45) unsetScalar 0 %v3 	# temp var 3
    (51) endCatch 
    (52) loadScalar1 %v2 	# temp var 2
    (54) unsetScalar 0 %v2 	# temp var 2
    (60) jump1 +18 	# pc 78
    (62) pushReturnOpts 
    (63) pushResult 
    (64) endCatch 
    (65) unsetScalar 0 %v2 	# temp var 2
    (71) unsetScalar 0 %v3 	# temp var 3
    (77) returnStk 
    (78) done