On Sat, Jul 31, 2010 at 1:57 AM, nullPointer
<epicfan@gmail.com> wrote:
I get that error when I try save a CLView builded with the UIBuilder
More than 256 literals referenced.
You must split or otherwise simplify this method.
The 257th literal is: 128
Select Proceed to continue, or close this window to cancel the operation.
How I can solve that problem? The method than I try save is generated
programmatically...
A proper fix requires new bytecodes, but if your method contains lots of explicit literal references, not just lots of message selectors or global varaiables, then there is a workaround. �The problem is due to encoding ranges in message send and literal reference bytecodes which are limited to a 0 to 255 single byte range. �There is no way around this limitation for message selectors or global variables without defining as bytecode with an extended range, but for explicit references if you put your literals in multiple arrays and access them by index you can pool the indices. �This can be done either at the compiler level or at the generation level, but you should start working at the generation level. �e.g.
myMethod
�� �| litPool0 litPool1 litPool2 litPool3 |
�� �litPool0 := #( a literal array with up to 128 elements).
�� �litPool1 := #( a literal array with up to 128 elements).
�� �litPool2 := #( a literal array with up to 128 elements).
�� �litPool3 := #( a literal array with up to 128 elements).�� �....
�� �self doSomethingWith: (litPool2 at: 127)
�� �...
Your method now uses 1 literal for each pool and 1 literal for each array index other than 1 & 2 (1 & 2 have special bytecodes for them, as does the selector #at:). �So, assuming every index is used, the above method uses 4 + 126 = 130 literals, leaving 126 literals for selectors and globals, while providing access to 512 explicit literals in the pool literal arrays. �If you were to make the literal pools 256 elements large you'd loose because you'd need as many literals for the indices 3 to 256 as you saved from making the literal pool indirect. �So using more smaller pools increases the total number of �literals, e.g. with 8 64-element pools the above example uses 8 + 62 = 70 literals.
When we can get to it we need to redefine the bytecode set to extend these ranges. �Take a look at the VisualWorks bytecodes for a better encoding scheme.
HTH