Tcl Source Code

View Ticket
Login
Ticket UUID: 3075155
Title: oo depends on bytecoding?
Type: Bug Version: obsolete: 8.6b1.1
Submitter: msofer Created on: 2010-09-24 22:03:10
Subsystem: 07. Variables Assigned To: msofer
Priority: 7 High Severity:
Status: Open Last Modified: 2011-03-11 18:56:06
Resolution: None Closed By:
    Closed on:
Description:
When I disable the command compiler (juts add '0&&' at the start of the condition in tclCompile.c line 1639), there is a nasty-looking error:

==== oo-27.6 variables declaration - non-interference of levels FAILED
==== Contents of test case:

    oo::class create foo {
superclass master
variable x!
constructor {} {set x! 1}
method y {} {incr x!}
    }
    foo create bar
    oo::objdefine bar {
variable y!
method y {} {list [next] [incr y!] [info var] [info local]}
export eval
    }
    bar y
    list [bar y] [lsort [info object vars bar]] [bar eval {info vars *!}]

---- Result was:
{3 2 {} {}} {x! y!} {x! y!}
---- Result should have been (exact matching):
{3 2 y! {}} {x! y!} {x! y!}
==== oo-27.6 FAILED

There is also a segfault in itcl's typeoption.test, which may well be related.

The build is configured as 
  CFLAGS=-DPURIFY ./configure --disable-shared --enable-symbols
User Comments: dkf added on 2011-03-11 18:56:06:
It's the interaction of [info variables] with variable resolvers (a feature not used in the rest of the core, hence the bug showing up in TclOO). Having a LVT smooths all that out in this case, but that's hardly ideal.

dkf added on 2011-03-11 18:47:07:
I'm not very excited about this after all. Turns out quite a bit of the rest of Tcl also breaks if we disable command compilation.

dkf added on 2010-10-20 06:36:04:
Your analysis looks correct. I'll assign it to you (for now) since I'm not going to do any hacking in the guts of resolvers if I can possibly help it.

msofer added on 2010-09-27 22:43:12:
In order for this to work properly if we maintain the current behaviour (ie, if #3075907 is declared a doc bug), we should extend Tcl_ResolverInfo to contain a listProc to be used by [info vars]. This new function would list all variable names that are able to be resolved in the current context.

The alternative would probably be unnecessarily expensive: that all OO methods be initialised to contain locals linked to every defined variable, initially undefined.

msofer added on 2010-09-27 17:08:08:

File Added - 387998: show.tcl

msofer added on 2010-09-27 17:07:44:
Just replacing [incr] by an equivalent [myIncr] or forcing a non-bc'ed [incr] displays the difference: running the attached script outputs

{3 2 y! {}} {x! y!} {x! y!}
{3 2 {} {}} {x! y!} {x! y!}
{3 2 {} {}} {x! y!} {x! y!}

msofer added on 2010-09-27 16:24:05:
The problem seems to be:

1. On a normal build, the presence of y! is detected at compile time by the [incr] compiler. This causes y! to live in the LVT and the resolver to be called at proc loading time. Due to #3075907 y! is reported by [info vars]

2. With command compilers disabled (in this particular case, it is enough to not compile incr), y! is not in the LVT: it will only exist when it is given a value

This is all as should be, assuming [info vars] behaved as doc'ed in the man page. Given #3075907 the behaviour depends on the set of commands that are bytecompiled.

msofer added on 2010-09-26 19:54:51:
This led to discovery of (related, not the same) Bug #3075907. If that one is resolved as an implementation bug, this test is wrong. If it is instead a doc bug, this test is correct.

msofer added on 2010-09-26 19:04:51:
After quick look at TclInfoVarsCmd(), it seems that [info vars] is not resolver-aware at all

msofer added on 2010-09-26 19:03:16:
From the chat:
[14:56]dkfmiguel: It looks like it's something to do with variable resolvers. I don't pretend to understand those (and have probably got it wrong, I accept) and write code for them by doing the equivalent of throwing rocks at stuff until it seems to work.
[14:57]dkfI suspect that the highly restricted resolver used by TclOO is too restricted, but since proc^Wmethod bodies are always compiled I don't care

dkf added on 2010-09-26 00:53:48:
Variable resolver involved! Argh!

Attachments: