Came across a strange issue that causes an infinite loop within the program...
The culprit:
Not sure why. Probably a bug within the implementation. I believe this has also occurred in the past when I attempted to use Run on a block that returned the result of a JS function call.
OK
So, actually, there are ways that are built-in that allow taking pictures of scripts and stages and etc.
For anyone else who is wondering, I looked around through the source and found these 3 functions: morph.scriptsPicture() returns a canvas element for the blocks in the sprite / stage with a transparent background morph.fullImage() returns a canvas element for a group of blocks with a transparent background or of the sprite / stage morph.fullImageClassic() seems to be the same as above except if used on the stage it will show everything, not just the background
As for how I got the morphs, sent ring morphs have an expression value (that when the ring is empty, is an array with 1 element, the ring itself)
And this refers to the current sprite. I just passed my [stage] to get the stage but there might be a property for it