Bracket nesting level exceeded maximum of 256
Monkey Forums/Monkey Bug Reports/Bracket nesting level exceeded maximum of 256
| ||
| When compiling an application for the GLFW3 target on macOS, I get the following error: "fatal error: bracket nesting level exceeded maximum of 256" This seems to happen because I have a VERY long Select statement that is expanded into a set of indented if else blocks in the generated C++ code. I tried adding this to the top of my program: #CC_OPTS+="-fbracket-depth=1024" But it didn't work because it seems that CC_OPTS is only taken into account in the C++ Tool target (which is a shame, it would be great to be able to specify additional compile options on any C++ targets). |
| ||
| Sounds like a design problem in your app. ;) |
| ||
| The latest version of MonkeyX has #GLFW_GCC_CC_OPTS and #GLFW_GCC_LD_OPTS for the GLFW target. But you should rethink the app design. |
| ||
| I wouldn't go as far as to say that having a long Select statement is a design flaw :) I am using a custom scripting language where every function exported by the host has an assigned id number. When the script executes a function in the host, it uses this Select statement to run the correct function based on the id. The entire Select statement is autogenerated, and I can't think of a more efficient way to implement this (and I have seen this design in other interpreted languages). Thanks for the info on #GLFW_GCC_CC_OPTS and #GLFW_GCC_LD_OPTS! I was looking for something like this, but for some reason I couldn't find these in the docs. I have upgraded my Monkey version to 87b, and added #GLFW_GCC_CC_OPTS+="-fbracket-depth=1024", but it seems to ignore this setting, so the bug is still there. |
| ||
| Use a Map or HashMap with instances of classes if you're having this issue. Giant switch statements are maintenance nightmares. Alternatively, you could break it down into groups. When 0-15: switch statement with 0-15 When 16-31: switch statement with 16-31 When 32-47: switch statement with 32-47 When 48-63: switch statement with 48-63 etc., etc., etc. |
| ||
| Using maps is not an option in this case, since I can't store functions into them. Since the file with the Select statement is autogenerated, I am changing the generator right now to split the check into several Select statements as you suggested :) Thanks! |
| ||
| Edit: I had forgotten how Monkey generates Select statements. So yeah, just splitting it up will work just fine without needing to use the call stack. For every if/else statement the next group will increase the limitation. At 16 per group, by 240 groups, that's the limit. Original Post: I honestly didn't explain what I meant by splitting them up very well and I'm sorry about that. What I said will still probably produce the brackets limit problem. If it doesn't, great, but if it does, this is what I actually meant... I wrote this... When 0-15: switch statement with 0-15 When 16-31: switch statement with 16-31 When 32-47: switch statement with 32-47 When 48-63: switch statement with 48-63 etc., etc., etc. What I meant was this If s >= 0 && s <= 15
s0to15(s)
ElseIf s >= 16 && s <= 31
s16to31(s)
...
Function s0to15:Void( opCode:Int )
Select opCode
Case 0:
Do0()
Case 1:
Do1()
....
End
End
... |
| ||
| I did something similar to that and it works perfectly :) Thanks! |