nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ClassEmitter.java
author lagergren
Thu, 25 Sep 2014 15:53:47 +0200
changeset 26768 751b0f427090
parent 26506 7d55cc7fc301
child 27206 d4a707c9db5a
permissions -rw-r--r--
8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt Reviewed-by: attila, hannesw, sundar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.codegen;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_FINAL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PRIVATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_STATIC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_SUPER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_VARARGS;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKEINTERFACE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKESPECIAL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKESTATIC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKEVIRTUAL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import static jdk.internal.org.objectweb.asm.Opcodes.H_NEWINVOKESPECIAL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import static jdk.internal.org.objectweb.asm.Opcodes.V1_7;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import static jdk.nashorn.internal.codegen.CompilerConstants.CLINIT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import static jdk.nashorn.internal.codegen.CompilerConstants.CONSTANTS;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import static jdk.nashorn.internal.codegen.CompilerConstants.GET_ARRAY_PREFIX;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
import static jdk.nashorn.internal.codegen.CompilerConstants.GET_ARRAY_SUFFIX;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import static jdk.nashorn.internal.codegen.CompilerConstants.GET_MAP;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import static jdk.nashorn.internal.codegen.CompilerConstants.GET_STRING;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import static jdk.nashorn.internal.codegen.CompilerConstants.INIT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import static jdk.nashorn.internal.codegen.CompilerConstants.SET_MAP;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
import static jdk.nashorn.internal.codegen.CompilerConstants.SOURCE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
import static jdk.nashorn.internal.codegen.CompilerConstants.STRICT_MODE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
import static jdk.nashorn.internal.codegen.CompilerConstants.className;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
import static jdk.nashorn.internal.codegen.CompilerConstants.methodDescriptor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
import static jdk.nashorn.internal.codegen.CompilerConstants.typeDescriptor;
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24725
diff changeset
    53
import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup;
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
    54
import java.io.ByteArrayOutputStream;
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
    55
import java.io.PrintWriter;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
    56
import java.security.AccessController;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
    57
import java.security.PrivilegedAction;
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26506
diff changeset
    58
import java.util.Collections;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
import java.util.EnumSet;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
import java.util.HashSet;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
import java.util.Set;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
import jdk.internal.org.objectweb.asm.ClassWriter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
import jdk.internal.org.objectweb.asm.MethodVisitor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
import jdk.internal.org.objectweb.asm.util.TraceClassVisitor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
import jdk.nashorn.internal.codegen.types.Type;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
import jdk.nashorn.internal.ir.FunctionNode;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    67
import jdk.nashorn.internal.ir.SplitNode;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
    68
import jdk.nashorn.internal.ir.debug.NashornClassReader;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
    69
import jdk.nashorn.internal.ir.debug.NashornTextifier;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
    70
import jdk.nashorn.internal.runtime.Context;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
import jdk.nashorn.internal.runtime.PropertyMap;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
    72
import jdk.nashorn.internal.runtime.RewriteException;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
import jdk.nashorn.internal.runtime.Source;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
 * The interface responsible for speaking to ASM, emitting classes,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
 * fields and methods.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
 * <p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
 * This file contains the ClassEmitter, which is the master object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
 * responsible for writing byte codes. It utilizes a MethodEmitter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
 * for method generation, which also the NodeVisitors own, to keep
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
 * track of the current code generator and what it is doing.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
 * <p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
 * There is, however, nothing stopping you from using this in a
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
 * completely self contained environment, for example in ObjectGenerator
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
 * where there are no visitors or external hooks.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
 * <p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
 * MethodEmitter makes it simple to generate code for methods without
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
 * having to do arduous type checking. It maintains a type stack
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
 * and will pick the appropriate operation for all operations sent to it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
 * We also allow chained called to a MethodEmitter for brevity, e.g.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
 * it is legal to write _new(className).dup() or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
 * load(slot).load(slot2).xor().store(slot3);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
 * <p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
 * If running with assertions enabled, any type conflict, such as different
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
 * bytecode stack sizes or operating on the wrong type will be detected
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
 * and an error thrown.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
 * <p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
 * There is also a very nice debug interface that can emit formatted
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
 * bytecodes that have been written. This is enabled by setting the
16272
675a0caf75bc 8009263: Fix all javadoc errors in nashorn code
sundar
parents: 16262
diff changeset
   102
 * environment "nashorn.codegen.debug" to true, or --log=codegen:{@literal <level>}
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
 * <p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
 * A ClassEmitter implements an Emitter - i.e. it needs to have
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
 * well defined start and end calls for whatever it is generating. Assertions
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
 * detect if this is not true
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
 * @see Compiler
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
public class ClassEmitter implements Emitter {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   111
    /** Default flags for class generation - public class */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   112
    private static final EnumSet<Flag> DEFAULT_METHOD_FLAGS = EnumSet.of(Flag.PUBLIC);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    /** Sanity check flag - have we started on a class? */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
    private boolean classStarted;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
    /** Sanity check flag - have we ended this emission? */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
    private boolean classEnded;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
     * Sanity checks - which methods have we currently
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
     * started for generation in this class?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
    private final HashSet<MethodEmitter> methodsStarted;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
    /** The ASM classwriter that we use for all bytecode operations */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
    protected final ClassWriter cw;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16250
diff changeset
   129
    /** The script environment */
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   130
    protected final Context context;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
    /** Compile unit class name. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
    private String unitClassName;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
    /** Set of constants access methods required. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    private Set<Class<?>> constantMethodNeeded;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   138
    private int methodCount;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   139
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   140
    private int initCount;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   141
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   142
    private int clinitCount;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   143
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   144
    private int fieldCount;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   145
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   146
    private final Set<String> methodNames;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   147
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
     * Constructor - only used internally in this class as it breaks
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
     * abstraction towards ASM or other code generator below
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
     *
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16250
diff changeset
   152
     * @param env script environment
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16250
diff changeset
   153
     * @param cw  ASM classwriter
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
     */
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   155
    private ClassEmitter(final Context context, final ClassWriter cw) {
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   156
        this.context        = context;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
        this.cw             = cw;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
        this.methodsStarted = new HashSet<>();
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   159
        this.methodNames    = new HashSet<>();
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   160
    }
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   161
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26506
diff changeset
   162
    /**
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26506
diff changeset
   163
     * Return the method names encountered
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26506
diff changeset
   164
     * @return method names
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26506
diff changeset
   165
     */
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   166
    public Set<String> getMethodNames() {
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26506
diff changeset
   167
        return Collections.unmodifiableSet(methodNames);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
     *
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16250
diff changeset
   173
     * @param env             script environment
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
     * @param className       name of class to weave
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
     * @param superClassName  super class name for class
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
     * @param interfaceNames  names of interfaces implemented by this class, or null if none
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
     */
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   178
    ClassEmitter(final Context context, final String className, final String superClassName, final String... interfaceNames) {
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   179
        this(context, new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
        cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, className, null, superClassName, interfaceNames);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
     * Constructor from the compiler
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
     *
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 17233
diff changeset
   186
     * @param env           Script environment
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 17233
diff changeset
   187
     * @param sourceName    Source name
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
     * @param unitClassName Compile unit class name.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
     * @param strictMode    Should we generate this method in strict mode
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
     */
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   191
    ClassEmitter(final Context context, final String sourceName, final String unitClassName, final boolean strictMode) {
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   192
        this(context,
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
             new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
                private static final String OBJECT_CLASS  = "java/lang/Object";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
                @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
                protected String getCommonSuperClass(final String type1, final String type2) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
                    try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
                        return super.getCommonSuperClass(type1, type2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
                    } catch (final RuntimeException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
                        if (isScriptObject(Compiler.SCRIPTS_PACKAGE, type1) && isScriptObject(Compiler.SCRIPTS_PACKAGE, type2)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
                            return className(ScriptObject.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
                        return OBJECT_CLASS;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
            });
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
        this.unitClassName        = unitClassName;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
        this.constantMethodNeeded = new HashSet<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
16275
d5d430071b22 8009379: Remove $ from generated class names
jlaskey
parents: 16272
diff changeset
   212
        cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, unitClassName, null, pathName(jdk.nashorn.internal.scripts.JS.class.getName()), null);
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   213
        cw.visitSource(sourceName, null);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
        defineCommonStatics(strictMode);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   218
    Context getContext() {
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   219
        return context;
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   220
    }
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24729
diff changeset
   221
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
    /**
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   223
     * Returns the name of the compile unit class name.
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   224
     * @return the name of the compile unit class name.
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   225
     */
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   226
    String getUnitClassName() {
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   227
        return unitClassName;
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   228
    }
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   229
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   230
    /**
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   231
     * Get the method count, including init and clinit methods
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   232
     * @return method count
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   233
     */
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   234
    public int getMethodCount() {
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   235
        return methodCount;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   236
    }
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   237
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   238
    /**
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   239
     * Get the clinit count
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   240
     * @return clinit count
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   241
     */
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   242
    public int getClinitCount() {
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   243
        return clinitCount;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   244
    }
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   245
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   246
    /**
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   247
     * Get the init count
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   248
     * @return init count
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   249
     */
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   250
    public int getInitCount() {
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   251
        return initCount;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   252
    }
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   253
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   254
    /**
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   255
     * Get the field count
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   256
     * @return field count
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   257
     */
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   258
    public int getFieldCount() {
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   259
        return fieldCount;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   260
    }
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   261
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   262
    /**
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   263
     * Convert a binary name to a package/class name.
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   264
     *
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   265
     * @param name Binary name.
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   266
     * @return Package/class name.
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   267
     */
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   268
    private static String pathName(final String name) {
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   269
        return name.replace('.', '/');
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   270
    }
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   271
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   272
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
     * Define the static fields common in all scripts.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
     * @param strictMode Should we generate this method in strict mode
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
    private void defineCommonStatics(final boolean strictMode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
        // source - used to store the source data (text) for this script.  Shared across
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
        // compile units.  Set externally by the compiler.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   279
        field(EnumSet.of(Flag.PRIVATE, Flag.STATIC), SOURCE.symbolName(), Source.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
        // constants - used to the constants array for this script.  Shared across
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
        // compile units.  Set externally by the compiler.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   283
        field(EnumSet.of(Flag.PRIVATE, Flag.STATIC), CONSTANTS.symbolName(), Object[].class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
        // strictMode - was this script compiled in strict mode.  Set externally by the compiler.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   286
        field(EnumSet.of(Flag.PUBLIC, Flag.STATIC, Flag.FINAL), STRICT_MODE.symbolName(), boolean.class, strictMode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
     * Define static utilities common needed in scripts.  These are per compile unit
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
     * and therefore have to be defined here and not in code gen.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
    private void defineCommonUtilities() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
        assert unitClassName != null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
        if (constantMethodNeeded.contains(String.class)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
            // $getString - get the ith entry from the constants table and cast to String.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   298
            final MethodEmitter getStringMethod = method(EnumSet.of(Flag.PRIVATE, Flag.STATIC), GET_STRING.symbolName(), String.class, int.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
            getStringMethod.begin();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   300
            getStringMethod.getStatic(unitClassName, CONSTANTS.symbolName(), CONSTANTS.descriptor())
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
                        .load(Type.INT, 0)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
                        .arrayload()
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
                        .checkcast(String.class)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
                        ._return();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
            getStringMethod.end();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
        if (constantMethodNeeded.contains(PropertyMap.class)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
            // $getMap - get the ith entry from the constants table and cast to PropertyMap.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   310
            final MethodEmitter getMapMethod = method(EnumSet.of(Flag.PUBLIC, Flag.STATIC), GET_MAP.symbolName(), PropertyMap.class, int.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
            getMapMethod.begin();
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   312
            getMapMethod.loadConstants()
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
                        .load(Type.INT, 0)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
                        .arrayload()
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
                        .checkcast(PropertyMap.class)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
                        ._return();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
            getMapMethod.end();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
            // $setMap - overwrite an existing map.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   320
            final MethodEmitter setMapMethod = method(EnumSet.of(Flag.PUBLIC, Flag.STATIC), SET_MAP.symbolName(), void.class, int.class, PropertyMap.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   321
            setMapMethod.begin();
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16275
diff changeset
   322
            setMapMethod.loadConstants()
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
                        .load(Type.INT, 0)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
                        .load(Type.OBJECT, 1)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
                        .arraystore();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
            setMapMethod.returnVoid();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
            setMapMethod.end();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
        // $getXXXX$array - get the ith entry from the constants table and cast to XXXX[].
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   331
        for (final Class<?> clazz : constantMethodNeeded) {
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   332
            if (clazz.isArray()) {
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   333
                defineGetArrayMethod(clazz);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
    /**
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24725
diff changeset
   339
     * Constructs a primitive specific method for getting the ith entry from the constants table as an array.
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   340
     * @param clazz Array class.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
     */
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   342
    private void defineGetArrayMethod(final Class<?> clazz) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
        assert unitClassName != null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   345
        final String        methodName     = getArrayMethodName(clazz);
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   346
        final MethodEmitter getArrayMethod = method(EnumSet.of(Flag.PRIVATE, Flag.STATIC), methodName, clazz, int.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
        getArrayMethod.begin();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   349
        getArrayMethod.getStatic(unitClassName, CONSTANTS.symbolName(), CONSTANTS.descriptor())
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
                      .load(Type.INT, 0)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
                      .arrayload()
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   352
                      .checkcast(clazz)
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24725
diff changeset
   353
                      .invoke(virtualCallNoLookup(clazz, "clone", Object.class))
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24725
diff changeset
   354
                      .checkcast(clazz)
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
                      ._return();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   356
        getArrayMethod.end();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   359
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
     * Generate the name of a get array from constant pool method.
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   362
     * @param clazz Name of array class.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
     * @return Method name.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
     */
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   365
    static String getArrayMethodName(final Class<?> clazz) {
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   366
        assert clazz.isArray();
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   367
        return GET_ARRAY_PREFIX.symbolName() + clazz.getComponentType().getSimpleName() + GET_ARRAY_SUFFIX.symbolName();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
     * Ensure a get constant method is issued for the class.
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   372
     * @param clazz Class of constant.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   373
     */
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   374
    void needGetConstantMethod(final Class<?> clazz) {
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   375
        constantMethodNeeded.add(clazz);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   378
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
     * Inspect class name and decide whether we are generating a ScriptObject class
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   381
     * @param scriptPrefix the script class prefix for the current script
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   382
     * @param type         the type to check
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   383
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
     * @return true if type is ScriptObject
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   386
    private static boolean isScriptObject(final String scriptPrefix, final String type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
        if (type.startsWith(scriptPrefix)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
            return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   389
        } else if (type.equals(CompilerConstants.className(ScriptObject.class))) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   390
            return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   391
        } else if (type.startsWith(Compiler.OBJECTS_PACKAGE)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   392
            return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   393
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   394
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   395
        return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   396
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   398
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   399
     * Call at beginning of class emission
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   400
     * @see Emitter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   401
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   403
    public void begin() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
        classStarted = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   405
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   406
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   407
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
     * Call at end of class emission
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
     * @see Emitter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   412
    public void end() {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   413
        assert classStarted : "class not started for " + unitClassName;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   414
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   415
        if (unitClassName != null) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   416
            final MethodEmitter initMethod = init(EnumSet.of(Flag.PRIVATE));
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   417
            initMethod.begin();
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   418
            initMethod.load(Type.OBJECT, 0);
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   419
            initMethod.newInstance(jdk.nashorn.internal.scripts.JS.class);
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   420
            initMethod.returnVoid();
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   421
            initMethod.end();
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   422
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
            defineCommonUtilities();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   424
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   425
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
        cw.visitEnd();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
        classStarted = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
        classEnded   = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
        assert methodsStarted.isEmpty() : "methodsStarted not empty " + methodsStarted;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
     * Disassemble an array of byte code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
     * @param bytecode  byte array representing bytecode
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   435
     * @return disassembly as human readable string
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   437
    static String disassemble(final byte[] bytecode) {
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   438
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   439
        try (final PrintWriter pw = new PrintWriter(baos)) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   440
            final NashornClassReader cr = new NashornClassReader(bytecode);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   441
            final Context ctx = AccessController.doPrivileged(new PrivilegedAction<Context>() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   442
                @Override
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   443
                public Context run() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   444
                    return Context.getContext();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   445
                }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   446
            });
24721
81f70e23cd3b 8036127: Prototype filter needs to be applied to getter guard as well, not just getter
lagergren
parents: 24719
diff changeset
   447
            final TraceClassVisitor tcv = new TraceClassVisitor(null, new NashornTextifier(ctx.getEnv(), cr), pw);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   448
            cr.accept(tcv, 0);
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16151
diff changeset
   449
        }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   450
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   451
        final String str = new String(baos.toByteArray());
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   452
        return str;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
     * Call back from MethodEmitter for method start
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   458
     * @see MethodEmitter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   460
     * @param method method emitter.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   462
    void beginMethod(final MethodEmitter method) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   463
        assert !methodsStarted.contains(method);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   464
        methodsStarted.add(method);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   465
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   467
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
     * Call back from MethodEmitter for method end
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   469
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   470
     * @see MethodEmitter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   472
     * @param method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   473
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   474
    void endMethod(final MethodEmitter method) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   475
        assert methodsStarted.contains(method);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
        methodsStarted.remove(method);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   479
    SplitMethodEmitter method(final SplitNode splitNode, final String methodName, final Class<?> rtype, final Class<?>... ptypes) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   480
        methodCount++;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   481
        methodNames.add(methodName);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   482
        return new SplitMethodEmitter(this, methodVisitor(EnumSet.of(Flag.PUBLIC, Flag.STATIC), methodName, rtype, ptypes), splitNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   483
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   484
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   485
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   486
     * Add a new method to the class - defaults to public method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   488
     * @param methodName name of method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   489
     * @param rtype      return type of the method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   490
     * @param ptypes     parameter types the method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   491
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   492
     * @return method emitter to use for weaving this method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   493
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   494
    MethodEmitter method(final String methodName, final Class<?> rtype, final Class<?>... ptypes) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
        return method(DEFAULT_METHOD_FLAGS, methodName, rtype, ptypes); //TODO why public default ?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
     * Add a new method to the class - defaults to public method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
     * @param methodFlags access flags for the method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   502
     * @param methodName  name of method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   503
     * @param rtype       return type of the method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   504
     * @param ptypes      parameter types the method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   505
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
     * @return method emitter to use for weaving this method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   508
    MethodEmitter method(final EnumSet<Flag> methodFlags, final String methodName, final Class<?> rtype, final Class<?>... ptypes) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   509
        methodCount++;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   510
        methodNames.add(methodName);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   511
        return new MethodEmitter(this, methodVisitor(methodFlags, methodName, rtype, ptypes));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   512
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   513
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   514
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   515
     * Add a new method to the class - defaults to public method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   516
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
     * @param methodName name of method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   518
     * @param descriptor descriptor of method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   519
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   520
     * @return method emitter to use for weaving this method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   521
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   522
    MethodEmitter method(final String methodName, final String descriptor) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   523
        return method(DEFAULT_METHOD_FLAGS, methodName, descriptor);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   524
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   525
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   526
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   527
     * Add a new method to the class - defaults to public method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   528
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   529
     * @param methodFlags access flags for the method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
     * @param methodName  name of method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   531
     * @param descriptor  descriptor of method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   532
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   533
     * @return method emitter to use for weaving this method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   534
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   535
    MethodEmitter method(final EnumSet<Flag> methodFlags, final String methodName, final String descriptor) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   536
        methodCount++;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   537
        methodNames.add(methodName);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   538
        return new MethodEmitter(this, cw.visitMethod(Flag.getValue(methodFlags), methodName, descriptor, null, null));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   539
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
     * Add a new method to the class, representing a function node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   543
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
     * @param functionNode the function node to generate a method for
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   545
     * @return method emitter to use for weaving this method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   546
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   547
    MethodEmitter method(final FunctionNode functionNode) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   548
        methodCount++;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   549
        methodNames.add(functionNode.getName());
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   550
        final FunctionSignature signature = new FunctionSignature(functionNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   551
        final MethodVisitor mv = cw.visitMethod(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   552
            ACC_PUBLIC | ACC_STATIC | (functionNode.isVarArg() ? ACC_VARARGS : 0),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   553
            functionNode.getName(),
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   554
            signature.toString(),
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   555
            null,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   556
            null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   557
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24745
diff changeset
   558
        return new MethodEmitter(this, mv, functionNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   561
    /**
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   562
     * Add a new method to the class, representing a rest-of version of the function node
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   563
     *
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   564
     * @param functionNode the function node to generate a method for
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   565
     * @return method emitter to use for weaving this method
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   566
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   567
    MethodEmitter restOfMethod(final FunctionNode functionNode) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   568
        methodCount++;
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   569
        methodNames.add(functionNode.getName());
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   570
        final MethodVisitor mv = cw.visitMethod(
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   571
            ACC_PUBLIC | ACC_STATIC,
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   572
            functionNode.getName(),
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   573
            Type.getMethodDescriptor(functionNode.getReturnType().getTypeClass(), RewriteException.class),
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   574
            null,
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   575
            null);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   576
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24745
diff changeset
   577
        return new MethodEmitter(this, mv, functionNode);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   578
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   579
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   580
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18618
diff changeset
   581
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
     * Start generating the <clinit> method in the class
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
     * @return method emitter to use for weaving <clinit>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   586
    MethodEmitter clinit() {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   587
        clinitCount++;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   588
        return method(EnumSet.of(Flag.STATIC), CLINIT.symbolName(), void.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   590
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   591
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   592
     * Start generating an <init>()V method in the class
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   593
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
     * @return method emitter to use for weaving <init>()V
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   596
    MethodEmitter init() {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   597
        initCount++;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   598
        return method(INIT.symbolName(), void.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   600
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   601
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   602
     * Start generating an <init>()V method in the class
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   603
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   604
     * @param ptypes parameter types for constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   605
     * @return method emitter to use for weaving <init>()V
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   606
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   607
    MethodEmitter init(final Class<?>... ptypes) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   608
        initCount++;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   609
        return method(INIT.symbolName(), void.class, ptypes);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   610
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   612
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
     * Start generating an <init>(...)V method in the class
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   615
     * @param flags  access flags for the constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   616
     * @param ptypes parameter types for the constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   617
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
     * @return method emitter to use for weaving <init>(...)V
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   620
    MethodEmitter init(final EnumSet<Flag> flags, final Class<?>... ptypes) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   621
        initCount++;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   622
        return method(flags, INIT.symbolName(), void.class, ptypes);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   623
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   624
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   625
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   626
     * Add a field to the class, initialized to a value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   628
     * @param fieldFlags flags, e.g. should it be static or public etc
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
     * @param fieldName  name of field
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
     * @param fieldType  the type of the field
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   631
     * @param value      the value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
     * @see ClassEmitter.Flag
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   634
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   635
    final void field(final EnumSet<Flag> fieldFlags, final String fieldName, final Class<?> fieldType, final Object value) {
26506
7d55cc7fc301 8057703: More empty classes generated by Nashorn
lagergren
parents: 25865
diff changeset
   636
        fieldCount++;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   637
        cw.visitField(Flag.getValue(fieldFlags), fieldName, typeDescriptor(fieldType), null, value).visitEnd();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   639
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   640
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
     * Add a field to the class
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
     * @param fieldFlags access flags for the field
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
     * @param fieldName  name of field
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
     * @param fieldType  type of the field
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
     * @see ClassEmitter.Flag
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   648
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   649
    final void field(final EnumSet<Flag> fieldFlags, final String fieldName, final Class<?> fieldType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   650
        field(fieldFlags, fieldName, fieldType, null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   651
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   652
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   653
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
     * Add a field to the class - defaults to public
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
     * @param fieldName  name of field
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
     * @param fieldType  type of field
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   659
    final void field(final String fieldName, final Class<?> fieldType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
        field(EnumSet.of(Flag.PUBLIC), fieldName, fieldType, null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   663
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   664
     * Return a bytecode array from this ClassEmitter. The ClassEmitter must
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   665
     * have been ended (having its end function called) for this to work.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   667
     * @return byte code array for generated class, null if class generation hasn't been ended with {@link ClassEmitter#end()}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   669
    byte[] toByteArray() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
        assert classEnded;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
        if (!classEnded) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
        return cw.toByteArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   676
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   678
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
     * Abstraction for flags used in class emission
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   680
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   681
     * We provide abstraction separating these from the underlying bytecode
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   682
     * emitter.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   683
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   684
     * Flags are provided for method handles, protection levels, static/virtual
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
     * fields/methods.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
     */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   687
    static enum Flag {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
        /** method handle with static access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
        HANDLE_STATIC(H_INVOKESTATIC),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   690
        /** method handle with new invoke special access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
        HANDLE_NEWSPECIAL(H_NEWINVOKESPECIAL),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   692
        /** method handle with invoke special access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   693
        HANDLE_SPECIAL(H_INVOKESPECIAL),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   694
        /** method handle with invoke virtual access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   695
        HANDLE_VIRTUAL(H_INVOKEVIRTUAL),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   696
        /** method handle with invoke interface access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   697
        HANDLE_INTERFACE(H_INVOKEINTERFACE),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   698
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   699
        /** final access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   700
        FINAL(ACC_FINAL),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   701
        /** static access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   702
        STATIC(ACC_STATIC),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   703
        /** public access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   704
        PUBLIC(ACC_PUBLIC),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   705
        /** private access */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   706
        PRIVATE(ACC_PRIVATE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   707
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   708
        private int value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   709
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   710
        private Flag(final int value) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   711
            this.value = value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   713
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   714
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   715
         * Get the value of this flag
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   716
         * @return the int value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   717
         */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   718
        int getValue() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   719
            return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   720
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   721
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   722
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   723
         * Return the corresponding ASM flag value for an enum set of flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   724
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   725
         * @param flags enum set of flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   726
         * @return an integer value representing the flags intrinsic values or:ed together
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   727
         */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   728
        static int getValue(final EnumSet<Flag> flags) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   729
            int v = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   730
            for (final Flag flag : flags) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   731
                v |= flag.getValue();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   732
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   733
            return v;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   734
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
    }
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   736
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24721
diff changeset
   737
    private MethodVisitor methodVisitor(final EnumSet<Flag> flags, final String methodName, final Class<?> rtype, final Class<?>... ptypes) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   738
        return cw.visitMethod(Flag.getValue(flags), methodName, methodDescriptor(rtype, ptypes), null, null);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   739
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   740
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   741
}