Search code examples
asp-classicvbscriptstack-overflow

Stack overflow error when do a loop inside another loop


In a classic ASP function, when I do a loop inside another as shown in the code below I have a stack overflow error.

Function shift(x,y)
    shift = x
    For i = 1 to y
    shift = shift*2
Next
End Function

Function translate_url(iVal)
sAlpha = "abcdefghijklmnopqrstuvwxyz-_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
doWrite = False
iBase = 63 'DO NOT CHANGE
For i = 4 to 0 step -1
    iPos = (iVal and shift(iBase, i*6))/shift(1, i*6)
    If iPos Then doWrite = True
    If doWrite Then translate_url = translate_url & Mid(sAlpha, iPos + 1,1)
Next
End Function

arr = Split("1,2,3,4,5,6,7,8,9,0",",")

For Each i In arr
response.Write(translate_url(arr(i)))
next

The error does not occur when I remove the loop outside the function. Eg:

response.Write(translate_url(arr(1)))

return "c".

What I need to do to make the code flows down the array and return the corresponding values ​​according to the function?


Solution

  • VBScript has a dark side. Variables scope is one of them.

    When you don't declare a variable, VBScript will do it for you, free of charge or error and give it global scope.

    What does it mean? Take a look in the main loop:

    For Each i In arr
        response.Write(translate_url(arr(i)))
    next
    

    The i variable becomes global. When you have this later in the function:

    For i = 4 to 0 step -1
        '...
    Next
    

    It's changing the same i variable. This is causing endless loop of function calls.

    To resolve this, declare i locally in each function:

    Function shift(x,y)
        Dim i
        '...
    End Function
    
    Function translate_url(iVal)
        Dim i
        '...
    End Function
    

    And it will be different variable and no overflow.