nashorn/src/jdk/nashorn/internal/runtime/AccessorProperty.java
author hannesw
Wed, 02 Apr 2014 18:26:57 +0200
changeset 23767 7c0614b75e23
parent 23372 09707b3e5fb0
child 24769 de4dcfa9380f
permissions -rw-r--r--
8038638: Persistent store for compiled scripts Reviewed-by: lagergren, 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.runtime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    28
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.ACCESSOR_TYPES;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    29
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.DEBUG_FIELDS;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    30
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.LOG;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    31
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.OBJECT_FIELDS_ONLY;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    32
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.PRIMITIVE_TYPE;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    33
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.createGetter;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    34
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.createGuardBoxedPrimitiveSetter;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    35
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.createSetter;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    36
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.getAccessorType;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    37
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.getAccessorTypeIndex;
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    38
import static jdk.nashorn.internal.codegen.ObjectClassGenerator.getNumberOfAccessorTypes;
16277
fd698c5ee684 8009559: clean up method handle lookup code.
sundar
parents: 16275
diff changeset
    39
import static jdk.nashorn.internal.lookup.Lookup.MH;
fd698c5ee684 8009559: clean up method handle lookup code.
sundar
parents: 16275
diff changeset
    40
import static jdk.nashorn.internal.lookup.MethodHandleFactory.stripName;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
    42
import java.io.IOException;
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
    43
import java.io.ObjectInputStream;
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
    44
import java.io.Serializable;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import java.lang.invoke.MethodHandle;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import java.lang.invoke.MethodHandles;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import java.lang.invoke.MethodType;
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16224
diff changeset
    48
import jdk.nashorn.internal.codegen.ObjectClassGenerator;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
import jdk.nashorn.internal.codegen.types.Type;
16277
fd698c5ee684 8009559: clean up method handle lookup code.
sundar
parents: 16275
diff changeset
    50
import jdk.nashorn.internal.lookup.Lookup;
fd698c5ee684 8009559: clean up method handle lookup code.
sundar
parents: 16275
diff changeset
    51
import jdk.nashorn.internal.lookup.MethodHandleFactory;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
 * An AccessorProperty is the most generic property type. An AccessorProperty is
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
 * represented as fields in a ScriptObject class.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
 */
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
    57
public final class AccessorProperty extends Property implements Serializable {
17246
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    58
    private static final MethodHandles.Lookup lookup = MethodHandles.lookup();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
    private static final MethodHandle REPLACE_MAP = findOwnMH("replaceMap", Object.class, Object.class, PropertyMap.class, String.class, Class.class, Class.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
    private static final int NOOF_TYPES = getNumberOfAccessorTypes();
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
    62
    private static final long serialVersionUID = 3371720170182154920L;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
17246
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    64
    /**
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    65
     * Properties in different maps for the same structure class will share their field getters and setters. This could
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    66
     * be further extended to other method handles that are looked up in the AccessorProperty constructor, but right now
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    67
     * these are the most frequently retrieved ones, and lookup of method handle natives only registers in the profiler
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    68
     * for them.
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    69
     */
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    70
    private static ClassValue<GettersSetters> GETTERS_SETTERS = new ClassValue<GettersSetters>() {
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    71
        @Override
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    72
        protected GettersSetters computeValue(Class<?> structure) {
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    73
            return new GettersSetters(structure);
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    74
        }
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    75
    };
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
    76
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
    /** Property getter cache */
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
    78
    private transient MethodHandle[] getters = new MethodHandle[NOOF_TYPES];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
    private static final MethodType[] ACCESSOR_GETTER_TYPES = new MethodType[NOOF_TYPES];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
    private static final MethodType[] ACCESSOR_SETTER_TYPES = new MethodType[NOOF_TYPES];
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
    82
    private static final MethodType ACCESSOR_GETTER_PRIMITIVE_TYPE;
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
    83
    private static final MethodType ACCESSOR_SETTER_PRIMITIVE_TYPE;
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    84
    private static final MethodHandle SPILL_ELEMENT_GETTER;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    85
    private static final MethodHandle SPILL_ELEMENT_SETTER;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    86
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    87
    private static final int SPILL_CACHE_SIZE = 8;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    88
    private static final MethodHandle[] SPILL_ACCESSORS = new MethodHandle[SPILL_CACHE_SIZE * 2];
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    89
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    90
    static {
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
    91
        MethodType getterPrimitiveType = null;
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
    92
        MethodType setterPrimitiveType = null;
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
    93
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    94
        for (int i = 0; i < NOOF_TYPES; i++) {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    95
            final Type type = ACCESSOR_TYPES.get(i);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    96
            ACCESSOR_GETTER_TYPES[i] = MH.type(type.getTypeClass(), Object.class);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
    97
            ACCESSOR_SETTER_TYPES[i] = MH.type(void.class, Object.class, type.getTypeClass());
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
    98
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
    99
            if (type == PRIMITIVE_TYPE) {
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   100
                getterPrimitiveType = ACCESSOR_GETTER_TYPES[i];
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   101
                setterPrimitiveType = ACCESSOR_SETTER_TYPES[i];
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   102
            }
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   103
        }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   104
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   105
        ACCESSOR_GETTER_PRIMITIVE_TYPE = getterPrimitiveType;
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   106
        ACCESSOR_SETTER_PRIMITIVE_TYPE = setterPrimitiveType;
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   107
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   108
        final MethodType spillGetterType = MethodType.methodType(Object[].class, Object.class);
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   109
        final MethodHandle spillGetter = MH.asType(MH.getter(MethodHandles.lookup(), ScriptObject.class, "spill", Object[].class), spillGetterType);
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   110
        SPILL_ELEMENT_GETTER = MH.filterArguments(MH.arrayElementGetter(Object[].class), 0, spillGetter);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   111
        SPILL_ELEMENT_SETTER = MH.filterArguments(MH.arrayElementSetter(Object[].class), 0, spillGetter);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   112
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   114
    /**
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   115
     * Create a new accessor property. Factory method used by nasgen generated code.
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   116
     *
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   117
     * @param key           {@link Property} key.
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   118
     * @param propertyFlags {@link Property} flags.
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   119
     * @param getter        {@link Property} get accessor method.
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   120
     * @param setter        {@link Property} set accessor method.
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   121
     *
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   122
     * @return  New {@link AccessorProperty} created.
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   123
     */
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   124
    public static AccessorProperty create(final String key, final int propertyFlags, final MethodHandle getter, final MethodHandle setter) {
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   125
        return new AccessorProperty(key, propertyFlags, -1, getter, setter);
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   126
    }
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18852
diff changeset
   127
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    /** Seed getter for the primitive version of this field (in -Dnashorn.fields.dual=true mode) */
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   129
    private transient MethodHandle primitiveGetter;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
    /** Seed setter for the primitive version of this field (in -Dnashorn.fields.dual=true mode) */
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   132
    private transient MethodHandle primitiveSetter;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
    /** Seed getter for the Object version of this field */
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   135
    private transient MethodHandle objectGetter;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    /** Seed setter for the Object version of this field */
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   138
    private transient MethodHandle objectSetter;
16147
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
     * Current type of this object, in object only mode, this is an Object.class. In dual-fields mode
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
     * null means undefined, and primitive types are allowed. The reason a special type is used for
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
     * undefined, is that are no bits left to represent it in primitive types
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
    private Class<?> currentType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
    /**
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 19105
diff changeset
   148
     * Delegate constructor for bound properties. This is used for properties created by
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 19105
diff changeset
   149
     * {@link ScriptRuntime#mergeScope} and the Nashorn {@code Object.bindProperties} method.
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 19105
diff changeset
   150
     * The former is used to add a script's defined globals to the current global scope while
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 19105
diff changeset
   151
     * still storing them in a JO-prefixed ScriptObject class.
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 19105
diff changeset
   152
     *
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 19105
diff changeset
   153
     * <p>All properties created by this constructor have the {@link #IS_BOUND} flag set.</p>
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
     * @param property  accessor property to rebind
18860
e387fde9322a 8014785: Ability to extend global instance by binding properties of another object
sundar
parents: 18859
diff changeset
   156
     * @param delegate  delegate object to rebind receiver to
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
     */
19105
a01ba9d17eab 8021571: @fork tests should use VM options passed from project.properties
sundar
parents: 18860
diff changeset
   158
    AccessorProperty(final AccessorProperty property, final Object delegate) {
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   159
        super(property);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   161
        this.primitiveGetter = bindTo(property.primitiveGetter, delegate);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   162
        this.primitiveSetter = bindTo(property.primitiveSetter, delegate);
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   163
        this.objectGetter    = bindTo(property.ensureObjectGetter(), delegate);
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   164
        this.objectSetter    = bindTo(property.ensureObjectSetter(), delegate);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 19105
diff changeset
   166
        // Properties created this way are bound to a delegate
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 19105
diff changeset
   167
        this.flags |= IS_BOUND;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
        setCurrentType(property.getCurrentType());
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
    /**
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   172
     * Constructor for spill properties. Array getters and setters will be created on demand.
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   173
     *
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   174
     * @param key    the property key
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   175
     * @param flags  the property flags
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   176
     * @param slot   spill slot
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   177
     */
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   178
    public AccessorProperty(final String key, final int flags, final int slot) {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   179
        super(key, flags, slot);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   180
        assert (flags & IS_SPILL) == IS_SPILL;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   181
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   182
        setCurrentType(Object.class);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   183
    }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   184
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   185
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
     * Constructor. Similar to the constructor with both primitive getters and setters, the difference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
     * here being that only one getter and setter (setter is optional for non writable fields) is given
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
     * to the constructor, and the rest are created from those. Used e.g. by Nasgen classes
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
     * @param key    the property key
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
     * @param flags  the property flags
16224
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   192
     * @param slot   the property field number or spill slot
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
     * @param getter the property getter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
     * @param setter the property setter or null if non writable, non configurable
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
     */
19105
a01ba9d17eab 8021571: @fork tests should use VM options passed from project.properties
sundar
parents: 18860
diff changeset
   196
    AccessorProperty(final String key, final int flags, final int slot, final MethodHandle getter, final MethodHandle setter) {
16224
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   197
        super(key, flags, slot);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
        // we don't need to prep the setters these will never be invalidated as this is a nasgen
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
        // or known type getter/setter. No invalidations will take place
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
        final Class<?> getterType = getter.type().returnType();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
        final Class<?> setterType = setter == null ? null : setter.type().parameterType(1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
        assert setterType == null || setterType == getterType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
        if (getterType.isPrimitive()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
            for (int i = 0; i < NOOF_TYPES; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
                getters[i] = MH.asType(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
                    Lookup.filterReturnType(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
                        getter,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
                        getAccessorType(i).getTypeClass()),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
                    ACCESSOR_GETTER_TYPES[i]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
        } else {
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   216
            objectGetter = getter.type() != Lookup.GET_OBJECT_TYPE ? MH.asType(getter, Lookup.GET_OBJECT_TYPE) : getter;
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   217
            objectSetter = setter != null && setter.type() != Lookup.SET_OBJECT_TYPE ? MH.asType(setter, Lookup.SET_OBJECT_TYPE) : setter;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
        setCurrentType(getterType);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
17246
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   223
    private static class GettersSetters {
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   224
        final MethodHandle[] getters;
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   225
        final MethodHandle[] setters;
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   226
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   227
        public GettersSetters(Class<?> structure) {
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   228
            final int fieldCount = ObjectClassGenerator.getFieldCount(structure);
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   229
            getters = new MethodHandle[fieldCount];
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   230
            setters = new MethodHandle[fieldCount];
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   231
            for(int i = 0; i < fieldCount; ++i) {
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   232
                final String fieldName = ObjectClassGenerator.getFieldName(i, Type.OBJECT);
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   233
                getters[i] = MH.asType(MH.getter(lookup, structure, fieldName, Type.OBJECT.getTypeClass()), Lookup.GET_OBJECT_TYPE);
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   234
                setters[i] = MH.asType(MH.setter(lookup, structure, fieldName, Type.OBJECT.getTypeClass()), Lookup.SET_OBJECT_TYPE);
17246
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   235
            }
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   236
        }
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   237
    }
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   238
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
    /**
16224
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   240
     * Constructor for dual field AccessorPropertys.
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   241
     *
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   242
     * @param key              property key
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   243
     * @param flags            property flags
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   244
     * @param structure        structure for objects associated with this property
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   245
     * @param slot             property field number or spill slot
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   246
     */
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   247
    public AccessorProperty(final String key, final int flags, final Class<?> structure, final int slot) {
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   248
        super(key, flags, slot);
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   249
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   250
        initGetterSetter(structure);
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   251
    }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   252
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   253
    private void initGetterSetter(final Class<?> structure) {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   254
        final int slot = getSlot();
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   255
        final String key = getKey();
16224
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   256
        /*
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   257
         * primitiveGetter and primitiveSetter are only used in dual fields mode. Setting them to null also
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   258
         * works in dual field mode, it only means that the property never has a primitive
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   259
         * representation.
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   260
         */
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   261
        primitiveGetter = null;
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   262
        primitiveSetter = null;
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   263
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   264
        if (isParameter() && hasArguments()) {
18859
7c4d0146ccd5 8009758: reactivate the 8006529 test.
attila
parents: 18855
diff changeset
   265
            final MethodHandle arguments   = MH.getter(lookup, structure, "arguments", ScriptObject.class);
16224
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   266
18859
7c4d0146ccd5 8009758: reactivate the 8006529 test.
attila
parents: 18855
diff changeset
   267
            objectGetter = MH.asType(MH.insertArguments(MH.filterArguments(ScriptObject.GET_ARGUMENT.methodHandle(), 0, arguments), 1, slot), Lookup.GET_OBJECT_TYPE);
7c4d0146ccd5 8009758: reactivate the 8006529 test.
attila
parents: 18855
diff changeset
   268
            objectSetter = MH.asType(MH.insertArguments(MH.filterArguments(ScriptObject.SET_ARGUMENT.methodHandle(), 0, arguments), 1, slot), Lookup.SET_OBJECT_TYPE);
16224
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   269
        } else {
17246
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   270
            final GettersSetters gs = GETTERS_SETTERS.get(structure);
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   271
            objectGetter = gs.getters[slot];
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   272
            objectSetter = gs.setters[slot];
16224
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   273
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   274
            if (!OBJECT_FIELDS_ONLY) {
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   275
                final String fieldNamePrimitive = ObjectClassGenerator.getFieldName(slot, PRIMITIVE_TYPE);
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   276
                final Class<?> typeClass = PRIMITIVE_TYPE.getTypeClass();
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   277
                primitiveGetter = MH.asType(MH.getter(lookup, structure, fieldNamePrimitive, typeClass), ACCESSOR_GETTER_PRIMITIVE_TYPE);
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   278
                primitiveSetter = MH.asType(MH.setter(lookup, structure, fieldNamePrimitive, typeClass), ACCESSOR_SETTER_PRIMITIVE_TYPE);
16224
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   279
            }
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   280
        }
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   281
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   282
        Class<?> initialType = null;
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   283
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   284
        if (OBJECT_FIELDS_ONLY || isAlwaysObject()) {
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   285
            initialType = Object.class;
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   286
        } else if (!canBePrimitive()) {
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   287
            info(key + " cannot be primitive");
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   288
            initialType = Object.class;
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   289
        } else {
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   290
            info(key + " CAN be primitive");
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   291
            if (!canBeUndefined()) {
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   292
                info(key + " is always defined");
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   293
                initialType = int.class; //double works too for less type invalidation, but this requires experimentation, e.g. var x = 17; x += 2 will turn it into double now because of lack of range analysis
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   294
            }
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   295
        }
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   296
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   297
        // is always object means "is never initialized to undefined, and always of object type
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   298
        setCurrentType(initialType);
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   299
    }
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   300
0c49ad4e3b55 8006222: Move slot from SpillProperty to Property
jlaskey
parents: 16151
diff changeset
   301
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
     * Copy constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
     * @param property  source property
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
    protected AccessorProperty(final AccessorProperty property) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
        super(property);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
        this.getters         = property.getters;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
        this.primitiveGetter = property.primitiveGetter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
        this.primitiveSetter = property.primitiveSetter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
        this.objectGetter    = property.objectGetter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
        this.objectSetter    = property.objectSetter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
        setCurrentType(property.getCurrentType());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   318
    private void readObject(final ObjectInputStream s) throws IOException, ClassNotFoundException {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   319
        s.defaultReadObject();
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   320
        // Restore getters array
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   321
        getters = new MethodHandle[NOOF_TYPES];
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   322
    }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   323
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
    private static MethodHandle bindTo(final MethodHandle mh, final Object receiver) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
        if (mh == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
        return MH.dropArguments(MH.bindTo(mh, receiver), 0, Object.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   332
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
    protected Property copy() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
        return new AccessorProperty(this);
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
    @Override
18615
3f6e6adcbc1a 8015969: Needs to enforce and document that global "context" and "engine" can't be modified when running via jsr223
sundar
parents: 17774
diff changeset
   338
    public void setObjectValue(final ScriptObject self, final ScriptObject owner, final Object value, final boolean strict)  {
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   339
        if (isSpill()) {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   340
            self.spill[getSlot()] = value;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   341
        } else {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   342
            try {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   343
                getSetter(Object.class, self.getMap()).invokeExact((Object)self, value);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   344
            } catch (final Error|RuntimeException e) {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   345
                throw e;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   346
            } catch (final Throwable e) {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   347
                throw new RuntimeException(e);
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   348
            }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   349
        }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   350
    }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   351
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   352
    @Override
18615
3f6e6adcbc1a 8015969: Needs to enforce and document that global "context" and "engine" can't be modified when running via jsr223
sundar
parents: 17774
diff changeset
   353
    public Object getObjectValue(final ScriptObject self, final ScriptObject owner) {
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   354
        if (isSpill()) {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   355
            return self.spill[getSlot()];
17774
0407501fa563 8014219: Make the run-octane harness more deterministic by not measuring elapsed time every iteration. Also got rid of most of the run logic in base.js and call benchmarks directly for the same purpose
lagergren
parents: 17770
diff changeset
   356
        }
0407501fa563 8014219: Make the run-octane harness more deterministic by not measuring elapsed time every iteration. Also got rid of most of the run logic in base.js and call benchmarks directly for the same purpose
lagergren
parents: 17770
diff changeset
   357
0407501fa563 8014219: Make the run-octane harness more deterministic by not measuring elapsed time every iteration. Also got rid of most of the run logic in base.js and call benchmarks directly for the same purpose
lagergren
parents: 17770
diff changeset
   358
        try {
0407501fa563 8014219: Make the run-octane harness more deterministic by not measuring elapsed time every iteration. Also got rid of most of the run logic in base.js and call benchmarks directly for the same purpose
lagergren
parents: 17770
diff changeset
   359
            return getGetter(Object.class).invokeExact((Object)self);
0407501fa563 8014219: Make the run-octane harness more deterministic by not measuring elapsed time every iteration. Also got rid of most of the run logic in base.js and call benchmarks directly for the same purpose
lagergren
parents: 17770
diff changeset
   360
        } catch (final Error|RuntimeException e) {
0407501fa563 8014219: Make the run-octane harness more deterministic by not measuring elapsed time every iteration. Also got rid of most of the run logic in base.js and call benchmarks directly for the same purpose
lagergren
parents: 17770
diff changeset
   361
            throw e;
0407501fa563 8014219: Make the run-octane harness more deterministic by not measuring elapsed time every iteration. Also got rid of most of the run logic in base.js and call benchmarks directly for the same purpose
lagergren
parents: 17770
diff changeset
   362
        } catch (final Throwable e) {
0407501fa563 8014219: Make the run-octane harness more deterministic by not measuring elapsed time every iteration. Also got rid of most of the run logic in base.js and call benchmarks directly for the same purpose
lagergren
parents: 17770
diff changeset
   363
            throw new RuntimeException(e);
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   364
        }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   365
    }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   366
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   367
    // Spill getters and setters are lazily initialized, see JDK-8011630
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   368
    private MethodHandle ensureObjectGetter() {
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   369
        if (isSpill() && objectGetter == null) {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   370
            objectGetter = getSpillGetter();
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   371
        }
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   372
        return objectGetter;
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   373
    }
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   374
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   375
    private MethodHandle ensureObjectSetter() {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   376
        if (isSpill() && objectSetter == null) {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   377
            objectSetter = getSpillSetter();
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   378
        }
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   379
        return objectSetter;
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   380
    }
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   381
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   382
    @Override
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   383
    void initMethodHandles(final Class<?> structure) {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   384
        if (!ScriptObject.class.isAssignableFrom(structure) || !StructureLoader.isStructureClass(structure.getName())) {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   385
            throw new IllegalArgumentException();
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   386
        }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   387
        if (!isSpill()) {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   388
            initGetterSetter(structure);
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   389
        }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   390
    }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   391
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23372
diff changeset
   392
    @Override
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   393
    public MethodHandle getGetter(final Class<?> type) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   394
        final int i = getAccessorTypeIndex(type);
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   395
        ensureObjectGetter();
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   396
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
        if (getters[i] == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   398
            getters[i] = debug(
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   399
                createGetter(currentType, type, primitiveGetter, objectGetter),
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   400
                currentType, type, "get");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   401
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   403
        return getters[i];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   405
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   406
    private Property getWiderProperty(final Class<?> type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   407
        final AccessorProperty newProperty = new AccessorProperty(this);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
        newProperty.invalidate(type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
        return newProperty;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   412
    private PropertyMap getWiderMap(final PropertyMap oldMap, final Property newProperty) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   413
        final PropertyMap newMap = oldMap.replaceProperty(this, newProperty);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   414
        assert oldMap.size() > 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   415
        assert newMap.size() == oldMap.size();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   416
        return newMap;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   417
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   419
    // the final three arguments are for debug printout purposes only
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   420
    @SuppressWarnings("unused")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   421
    private static Object replaceMap(final Object sobj, final PropertyMap newMap, final String key, final Class<?> oldType, final Class<?> newType) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   422
        if (DEBUG_FIELDS) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
            final PropertyMap oldMap = ((ScriptObject)sobj).getMap();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   424
            info("Type change for '" + key + "' " + oldType + "=>" + newType);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   425
            finest("setting map " + sobj + " from " + Debug.id(oldMap) + " to " + Debug.id(newMap) + " " + oldMap + " => " + newMap);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
        ((ScriptObject)sobj).setMap(newMap);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
        return sobj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
    private MethodHandle generateSetter(final Class<?> forType, final Class<?> type) {
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18847
diff changeset
   432
        ensureObjectSetter();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
        MethodHandle mh = createSetter(forType, type, primitiveSetter, objectSetter);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
        mh = debug(mh, currentType, type, "set");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   435
        return mh;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   437
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   438
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   439
    public MethodHandle getSetter(final Class<?> type, final PropertyMap currentMap) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   440
        final int i            = getAccessorTypeIndex(type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
        final int ci           = currentType == null ? -1 : getAccessorTypeIndex(currentType);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
        final Class<?> forType = currentType == null ? type : currentType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   443
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
        //if we are asking for an object setter, but are still a primitive type, we might try to box it
17513
b9a691fc1df5 8006220: Simplify PropertyMaps
jlaskey
parents: 17246
diff changeset
   445
        MethodHandle mh;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   446
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
        if (needsInvalidator(i, ci)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
            final Property     newProperty = getWiderProperty(type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
            final PropertyMap  newMap      = getWiderMap(currentMap, newProperty);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
            final MethodHandle widerSetter = newProperty.getSetter(type, newMap);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
            final MethodHandle explodeTypeSetter = MH.filterArguments(widerSetter, 0, MH.insertArguments(REPLACE_MAP, 1, newMap, getKey(), currentType, type));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
            if (currentType != null && currentType.isPrimitive() && type == Object.class) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
                //might try a box check on this to avoid widening field to object storage
17513
b9a691fc1df5 8006220: Simplify PropertyMaps
jlaskey
parents: 17246
diff changeset
   454
                mh = createGuardBoxedPrimitiveSetter(currentType, generateSetter(currentType, currentType), explodeTypeSetter);
b9a691fc1df5 8006220: Simplify PropertyMaps
jlaskey
parents: 17246
diff changeset
   455
            } else {
b9a691fc1df5 8006220: Simplify PropertyMaps
jlaskey
parents: 17246
diff changeset
   456
                mh = explodeTypeSetter;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
            }
17513
b9a691fc1df5 8006220: Simplify PropertyMaps
jlaskey
parents: 17246
diff changeset
   458
        } else {
b9a691fc1df5 8006220: Simplify PropertyMaps
jlaskey
parents: 17246
diff changeset
   459
            mh = generateSetter(forType, type);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   460
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   462
        return mh;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   463
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   464
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   465
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
    public boolean canChangeType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   467
        if (OBJECT_FIELDS_ONLY) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
            return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   469
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   470
        return currentType != Object.class && (isConfigurable() || isWritable());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   472
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   473
    private boolean needsInvalidator(final int ti, final int fti) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   474
        return canChangeType() && ti > fti;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   475
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
    private void invalidate(final Class<?> newType) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
        getters = new MethodHandle[NOOF_TYPES];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   479
        setCurrentType(newType);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   480
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   481
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   482
    private MethodHandle getSpillGetter() {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   483
        final int slot = getSlot();
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   484
        MethodHandle getter = slot < SPILL_CACHE_SIZE ? SPILL_ACCESSORS[slot * 2] : null;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   485
        if (getter == null) {
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   486
            getter = MH.insertArguments(SPILL_ELEMENT_GETTER, 1, slot);
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   487
            if (slot < SPILL_CACHE_SIZE) {
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   488
                SPILL_ACCESSORS[slot * 2 + 0] = getter;
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   489
            }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   490
        }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   491
        return getter;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   492
    }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   493
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   494
    private MethodHandle getSpillSetter() {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   495
        final int slot = getSlot();
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   496
        MethodHandle setter = slot < SPILL_CACHE_SIZE ? SPILL_ACCESSORS[slot * 2 + 1] : null;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   497
        if (setter == null) {
18847
31ca64473a86 8011629: Object.defineProperty performance issue
jlaskey
parents: 18615
diff changeset
   498
            setter = MH.insertArguments(SPILL_ELEMENT_SETTER, 1, slot);
17770
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   499
            if (slot < SPILL_CACHE_SIZE) {
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   500
                SPILL_ACCESSORS[slot * 2 + 1] = setter;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   501
            }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   502
        }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   503
        return setter;
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   504
    }
3c8602ec5565 8011630: JSON parsing performance issue
hannesw
parents: 17513
diff changeset
   505
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
    private static void finest(final String str) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
        if (DEBUG_FIELDS) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   508
            LOG.finest(str);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   509
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   510
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   511
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   512
    private static void info(final String str) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   513
        if (DEBUG_FIELDS) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   514
            LOG.info(str);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   515
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   516
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   518
    private MethodHandle debug(final MethodHandle mh, final Class<?> forType, final Class<?> type, final String tag) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   519
        if (DEBUG_FIELDS) {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16277
diff changeset
   520
           return MethodHandleFactory.addDebugPrintout(
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   521
               LOG,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   522
               mh,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   523
               tag + " '" + getKey() + "' (property="+ Debug.id(this) + ", forType=" + stripName(forType) + ", type=" + stripName(type) + ')');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   524
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   525
        return mh;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   526
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   527
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   528
    private void setCurrentType(final Class<?> currentType) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   529
        this.currentType = currentType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   531
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   532
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   533
    public Class<?> getCurrentType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   534
        return currentType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   535
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   536
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
    private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
17246
a1bcf4d2bff1 8013203: A collection of smaller speedups to compilation pipeline
attila
parents: 16523
diff changeset
   538
        return MH.findStatic(lookup, AccessorProperty.class, name, MH.type(rtype, types));
16147
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
}