# New Ticket Created by  "Clinton A. Pierce" 
# Please include the string:  [netlabs #716]
# in the subject line of all future correspondence about this issue. 
# <URL: http://bugs6.perl.org/rt2/Ticket/Display.html?id=716 >


Background:

String variables in BASIC are stored in the P21 PMC.  When I ty to
set a variable I say:

        save "variablename"
        save "value"
        bsr SSTORE

And to restore it I call:

        save "variablename"
        bsr SFETCH

The code for these is located in basicvar.pasm and for your convenience:

SSTORE: pushs
        restore S1  # Value
        restore S0  # Name
        set P21[S0], S1
        pops
        ret
        
SFETCH: pushs
        pushi
        restore S0  # Name
        set S1, P21, S0
        length I0, S1   # Works around an odd bug (may no longer exist)
        ne I0, 0, SNOTNULL
        set S1, ""
SNOTNUL: save S1
        popi
        pops
        ret

When I run this code the store looks like this (from parrot -t):

PC=2241; OP=703 (bsr_ic); ARGS=(-1043)
PC=1198; OP=676 (pushs)
PC=1199; OP=693 (restore_s); ARGS=(S1="Y")
PC=1201; OP=693 (restore_s); ARGS=(S0="HELLO")
PC=1203; OP=215 (set_keyed_p_s_s); ARGS=(P21=002F8040, S0="Y", S1="HELLO")
PC=1207; OP=672 (pops)
PC=1208; OP=738 (ret)

The bsr's there, the push, two restores and the proper call to set_keyed.
Now when I go to fetch that value:

PC=5277; OP=703 (bsr_ic); ARGS=(-4068)
PC=1209; OP=676 (pushs)
PC=1210; OP=674 (pushi)
PC=1211; OP=693 (restore_s); ARGS=(S0="Y")
PC=1213; OP=152 (set_s_p_s); ARGS=(S1="Y", P21=002F8040, S0="Y")
Cannot fetch string out of non-string key!

There's the bsr, I save off the string and integer pointers restore the
variable name to fetch and then try to fetch it...and it crashes.

Notes:

* Other than the "new", these are the only keyed accesses to P21
in the trace.

* To reproduce for yourself:
      1. Start basic.pl
      2. Type LET Y$='HELLO'
      3. Type PRINT Y$

* Curiously enough, fetching on a key that doesn't yet exist doesn't
(and correctly doesn't) throw this error and just returns the empty
string.  [So if you leave off the LET Y$ part of the example off, it
works fine.]

Good luck.



Reply via email to