  Multi-stage languages support generative metaprogramming via macros evaluated
in a process preceding the actual interpretation or compilation of the program
in which they are used. Macros update the source of their hosting program by
emitting code that takes their place in the file, while their code may also be
produced, fully or partially, by nested macros. All macros at the same nesting
belong to the same stage, with the outer stage collecting the macros affect-ing
only the main program. We extended JavaScript with staging annotations and
implemented them in Spider Monkey, emitting pure JavaScript code as the final
outcome of stage computation. We discuss how the original Spider Monkey system
is minimally affected with extensions in the syntax, parser and internal AST
structures, and the addition of an unparser, a staging loop, some library
functions and a debugger backend component for AST inspection. Since stages
have a generative metaprogramming role we do not foresee any interplay with the
browser DOM, and thus there is no reason to repeat their evalua-tion on every
page load. Hence, such JavaScript extensions are meant only for
development-time, emitting pure JavaScript code that can be run in any browser.
Finally, to enable debugging stages in any browser we implemented a pure
JavaScript client, communicating with the extended Spider Monkey, and offering
the necessary AST display and unparsing that a browser debugger does not
provide.
