[Rd] More on bug 7924
Kevin B. Hendricks
kevin.hendricks at sympatico.ca
Sat Jun 3 17:51:17 CEST 2006
Hi,
Again, sorry for the length of this post. Once I get my new office I
will get a website set up on my work machine and will simply post a
link to the log since I doubt many people are truly interested in
these logs.
To further analyze what is happening, I added my own routine in
main.c called DEBUG_SET_NAMED and then redefined the SET_NAMED macro
to use it and then rebuilt R.
I then fired up R under a fresh environment and running under GDB
and set a breakpoint at my DEBUG_SET_NAMED and at compute_identical
> call1 <- Quote(f(arg[[1]], arg[[1]], arg[[1]]))
So running this statement shows that SET_NAMED was run on 5 objects
of type 13,16,10,3 and with the last one being a type 6.
In all cases, but the type 6 object, named was set to 2. For the
type 6 object, named was set to 1
Breakpoint 1, DEBUG_SET_NAMED (x=0x85cfd8, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$1 = 0x85cfd8
$2 = {sxpinfo = {type = 13, obj = 0, named = 2, gp = 0, mark = 1,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 1}, attrib = 0x508818,
gengc_next_node = 0x6db278, gengc_prev_node = 0x8442b8, u =
{primsxp = {
offset = 2}, symsxp = {pname = 0x2, value = 0x230002acc2,
internal = 0x21000090}, listsxp = {carval = 0x2, cdrval =
0x230002acc2,
tagval = 0x21000090}, envsxp = {frame = 0x2, enclos =
0x230002acc2,
hashtab = 0x21000090}, closxp = {formals = 0x2, body =
0x230002acc2,
env = 0x21000090}, promsxp = {value = 0x2, expr = 0x230002acc2,
env = 0x21000090}}}
#0 DEBUG_SET_NAMED (x=0x85cfd8, v=2) at ../../../r-devel/r-devel/
R/src/main/main.c:1444
#1 0x00002aaaaab67b04 in Rf_eval (e=0x570348, rho=0x9eb5f0)
at ../../../r-devel/r-devel/R/src/main/eval.c:389
Breakpoint 1, DEBUG_SET_NAMED (x=0x87da18, v=2) at ../../../r-devel/
r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$3 = 0x87da18
$4 = {sxpinfo = {type = 16, obj = 0, named = 2, gp = 0, mark = 1,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 1}, attrib = 0x508818,
gengc_next_node = 0x8403f8, gengc_prev_node = 0x87d868, u =
{primsxp = {
offset = 1}, symsxp = {pname = 0x1, value = 0x1185c48,
internal = 0x2000000a}, listsxp = {carval = 0x1, cdrval =
0x1185c48,
tagval = 0x2000000a}, envsxp = {frame = 0x1, enclos = 0x1185c48,
hashtab = 0x2000000a}, closxp = {formals = 0x1, body = 0x1185c48,
env = 0x2000000a}, promsxp = {value = 0x1, expr = 0x1185c48,
env = 0x2000000a}}}
#0 DEBUG_SET_NAMED (x=0x87da18, v=2) at ../../../r-devel/r-devel/
R/src/main/main.c:1444
#1 0x00002aaaaab67b04 in Rf_eval (e=0x545ed0, rho=0x9eb5f0)
at ../../../r-devel/r-devel/R/src/main/eval.c:389
Breakpoint 1, DEBUG_SET_NAMED (x=0x822bf8, v=2) at ../../../r-
devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$5 = 0x822bf8
$6 = {sxpinfo = {type = 10, obj = 0, named = 2, gp = 0, mark = 1,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 1}, attrib = 0x508818,
gengc_next_node = 0x661208, gengc_prev_node = 0x840428, u =
{primsxp = {
offset = 1}, symsxp = {pname = 0x1, value = 0x1, internal =
0x20000090},
listsxp = {carval = 0x1, cdrval = 0x1, tagval = 0x20000090},
envsxp = {
frame = 0x1, enclos = 0x1, hashtab = 0x20000090}, closxp = {
formals = 0x1, body = 0x1, env = 0x20000090}, promsxp = {value
= 0x1,
expr = 0x1, env = 0x20000090}}}
#0 DEBUG_SET_NAMED (x=0x822bf8, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab67b04 in Rf_eval (e=0x570230, rho=0x9eb5f0)
at ../../../r-devel/r-devel/R/src/main/eval.c:389
Breakpoint 1, DEBUG_SET_NAMED (x=0x5d02d0, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$7 = 0x5d02d0
$8 = {sxpinfo = {type = 3, obj = 0, named = 2, gp = 0, mark = 1,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 0}, attrib = 0x508818,
gengc_next_node = 0x5d0378, gengc_prev_node = 0xb843c0, u =
{primsxp = {
offset = 5711720}, symsxp = {pname = 0x572768, value = 0x5745c0,
internal = 0x648910}, listsxp = {carval = 0x572768, cdrval =
0x5745c0,
tagval = 0x648910}, envsxp = {frame = 0x572768, enclos =
0x5745c0,
hashtab = 0x648910}, closxp = {formals = 0x572768, body =
0x5745c0,
env = 0x648910}, promsxp = {value = 0x572768, expr = 0x5745c0,
env = 0x648910}}}
#0 DEBUG_SET_NAMED (x=0x5d02d0, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab67b04 in Rf_eval (e=0x570188, rho=0x9eb5f0)
at ../../../r-devel/r-devel/R/src/main/eval.c:389
Breakpoint 1, DEBUG_SET_NAMED (x=0x9ebe58, v=1) at ../../../r-
devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$9 = 0x9ebe58
$10 = {sxpinfo = {type = 6, obj = 0, named = 0, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 0}, attrib = 0x508818,
gengc_next_node = 0x9ebe90, gengc_prev_node = 0x9ebe20, u =
{primsxp = {
offset = 10663048}, symsxp = {pname = 0xa2b488, value = 0x9ecd90,
internal = 0x508818}, listsxp = {carval = 0xa2b488, cdrval =
0x9ecd90,
tagval = 0x508818}, envsxp = {frame = 0xa2b488, enclos =
0x9ecd90,
hashtab = 0x508818}, closxp = {formals = 0xa2b488, body =
0x9ecd90,
env = 0x508818}, promsxp = {value = 0xa2b488, expr = 0x9ecd90,
env = 0x508818}}}
#0 DEBUG_SET_NAMED (x=0x9ebe58, v=1)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab6b5d3 in do_set (call=0x9ec1d8, op=Variable "op" is
not available.)
at ../../../r-devel/r-devel/R/src/main/eval.c:1353
Then I assigned call2
>
> call2 <- Quote(f(arg[[1]]))[c(1,2,2,2)]
Again a variety of objects (types 14, 14, 14, 14, 19) has named set
to 2, all except for the final object (again type = 6) that had named
set to 1
Breakpoint 1, DEBUG_SET_NAMED (x=0xf9b808, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$11 = 0xf9b808
$12 = {sxpinfo = {type = 14, obj = 0, named = 0, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 1}, attrib = 0x508818,
gengc_next_node = 0xf9b868, gengc_prev_node = 0xf9b7d8, u =
{primsxp = {
offset = 1}, symsxp = {pname = 0x1, value = 0x3ff0000000000000,
internal = 0x21000109}, listsxp = {carval = 0x1,
cdrval = 0x3ff0000000000000, tagval = 0x21000109}, envsxp = {
frame = 0x1, enclos = 0x3ff0000000000000, hashtab = 0x21000109},
closxp = {formals = 0x1, body = 0x3ff0000000000000, env =
0x21000109},
promsxp = {value = 0x1, expr = 0x3ff0000000000000, env =
0x21000109}}}
#0 DEBUG_SET_NAMED (x=0xf9b808, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab676ff in Rf_eval (e=0xf9b808, rho=0x547858)
at ../../../r-devel/r-devel/R/src/main/eval.c:362
Breakpoint 1, DEBUG_SET_NAMED (x=0xf9b868, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$13 = 0xf9b868
$14 = {sxpinfo = {type = 14, obj = 0, named = 0, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 1}, attrib = 0x508818,
gengc_next_node = 0xf9b898, gengc_prev_node = 0xf9b808, u =
{primsxp = {
offset = 1}, symsxp = {pname = 0x1, value = 0x4000000000000000,
internal = 0x2000000e}, listsxp = {carval = 0x1,
cdrval = 0x4000000000000000, tagval = 0x2000000e}, envsxp = {
frame = 0x1, enclos = 0x4000000000000000, hashtab = 0x2000000e},
closxp = {formals = 0x1, body = 0x4000000000000000, env =
0x2000000e},
promsxp = {value = 0x1, expr = 0x4000000000000000, env =
0x2000000e}}}
#0 DEBUG_SET_NAMED (x=0xf9b868, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab676ff in Rf_eval (e=0xf9b868, rho=0x547858)
at ../../../r-devel/r-devel/R/src/main/eval.c:362
Breakpoint 1, DEBUG_SET_NAMED (x=0xf9b898, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$15 = 0xf9b898
$16 = {sxpinfo = {type = 14, obj = 0, named = 0, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 1}, attrib = 0x508818,
gengc_next_node = 0xf98b48, gengc_prev_node = 0xf9b868, u =
{primsxp = {
offset = 1}, symsxp = {pname = 0x1, value = 0x4000000000000000,
internal = 0x0}, listsxp = {carval = 0x1, cdrval =
0x4000000000000000,
tagval = 0x0}, envsxp = {frame = 0x1, enclos =
0x4000000000000000,
hashtab = 0x0}, closxp = {formals = 0x1, body =
0x4000000000000000,
env = 0x0}, promsxp = {value = 0x1, expr = 0x4000000000000000,
env = 0x0}}}
#0 DEBUG_SET_NAMED (x=0xf9b898, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab676ff in Rf_eval (e=0xf9b898, rho=0x547858)
at ../../../r-devel/r-devel/R/src/main/eval.c:362
Breakpoint 1, DEBUG_SET_NAMED (x=0xf98b48, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$17 = 0xf98b48
$18 = {sxpinfo = {type = 14, obj = 0, named = 0, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 1}, attrib = 0x508818,
gengc_next_node = 0xf98c08, gengc_prev_node = 0xf9b898, u =
{primsxp = {
offset = 1}, symsxp = {pname = 0x1, value = 0x4000000000000000,
internal = 0x21000010}, listsxp = {carval = 0x1,
cdrval = 0x4000000000000000, tagval = 0x21000010}, envsxp = {
frame = 0x1, enclos = 0x4000000000000000, hashtab = 0x21000010},
closxp = {formals = 0x1, body = 0x4000000000000000, env =
0x21000010},
promsxp = {value = 0x1, expr = 0x4000000000000000, env =
0x21000010}}}
#0 DEBUG_SET_NAMED (x=0xf98b48, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab676ff in Rf_eval (e=0xf98b48, rho=0x547858)
at ../../../r-devel/r-devel/R/src/main/eval.c:362
Breakpoint 1, DEBUG_SET_NAMED (x=0x143a918, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$19 = 0x143a918
$20 = {sxpinfo = {type = 19, obj = 0, named = 0, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 3}, attrib = 0x508818,
gengc_next_node = 0x143a960, gengc_prev_node = 0x143a8d0, u =
{primsxp = {
offset = 4}, symsxp = {pname = 0x4, value = 0x508818,
internal = 0x508818}, listsxp = {carval = 0x4, cdrval = 0x508818,
tagval = 0x508818}, envsxp = {frame = 0x4, enclos = 0x508818,
hashtab = 0x508818}, closxp = {formals = 0x4, body = 0x508818,
env = 0x508818}, promsxp = {value = 0x4, expr = 0x508818,
env = 0x508818}}}
#0 DEBUG_SET_NAMED (x=0x143a918, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaac25dcd in do_subset_dflt (call=0x9e98f0, op=Variable
"op" is not available.)
at ../../../r-devel/r-devel/R/src/main/subset.c:160
Breakpoint 1, DEBUG_SET_NAMED (x=0x9e8db0, v=1)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$21 = 0x9e8db0
$22 = {sxpinfo = {type = 6, obj = 0, named = 0, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 0}, attrib = 0x508818,
gengc_next_node = 0x9e8de8, gengc_prev_node = 0x9e8d78, u =
{primsxp = {
offset = 10663048}, symsxp = {pname = 0xa2b488, value = 0x9e8d78,
internal = 0x508818}, listsxp = {carval = 0xa2b488, cdrval =
0x9e8d78,
tagval = 0x508818}, envsxp = {frame = 0xa2b488, enclos =
0x9e8d78,
hashtab = 0x508818}, closxp = {formals = 0xa2b488, body =
0x9e8d78,
env = 0x508818}, promsxp = {value = 0xa2b488, expr = 0x9e8d78,
env = 0x508818}}}
#0 DEBUG_SET_NAMED (x=0x9e8db0, v=1)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab6b5d3 in do_set (call=0x9e9998, op=Variable "op" is
not available.)
at ../../../r-devel/r-devel/R/src/main/eval.c:1353
Now when I run the call to identical, you can see that both of the
type 6 objects created by the assignments to call1 and call2 have
named set to 2 by Rf_eval in the way to compute_identical
> identical(call1, call2)
Breakpoint 1, DEBUG_SET_NAMED (x=0x9ebe58, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$23 = 0x9ebe58
$24 = {sxpinfo = {type = 6, obj = 0, named = 1, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 0}, attrib = 0x508818,
gengc_next_node = 0x9ebe90, gengc_prev_node = 0x9ebe20, u =
{primsxp = {
offset = 10663048}, symsxp = {pname = 0xa2b488, value = 0x9ecd90,
internal = 0x508818}, listsxp = {carval = 0xa2b488, cdrval =
0x9ecd90,
tagval = 0x508818}, envsxp = {frame = 0xa2b488, enclos =
0x9ecd90,
hashtab = 0x508818}, closxp = {formals = 0xa2b488, body =
0x9ecd90,
env = 0x508818}, promsxp = {value = 0xa2b488, expr = 0x9ecd90,
env = 0x508818}}}
#0 DEBUG_SET_NAMED (x=0x9ebe58, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab67b04 in Rf_eval (e=0x56ca30, rho=0x9e91a0)
at ../../../r-devel/r-devel/R/src/main/eval.c:389
Breakpoint 1, DEBUG_SET_NAMED (x=0x9e8db0, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
1444 (x->sxpinfo.named) = v;
$25 = 0x9e8db0
$26 = {sxpinfo = {type = 6, obj = 0, named = 1, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 0}, attrib = 0x508818,
gengc_next_node = 0x9e8de8, gengc_prev_node = 0x9e8d78, u =
{primsxp = {
offset = 10663048}, symsxp = {pname = 0xa2b488, value = 0x9e8d78,
internal = 0x508818}, listsxp = {carval = 0xa2b488, cdrval =
0x9e8d78,
tagval = 0x508818}, envsxp = {frame = 0xa2b488, enclos =
0x9e8d78,
hashtab = 0x508818}, closxp = {formals = 0xa2b488, body =
0x9e8d78,
env = 0x508818}, promsxp = {value = 0xa2b488, expr = 0x9e8d78,
env = 0x508818}}}
#0 DEBUG_SET_NAMED (x=0x9e8db0, v=2)
at ../../../r-devel/r-devel/R/src/main/main.c:1444
#1 0x00002aaaaab67b04 in Rf_eval (e=0x92d5d0, rho=0x9e91a0)
at ../../../r-devel/r-devel/R/src/main/eval.c:389
Now finally the breakpoint at compute_identical was reached and you
can see that the type 6 objects that had their named value changed
from 1 to 2 are in fact the top level objects being sent to identical
but now they have named set to 2
Breakpoint 2, compute_identical (x=0x9ebe58, y=0x9e8db0)
at ../../../r-devel/r-devel/R/src/main/identical.c:53
53 {
(gdb) print *x
$27 = {sxpinfo = {type = 6, obj = 0, named = 2, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 0}, attrib = 0x508818,
gengc_next_node = 0x9ebe90, gengc_prev_node = 0x9ebe20, u =
{primsxp = {
offset = 10663048}, symsxp = {pname = 0xa2b488, value = 0x9ecd90,
internal = 0x508818}, listsxp = {carval = 0xa2b488, cdrval =
0x9ecd90,
tagval = 0x508818}, envsxp = {frame = 0xa2b488, enclos =
0x9ecd90,
hashtab = 0x508818}, closxp = {formals = 0xa2b488, body =
0x9ecd90,
env = 0x508818}, promsxp = {value = 0xa2b488, expr = 0x9ecd90,
env = 0x508818}}}
(gdb) print *y
$29 = {sxpinfo = {type = 6, obj = 0, named = 2, gp = 0, mark = 0,
debug = 0,
trace = 0, fin = 0, gcgen = 0, gccls = 0}, attrib = 0x508818,
gengc_next_node = 0x9e8de8, gengc_prev_node = 0x9e8d78, u =
{primsxp = {
offset = 10663048}, symsxp = {pname = 0xa2b488, value = 0x9e8d78,
internal = 0x508818}, listsxp = {carval = 0xa2b488, cdrval =
0x9e8d78,
tagval = 0x508818}, envsxp = {frame = 0xa2b488, enclos =
0x9e8d78,
hashtab = 0x508818}, closxp = {formals = 0xa2b488, body =
0x9e8d78,
env = 0x508818}, promsxp = {value = 0xa2b488, expr = 0x9e8d78,
env = 0x508818}}}
So I think this does confirm that the call to identical does indeed
change the top level objects named from 1 to 2.
I still need to learn more about how objects are made and what an
object of LANGSXP type really is and what the proper setting is for
named for an object that is a list of other objects whose named
values are set to 0, 1, or 2 respectively.
My guess is just before a final objects is assigned, we might have to
walk the tree of subobjects in some way to make sure all of the named
values are sane. The code seems to be setting this to 2 in lots of
places and some seem like quick patches to other problems. I still
don't understand why call1 and call2 when used as arguments to
identical() and not in assignment statements can have their named
values changed. I would expect nothing to be changed in call1 or
call2 py passing them to a function like identical.
So I will keep looking.
FWIW, it might be a good idea to set up DEBUG_SET_NAMED and other
accessor functions so that when built under -DDEBUG_ACCESSORS that
they are used to replace the macros spreadout all over the place in
the code. A change like that would be easy to do if anyone feels it
would be worthwhile.
Hope this helps.
Kevin
More information about the R-devel
mailing list