justinmeza/lci

Assigning UPPIN variable to external variable

Closed this issue · 2 comments

Consider this code:

HAI 1.2
    I HAS A FIFTY ITZ 0
    IM IN YR TEST UPPIN YR NNN WILE DIFFRINT NNN 100
        BOTH SAEM NNN 50, O RLY?
            YA RLY, FIFTY R NNN
        OIC
    IM OUTTA YR TEST
    VISIBLE FIFTY
KTHXBYE

I expect this to output 50, but I get 100.
If we change the YA RLY line to YA RLY, FIFTY R SUM OF NNN 0 we correctly get 50.
Is this a problem with scoping and variables value/reference assignment?

Ah, good catch! This is indeed a bug that's been there for awhile. Basically, it happens because copying values in lci (as is done with "FIFTY R NNN") does not actually copy the value of NNN to FIFTY, but just increments a reference count to the same value as NNN and then has FIFTY reference the same value. (This is an efficiency hack to prevent lots of data movement -- copies are just an addition operation. When references go to 0 then the data is never used again and can safely be free'd.)

This behavior is correct and works fine for interpreted code, but the problem is that interpreter code that directly modifies the data stored in values (which I think only appears in for statements -- though I cannot recall if this is definitely the case) also modifies the value of any other references (as is done here https://github.com/justinmeza/lci/blob/master/interpreter.c#L3476-L3479).

The fix is to create a new value when updating the loop induction variable so after NNN is updated, FIFTY will reference a value with data 50 and NNN will reference an new value with data 51. I'll push a fix to master and future.

OK, fix pushed. Closing this issue!