nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java
author hannesw
Fri, 25 Nov 2016 14:20:24 +0100
changeset 42376 8604f1a50c30
parent 39165 f0000753cecd
permissions -rw-r--r--
8170322: Specialized functions convert booleans to numbers Reviewed-by: jlaskey, attila
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.tools.nasgen;
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.AALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static jdk.internal.org.objectweb.asm.Opcodes.AASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_STATIC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import static jdk.internal.org.objectweb.asm.Opcodes.ACONST_NULL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import static jdk.internal.org.objectweb.asm.Opcodes.ALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import static jdk.internal.org.objectweb.asm.Opcodes.ANEWARRAY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import static jdk.internal.org.objectweb.asm.Opcodes.ARETURN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import static jdk.internal.org.objectweb.asm.Opcodes.ASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import static jdk.internal.org.objectweb.asm.Opcodes.BALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import static jdk.internal.org.objectweb.asm.Opcodes.BASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import static jdk.internal.org.objectweb.asm.Opcodes.BIPUSH;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import static jdk.internal.org.objectweb.asm.Opcodes.CALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import static jdk.internal.org.objectweb.asm.Opcodes.CASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import static jdk.internal.org.objectweb.asm.Opcodes.CHECKCAST;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import static jdk.internal.org.objectweb.asm.Opcodes.DALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
import static jdk.internal.org.objectweb.asm.Opcodes.DASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import static jdk.internal.org.objectweb.asm.Opcodes.DCONST_0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import static jdk.internal.org.objectweb.asm.Opcodes.DRETURN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import static jdk.internal.org.objectweb.asm.Opcodes.DUP;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import static jdk.internal.org.objectweb.asm.Opcodes.DUP2;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
import static jdk.internal.org.objectweb.asm.Opcodes.FALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
import static jdk.internal.org.objectweb.asm.Opcodes.FASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
import static jdk.internal.org.objectweb.asm.Opcodes.FCONST_0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
import static jdk.internal.org.objectweb.asm.Opcodes.FRETURN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
import static jdk.internal.org.objectweb.asm.Opcodes.GETFIELD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
import static jdk.internal.org.objectweb.asm.Opcodes.GETSTATIC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKESTATIC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
import static jdk.internal.org.objectweb.asm.Opcodes.IALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
import static jdk.internal.org.objectweb.asm.Opcodes.IASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_0;
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
    58
import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_1;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
import static jdk.internal.org.objectweb.asm.Opcodes.ILOAD;
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 16151
diff changeset
    60
import static jdk.internal.org.objectweb.asm.Opcodes.INVOKEINTERFACE;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
import static jdk.internal.org.objectweb.asm.Opcodes.INVOKESPECIAL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
import static jdk.internal.org.objectweb.asm.Opcodes.INVOKESTATIC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
import static jdk.internal.org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
import static jdk.internal.org.objectweb.asm.Opcodes.IRETURN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
import static jdk.internal.org.objectweb.asm.Opcodes.ISTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
import static jdk.internal.org.objectweb.asm.Opcodes.LALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
import static jdk.internal.org.objectweb.asm.Opcodes.LASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
import static jdk.internal.org.objectweb.asm.Opcodes.LCONST_0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
import static jdk.internal.org.objectweb.asm.Opcodes.LRETURN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
import static jdk.internal.org.objectweb.asm.Opcodes.NEW;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
import static jdk.internal.org.objectweb.asm.Opcodes.POP;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
import static jdk.internal.org.objectweb.asm.Opcodes.PUTFIELD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
import static jdk.internal.org.objectweb.asm.Opcodes.PUTSTATIC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
import static jdk.internal.org.objectweb.asm.Opcodes.RETURN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
import static jdk.internal.org.objectweb.asm.Opcodes.SALOAD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
import static jdk.internal.org.objectweb.asm.Opcodes.SASTORE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
import static jdk.internal.org.objectweb.asm.Opcodes.SIPUSH;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
import static jdk.internal.org.objectweb.asm.Opcodes.SWAP;
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
    79
import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT;
36517
41a1c20eb619 8142968: Module System implementation
alanb
parents: 26892
diff changeset
    80
import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJ_ANNO_PKG;
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
    81
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SPECIALIZATION_INIT2;
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
    82
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SPECIALIZATION_INIT3;
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
    83
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SPECIALIZATION_TYPE;
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
    84
import static jdk.nashorn.internal.tools.nasgen.StringConstants.TYPE_SPECIALIZATION;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
import java.util.List;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
import jdk.internal.org.objectweb.asm.Handle;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
import jdk.internal.org.objectweb.asm.MethodVisitor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
import jdk.internal.org.objectweb.asm.Type;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
 * Base class for all method generating classes.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
public class MethodGenerator extends MethodVisitor {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
    private final int access;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
    private final String name;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
    private final String descriptor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
    private final Type returnType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
    private final Type[] argumentTypes;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
36517
41a1c20eb619 8142968: Module System implementation
alanb
parents: 26892
diff changeset
   101
    static final Type EMPTY_LINK_LOGIC_TYPE = Type.getType("L" + OBJ_ANNO_PKG + "SpecializedFunction$LinkLogic$Empty;");
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   102
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
    MethodGenerator(final MethodVisitor mv, final int access, final String name, final String descriptor) {
26070
1c348e8d9b88 8055395: Nashorn should use source, target to be 1.8 and use ASM5 version for generated code
sundar
parents: 24719
diff changeset
   104
        super(Main.ASM_VERSION, mv);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
        this.access        = access;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
        this.name          = name;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
        this.descriptor    = descriptor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
        this.returnType    = Type.getReturnType(descriptor);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
        this.argumentTypes = Type.getArgumentTypes(descriptor);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
    int getAccess() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
        return access;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
    final String getName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
        return name;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
    final String getDescriptor() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
        return descriptor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
    final Type getReturnType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
        return returnType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    final Type[] getArgumentTypes() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
        return argumentTypes;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
     * Check whether access for this method is static
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
     * @return true if static
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    protected final boolean isStatic() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
        return (getAccess() & ACC_STATIC) != 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
     * Check whether this method is a constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
     * @return true if constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
    protected final boolean isConstructor() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
        return "<init>".equals(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
    void newObject(final String type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
        super.visitTypeInsn(NEW, type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
    void newObjectArray(final String type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
        super.visitTypeInsn(ANEWARRAY, type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
    void loadThis() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
        if ((access & ACC_STATIC) != 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
            throw new IllegalStateException("no 'this' inside static method");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
        super.visitVarInsn(ALOAD, 0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
    void returnValue() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
        super.visitInsn(returnType.getOpcode(IRETURN));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
    void returnVoid() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
        super.visitInsn(RETURN);
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
    // load, store
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
    void arrayLoad(final Type type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
        super.visitInsn(type.getOpcode(IALOAD));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
    void arrayLoad() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
        super.visitInsn(AALOAD);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
    void arrayStore(final Type type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
        super.visitInsn(type.getOpcode(IASTORE));
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
    void arrayStore() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
        super.visitInsn(AASTORE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
    void loadLiteral(final Object value) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
        super.visitLdcInsn(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
    void classLiteral(final String className) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
        super.visitLdcInsn(className);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
    void loadLocal(final Type type, final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
        super.visitVarInsn(type.getOpcode(ILOAD), index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
    void loadLocal(final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
        super.visitVarInsn(ALOAD, index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
    void storeLocal(final Type type, final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
        super.visitVarInsn(type.getOpcode(ISTORE), index);
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
    void storeLocal(final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
        super.visitVarInsn(ASTORE, index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
    void checkcast(final String type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
        super.visitTypeInsn(CHECKCAST, type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
    // push constants/literals
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
    void pushNull() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
        super.visitInsn(ACONST_NULL);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
    void push(final int value) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
        if (value >= -1 && value <= 5) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
            super.visitInsn(ICONST_0 + value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
        } else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
            super.visitIntInsn(BIPUSH, value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
        } else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
            super.visitIntInsn(SIPUSH, value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
            super.visitLdcInsn(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
    void loadClass(final String className) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
        super.visitLdcInsn(Type.getObjectType(className));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
    void pop() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
        super.visitInsn(POP);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
    // various "dups"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
    void dup() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
        super.visitInsn(DUP);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
    void dup2() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
        super.visitInsn(DUP2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   248
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
    void swap() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
        super.visitInsn(SWAP);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
    void dupArrayValue(final int arrayOpcode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
        switch (arrayOpcode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
            case IALOAD: case FALOAD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
            case AALOAD: case BALOAD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
            case CALOAD: case SALOAD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
            case IASTORE: case FASTORE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
            case AASTORE: case BASTORE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
            case CASTORE: case SASTORE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
                dup();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
            case LALOAD: case DALOAD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
            case LASTORE: case DASTORE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
                dup2();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
                throw new AssertionError("invalid dup");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
    void dupReturnValue(final int returnOpcode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
        switch (returnOpcode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
            case IRETURN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
            case FRETURN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
            case ARETURN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
                super.visitInsn(DUP);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
                return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
            case LRETURN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
            case DRETURN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
                super.visitInsn(DUP2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
                return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
            case RETURN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
                return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
                throw new IllegalArgumentException("not return");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
    void dupValue(final Type type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
        switch (type.getSize()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
            case 1:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
                dup();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
            case 2:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
                dup2();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
                throw new AssertionError("invalid dup");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
    void dupValue(final String desc) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
        final int typeCode = desc.charAt(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
        switch (typeCode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
            case '[':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
            case 'L':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
            case 'Z':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
            case 'C':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
            case 'B':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
            case 'S':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
            case 'I':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
                super.visitInsn(DUP);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
            case 'J':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
            case 'D':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
                super.visitInsn(DUP2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   321
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
                throw new RuntimeException("invalid signature");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
    // push default value of given type desc
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
    void defaultValue(final String desc) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
        final int typeCode = desc.charAt(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
        switch (typeCode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
            case '[':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
            case 'L':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   332
                super.visitInsn(ACONST_NULL);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
            case 'Z':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
            case 'C':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
            case 'B':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
            case 'S':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
            case 'I':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
                super.visitInsn(ICONST_0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
            case 'J':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
                super.visitInsn(LCONST_0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
            case 'F':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
                super.visitInsn(FCONST_0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
            case 'D':
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
                super.visitInsn(DCONST_0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
                throw new AssertionError("invalid desc " + desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
    // invokes, field get/sets
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 16151
diff changeset
   356
    void invokeInterface(final String owner, final String method, final String desc) {
22368
9cb3e7db27c6 8029031: "ant clean jar" on nashorn repo results in number of ASM deprecated warnings
sundar
parents: 18855
diff changeset
   357
        super.visitMethodInsn(INVOKEINTERFACE, owner, method, desc, true);
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 16151
diff changeset
   358
    }
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 16151
diff changeset
   359
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
    void invokeVirtual(final String owner, final String method, final String desc) {
22368
9cb3e7db27c6 8029031: "ant clean jar" on nashorn repo results in number of ASM deprecated warnings
sundar
parents: 18855
diff changeset
   361
        super.visitMethodInsn(INVOKEVIRTUAL, owner, method, desc, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   362
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
    void invokeSpecial(final String owner, final String method, final String desc) {
22368
9cb3e7db27c6 8029031: "ant clean jar" on nashorn repo results in number of ASM deprecated warnings
sundar
parents: 18855
diff changeset
   365
        super.visitMethodInsn(INVOKESPECIAL, owner, method, desc, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   366
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   367
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
    void invokeStatic(final String owner, final String method, final String desc) {
22368
9cb3e7db27c6 8029031: "ant clean jar" on nashorn repo results in number of ASM deprecated warnings
sundar
parents: 18855
diff changeset
   369
        super.visitMethodInsn(INVOKESTATIC, owner, method, desc, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   372
    void putStatic(final String owner, final String field, final String desc) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   373
        super.visitFieldInsn(PUTSTATIC, owner, field, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   374
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
    void getStatic(final String owner, final String field, final String desc) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
        super.visitFieldInsn(GETSTATIC, owner, field, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   378
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
    void putField(final String owner, final String field, final String desc) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   381
        super.visitFieldInsn(PUTFIELD, owner, field, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   382
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   383
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
    void getField(final String owner, final String field, final String desc) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
        super.visitFieldInsn(GETFIELD, owner, field, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   386
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   388
    private static boolean linkLogicIsEmpty(final Type type) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   389
        assert EMPTY_LINK_LOGIC_TYPE != null; //type is ok for null if we are a @SpecializedFunction without any attribs
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   390
        return EMPTY_LINK_LOGIC_TYPE.equals(type);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   391
    }
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   392
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   393
    void memberInfoArray(final String className, final List<MemberInfo> mis) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   394
        if (mis.isEmpty()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   395
            pushNull();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   396
            return;
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
        int pos = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   400
        push(mis.size());
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   401
        newObjectArray(SPECIALIZATION_TYPE);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
        for (final MemberInfo mi : mis) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   403
            dup();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
            push(pos++);
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   405
            visitTypeInsn(NEW, SPECIALIZATION_TYPE);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   406
            dup();
39165
f0000753cecd 8160141: removed deprecated method calls in nashorn code
sundar
parents: 38485
diff changeset
   407
            visitLdcInsn(new Handle(H_INVOKESTATIC, className, mi.getJavaName(), mi.getJavaDesc(), false));
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   408
            final Type    linkLogicClass = mi.getLinkLogicClass();
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   409
            final boolean linkLogic      = !linkLogicIsEmpty(linkLogicClass);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   410
            final String  ctor           = linkLogic ? SPECIALIZATION_INIT3 : SPECIALIZATION_INIT2;
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   411
            if (linkLogic) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   412
                visitLdcInsn(linkLogicClass);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   413
            }
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   414
            visitInsn(mi.isOptimistic() ? ICONST_1 : ICONST_0);
42376
8604f1a50c30 8170322: Specialized functions convert booleans to numbers
hannesw
parents: 39165
diff changeset
   415
            visitInsn(mi.convertsNumericArgs() ? ICONST_1 : ICONST_0);
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   416
            visitMethodInsn(INVOKESPECIAL, SPECIALIZATION_TYPE, INIT, ctor, false);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26070
diff changeset
   417
            arrayStore(TYPE_SPECIALIZATION);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   419
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   420
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   421
    void computeMaxs() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   422
        // These values are ignored as we create class writer
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
        // with ClassWriter.COMPUTE_MAXS flag.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   424
        super.visitMaxs(Short.MAX_VALUE, Short.MAX_VALUE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   425
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
    // debugging support - print calls
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
    void println(final String msg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
        super.visitFieldInsn(GETSTATIC,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
                    "java/lang/System",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
                    "out",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
                    "Ljava/io/PrintStream;");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
        super.visitLdcInsn(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
        super.visitMethodInsn(INVOKEVIRTUAL,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   435
                    "java/io/PrintStream",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
                    "println",
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22368
diff changeset
   437
                    "(Ljava/lang/String;)V",
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22368
diff changeset
   438
                    false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   439
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   440
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
    // print the object on the top of the stack
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
    void printObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   443
        super.visitFieldInsn(GETSTATIC,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
                    "java/lang/System",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   445
                    "out",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   446
                    "Ljava/io/PrintStream;");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
        super.visitInsn(SWAP);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
        super.visitMethodInsn(INVOKEVIRTUAL,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
                    "java/io/PrintStream",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
                    "println",
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22368
diff changeset
   451
                    "(Ljava/lang/Object;)V",
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22368
diff changeset
   452
                    false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
}