Class Codegen

  • All Implemented Interfaces:
    Evaluator

    public class Codegen
    extends java.lang.Object
    implements Evaluator
    This class generates code for a given IR tree.
    • Field Detail

      • DEFAULT_MAIN_METHOD_CLASS

        static final java.lang.String DEFAULT_MAIN_METHOD_CLASS
        See Also:
        Constant Field Values
      • SUPER_CLASS_NAME

        private static final java.lang.String SUPER_CLASS_NAME
        See Also:
        Constant Field Values
      • REGEXP_INIT_METHOD_NAME

        static final java.lang.String REGEXP_INIT_METHOD_NAME
        See Also:
        Constant Field Values
      • REGEXP_INIT_METHOD_SIGNATURE

        static final java.lang.String REGEXP_INIT_METHOD_SIGNATURE
        See Also:
        Constant Field Values
      • TEMPLATE_LITERAL_INIT_METHOD_NAME

        static final java.lang.String TEMPLATE_LITERAL_INIT_METHOD_NAME
        See Also:
        Constant Field Values
      • TEMPLATE_LITERAL_INIT_METHOD_SIGNATURE

        static final java.lang.String TEMPLATE_LITERAL_INIT_METHOD_SIGNATURE
        See Also:
        Constant Field Values
      • FUNCTION_INIT_SIGNATURE

        static final java.lang.String FUNCTION_INIT_SIGNATURE
        See Also:
        Constant Field Values
      • FUNCTION_CONSTRUCTOR_SIGNATURE

        static final java.lang.String FUNCTION_CONSTRUCTOR_SIGNATURE
        See Also:
        Constant Field Values
      • globalLock

        private static final java.lang.Object globalLock
      • globalSerialClassCounter

        private static int globalSerialClassCounter
      • directCallTargets

        private ObjArray directCallTargets
      • scriptOrFnIndexes

        private ObjToIntMap scriptOrFnIndexes
      • mainMethodClass

        private java.lang.String mainMethodClass
      • mainClassName

        java.lang.String mainClassName
      • mainClassSignature

        java.lang.String mainClassSignature
      • itsConstantList

        private double[] itsConstantList
      • itsConstantListSize

        private int itsConstantListSize
    • Constructor Detail

      • Codegen

        public Codegen()
    • Method Detail

      • captureStackInfo

        public void captureStackInfo​(RhinoException ex)
        Description copied from interface: Evaluator
        Capture stack information from the given exception.
        Specified by:
        captureStackInfo in interface Evaluator
        Parameters:
        ex - an exception thrown during execution
      • getSourcePositionFromStack

        public java.lang.String getSourcePositionFromStack​(Context cx,
                                                           int[] linep)
        Description copied from interface: Evaluator
        Get the source position information by examining the stack.
        Specified by:
        getSourcePositionFromStack in interface Evaluator
        Parameters:
        cx - Context
        linep - Array object of length >= 1; getSourcePositionFromStack will assign the line number to linep[0].
        Returns:
        the name of the file or other source container
      • getPatchedStack

        public java.lang.String getPatchedStack​(RhinoException ex,
                                                java.lang.String nativeStackTrace)
        Description copied from interface: Evaluator
        Given a native stack trace, patch it with script-specific source and line information
        Specified by:
        getPatchedStack in interface Evaluator
        Parameters:
        ex - exception
        nativeStackTrace - the native stack trace
        Returns:
        patched stack trace
      • getScriptStack

        public java.util.List<java.lang.String> getScriptStack​(RhinoException ex)
        Description copied from interface: Evaluator
        Get the script stack for the given exception
        Specified by:
        getScriptStack in interface Evaluator
        Parameters:
        ex - exception from execution
        Returns:
        list of strings for the stack trace
      • setEvalScriptFlag

        public void setEvalScriptFlag​(Script script)
        Description copied from interface: Evaluator
        Mark the given script to indicate it was created by a call to eval() or to a Function constructor.
        Specified by:
        setEvalScriptFlag in interface Evaluator
        Parameters:
        script - script to mark as from eval
      • compile

        public java.lang.Object compile​(CompilerEnvirons compilerEnv,
                                        ScriptNode tree,
                                        java.lang.String encodedSource,
                                        boolean returnFunction)
        Description copied from interface: Evaluator
        Compile the script or function from intermediate representation tree into an executable form.
        Specified by:
        compile in interface Evaluator
        Parameters:
        compilerEnv - Compiler environment
        tree - parse tree
        encodedSource - encoding of the source code for decompilation
        returnFunction - if true, compiling a function
        Returns:
        an opaque object that can be passed to either createFunctionObject or createScriptObject, depending on the value of returnFunction
      • createScriptObject

        public Script createScriptObject​(java.lang.Object bytecode,
                                         java.lang.Object staticSecurityDomain)
        Description copied from interface: Evaluator
        Create a script object.
        Specified by:
        createScriptObject in interface Evaluator
        Parameters:
        bytecode - opaque object returned by compile
        staticSecurityDomain - security domain
        Returns:
        Script object that can be evaluated
      • createFunctionObject

        public Function createFunctionObject​(Context cx,
                                             Scriptable scope,
                                             java.lang.Object bytecode,
                                             java.lang.Object staticSecurityDomain)
        Description copied from interface: Evaluator
        Create a function object.
        Specified by:
        createFunctionObject in interface Evaluator
        Parameters:
        cx - Current context
        scope - scope of the function
        bytecode - opaque object returned by compile
        staticSecurityDomain - security domain
        Returns:
        Function object that can be called
      • defineClass

        private java.lang.Class<?> defineClass​(java.lang.Object bytecode,
                                               java.lang.Object staticSecurityDomain)
      • compileToClassFile

        public byte[] compileToClassFile​(CompilerEnvirons compilerEnv,
                                         java.lang.String mainClassName,
                                         ScriptNode scriptOrFn,
                                         java.lang.String encodedSource,
                                         boolean returnFunction)
      • transform

        private void transform​(ScriptNode tree)
      • initOptFunctions_r

        private static void initOptFunctions_r​(ScriptNode scriptOrFn)
      • initScriptNodesData

        private void initScriptNodesData​(ScriptNode scriptOrFn)
      • collectScriptNodes_r

        private static void collectScriptNodes_r​(ScriptNode n,
                                                 ObjArray x)
      • generateCode

        private byte[] generateCode​(java.lang.String encodedSource)
      • isGenerator

        static boolean isGenerator​(ScriptNode node)
      • generateResumeGenerator

        private void generateResumeGenerator​(ClassFileWriter cfw)
      • generateCallMethod

        private void generateCallMethod​(ClassFileWriter cfw,
                                        boolean isStrictMode)
      • generateExecute

        private static void generateExecute​(ClassFileWriter cfw)
      • generateScriptCtor

        private static void generateScriptCtor​(ClassFileWriter cfw)
      • generateFunctionConstructor

        private void generateFunctionConstructor​(ClassFileWriter cfw)
      • generateNativeFunctionOverrides

        private void generateNativeFunctionOverrides​(ClassFileWriter cfw,
                                                     java.lang.String encodedSource)
      • emitTemplateLiteralInit

        private void emitTemplateLiteralInit​(ClassFileWriter cfw)
        Overview:
         for each fn in functions(script) do
           let field = []
           for each templateLiteral in templateLiterals(fn) do
             let values = concat([[cooked(s), raw(s)] | s <- strings(templateLiteral)])
             field.push(values)
           end
           class[getTemplateLiteralName(fn)] = field
         end
         
      • emitConstantDudeInitializers

        private void emitConstantDudeInitializers​(ClassFileWriter cfw)
      • pushNumberAsObject

        void pushNumberAsObject​(ClassFileWriter cfw,
                                double num)
      • addDoubleWrap

        private static void addDoubleWrap​(ClassFileWriter cfw)
      • getStaticConstantWrapperType

        private static java.lang.String getStaticConstantWrapperType​(double num)
      • getDirectCtorName

        java.lang.String getDirectCtorName​(ScriptNode n)
      • getBodyMethodName

        java.lang.String getBodyMethodName​(ScriptNode n)
      • cleanName

        java.lang.String cleanName​(ScriptNode n)
        Gets a Java-compatible "informative" name for the the ScriptOrFnNode
      • getBodyMethodSignature

        java.lang.String getBodyMethodSignature​(ScriptNode n)
      • getFunctionInitMethodName

        java.lang.String getFunctionInitMethodName​(OptFunctionNode ofn)
      • getCompiledRegexpName

        java.lang.String getCompiledRegexpName​(ScriptNode n,
                                               int regexpIndex)
      • getTemplateLiteralName

        java.lang.String getTemplateLiteralName​(ScriptNode n)
      • badTree

        static java.lang.RuntimeException badTree()
      • setMainMethodClass

        public void setMainMethodClass​(java.lang.String className)