[Newbies] Re: More than 256 literals referenced.

nicolas cellier ncellier at ifrance.com
Mon Jul 23 21:33:59 UTC 2007


Robert Stehwien a écrit :
> What is the source of the error produced by the following code?
> ----------
> initialize
>     table := OrderedCollection new.
> 
>     "there  are 100 entries like what is below"
> 
>     table add: ({
>         #value->2.
>         #cost->-3.
>         #step->2.
>         #defense->3.
>         #combatMove->7.
>         #fullMove->14.
>         #carry->10.
>         #lift->20.
>         #death->20.
>         #unconscious->11.
>         #woundThreshold->4.
>         #recovery->0.5.
>         #mysticArmor->0.
>     } as: Dictionary).
> ----------
> More than 256 literals referenced.
> You must split or otherwise simplify this method.
> The 257th literal is: 4360
> ----------
> 
> I'm trying to create a data table for a program and I'm wondering if
> I'm limited to 256 literals per class or method.  I tried initilizing
> the table in multiple methods (setting 50 per method) but get the same
> error.
> 
> I'll probably just put the data in a database and do the lookup when
> needed or load the table from a file.  But I wanted to know the source
> of the problem.
> 
> Thanks,
> Robert

The limitation is per-method.
Beware, message selectors count for 1 literal (except some special 
selectors)
Also Class names or class variables consume 1 slot...

There, you have (#OrderedCollection -> OrderedCollection), #new, #add, 
#->, #as: (#Dictionary -> Dictionary)...

There are other limitations, like number of argument per message, number 
of temporary variables per method, number of instance variables per 
class, length of blocks in an optimized ifTrue: [] ifFalse [] or [] 
whileTrue: [] or  to:do:[] construct...

This is based on the assumption that a Smalltalk method SHOULD be small.

You can for example write as a workaround
	table := Dictionary new.
	#(
		#(#value 2)
		#(#cost 3)
		#(#etc 0.1)
	) do: [:pair | table at: pair first put: pair last].

Nicolas



More information about the Beginners mailing list