id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc	lang	patch	platform
386	Failure in t/dynpmc/foo.t if parrot directory has an extension	mikehh		"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."	bug	closed	normal		none	trunk	medium	fixed		rg@…			
