Ticket #386 (closed bug: fixed)
Failure in t/dynpmc/foo.t if parrot directory has an extension
| Reported by: | mikehh | Owned by: | |
|---|---|---|---|
| Priority: | normal | Milestone: | |
| Component: | none | Version: | trunk |
| Severity: | medium | Keywords: | |
| Cc: | rg@… | Language: | |
| Patch status: | Platform: |
Description
While working on TT#380 testing builds with and without the --optimize flag I copied my parrot directory to a new directory parrot.noopt and found that while the test I was working on (t/pmc/exceptionhandler.t passed all 8 tests as opposed to only 6 tests with the optimize flag set) the third test in t/dynpmc/foo.t was failing.
At a later revision the other test passed but t/dynpmc/foo.t was still failing, but passing in the --optimized build. None of the other smolder tests seemed to be failing this test - with or without the --optimize. If fact my AMD64 build was passing and that does not build with --optimize.
I did a clean checkout into parrot.nopt and still had a failure. Then I built my regular parrot directory without the --optimize and the test passed.
mhk@mhk-desktop:~/parrot.nopt$ cat .parrot_current_rev 37055 mhk@mhk-desktop:~/parrot.nopt$ date Sun Mar 1 00:32:52 GMT 2009 mhk@mhk-desktop:~/parrot.nopt$ prove --verbose t/dynpmc/foo.t t/dynpmc/foo.t .. 1..9 ok 1 - get_integer ok 2 - loadlib with relative pathname, no ext not ok 3 - loadlib with absolute pathname, no ext # Failed test 'loadlib with absolute pathname, no ext' # at t/dynpmc/foo.t line 57. # Exited with error code: 1 # Received: # Class 'Foo' not found # current instr.: 'main' pc 16 (/home/mhk/parrot.nopt/t/dynpmc/foo_3.pir:15) # # Expected: # 42 # ok 4 - loadlib with relative pathname & ext ok 5 - loadlib with absolute pathname & ext ok 6 - inherited add ok 7 - Foo subclass isa Integer ok 8 - .HLL 1 ok 9 - .HLL 2 # Looks like you failed 1 test of 9. Dubious, test returned 1 (wstat 256, 0x100) Failed 1/9 subtests Test Summary Report ------------------- t/dynpmc/foo.t (Wstat: 256 Tests: 9 Failed: 1) Failed test: 3 Non-zero exit status: 1 Files=1, Tests=9, 0 wallclock secs ( 0.04 usr 0.01 sys + 0.21 cusr 0.11 csys = 0.37 CPU) Result: FAIL mhk@mhk-desktop:~/parrot.nopt$
mhk@mhk-desktop:~/parrot$ cat .parrot_current_rev 37055 mhk@mhk-desktop:~/parrot$ date Sun Mar 1 00:11:05 GMT 2009 mhk@mhk-desktop:~/parrot$ prove --verbose t/dynpmc/foo.t t/dynpmc/foo.t .. 1..9 ok 1 - get_integer ok 2 - loadlib with relative pathname, no ext ok 3 - loadlib with absolute pathname, no ext ok 4 - loadlib with relative pathname & ext ok 5 - loadlib with absolute pathname & ext ok 6 - inherited add ok 7 - Foo subclass isa Integer ok 8 - .HLL 1 ok 9 - .HLL 2 ok All tests successful. Files=1, Tests=9, 1 wallclock secs ( 0.04 usr 0.00 sys + 0.21 cusr 0.12 csys = 0.37 CPU) Result: PASS mhk@mhk-desktop:~/parrot$
Looking at the generated pir files from the test the only difference between test 3 and test 5 for instance is in adding the extension. Also the relative path in test 2 passes. At this stage the only possible problen area I can see is in loadlib - which inlines Parrot_load_lib.
foo_3.pir in directory t/dynpmc/
.sub main :main
## get cwd in $S0.
.include "iglobals.pasm"
$P11 = getinterp
$P12 = $P11[.IGLOBALS_CONFIG_HASH]
$S0 = $P12["prefix"]
## convert cwd to an absolute pathname without the extension, and load it.
## this should always find the version in the build directory, since that's
## the only place "make test" will work.
$S0 = concat "/runtime/parrot/dynext/foo"
loadlib $P1, $S0
## ensure that we can still make Foo instances.
$P1 = new "Foo"
$I1 = $P1
print $I1
print "\n"
.end
foo_5.pir
.sub main :main
## get cwd in $S0, load_ext in $S1.
.include "iglobals.pasm"
$P11 = getinterp
$P12 = $P11[.IGLOBALS_CONFIG_HASH]
$S0 = $P12["prefix"]
$S1 = $P12["load_ext"]
## convert $S0 to an absolute pathname with extension, and load it.
## this should always find the version in the build directory, since that's
## the only place "make test" will work.
$S0 = concat $S0, "/runtime/parrot/dynext/foo"
$S0 = concat $S0, $S1
loadlib $P1, $S0
## ensure that we can still make Foo instances.
$P1 = new "Foo"
$I1 = $P1
print $I1
print "\n"
.end
and foo_2.pir
.sub main :main
## load a relative pathname without the extension. loadlib will convert the
## '/' characters to '\\' on windows.
$S0 = "runtime/parrot/dynext/foo"
loadlib $P1, $S0
## ensure that we can still make Foo instances.
$P1 = new "Foo"
$I1 = $P1
print $I1
print "\n"
.end
The only conclusion I can reach at the moment is that loadlib is getting confused with the extension - parrot.nopt - in the directory without having the extension added as in test 5 - which passes.
If I copy parrot.nopt to parrot_nopt and rebuild - make realclean, perl Configure.pl, make - the test passes.
At this stage a workaround is not to use extensions in the parrot directory, but this needs further investigation.

