Testing Compiler Limits

Hello Synths,

I was reading the Literals documentation and tried to check the Compiler Limits section. It says that

A single function may contain no more than 256 selectors. If this limit is exceeded, a compiler error is printed:

ERROR: Selector table too big: too many classes, method selectors or function definitions in this function. Simplify the function.

On Windows 10, SC 3.10.3, I tried to evaluate 602 selectors, and everything works fine. But when I try to evaluate 702 selectors the whole program crashes and a qtwebengineprocess.exe appears consuming around 20% of CPU(i7). Is it supposed to print an error instead of crashing? I have not post it on github yet because I am really new to these development topics and I was only trying to dig some basic stuff on the help filesā€¦

Here is the code:

//602 selectors - 300 SinOsc, 300 .ar, 1 {}, 1
{[SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),]}

//702 selectors - 350 SinOsc, 350 .ar, 1 {}, 1
{[SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),SinOsc.ar(),]}

All the best,
Zc

hi ze, a ā€œselectorā€ or method selector is a distinct method name. for example, SinOsc.ar and Pulse.ar are distinct method calls, but have the same method selector ar. your code consists of hundreds of method calls, but thereā€™s only one method selector being used, so you wonā€™t max out the selector table this way

i think youā€™re running into a different problem, probably on the IDE side. maybe the code is just too long?

back to the selector table issue, if you want to get the ā€œselector table too big errorā€, you can make a code sample like SinOsc.ar0;SinOsc.ar1;SinOsc.ar2;... and so forth:

("{" ++ ({ |i| "SinOsc.ar%;".format(i) } ! 700).join("") ++ "}").interpret
1 Like

I got it now! Thanks!

Do you think it worth creating an issue about this IDE problem on SC github ?

I just tried to break the problem down. First, construct the string in the language and interpret it there (IDE never touches the long code string). No crash, no hang, no CPU-intensive process.

x = "{[" ++ Array.fill(350, "SinOsc.ar()").join(",") ++ "]}";

y = x.interpret;

z = y.value;

All 3 steps are very fast and return the right result. So thereā€™s nothing wrong with the compiler.

But if I take the ā€˜xā€™ string and put it into a document ā€“ d = Document(string: x); ā€“ and execute the documentā€™s contents, then I do see ā€œSuperCollider IDEā€ using high CPU for about a half second before the result is posted.

But but if I add line breaks into the string:

x = "{[" ++ Array.fill(350, "SinOsc.ar()").join(",\n") ++ "]}";
d = Document(string: x);

ā€¦ and run this from the document window, then there is no delay and no high CPU usage.

In the first case, you have a single line of code thatā€™s over 4000 characters (and thereā€™s a problem). But, Iā€™ve tested with documents containing 70,000 characters (with line breaks) and there is no problem.

TL;DR Use line breaks.

Possibly an issue might be logged for better handling of very long lines of code, but tbh I donā€™t think itā€™s worth it. In real life, nobody is going to write thousands of characters in a single line of code ā€“ itā€™s unreadable and harder to maintain. I wouldnā€™t expect SC developers to spend a lot of time to find out where is the delay in an action that nobody will ever really take.

hjh

2 Likes

Itā€™s good to know that SC can handle documents better! Thanks for that as well!