8161929: FindProperty.isInherited never used standalone
Reviewed-by: hannesw, sundar
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java Mon Jul 25 10:58:58 2016 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java Mon Jul 25 11:03:01 2016 +0200
@@ -127,7 +127,7 @@
// Fold an accessor getter into the method handle of a user accessor property.
private MethodHandle insertAccessorsGetter(final UserAccessorProperty uap, final LinkRequest request, final MethodHandle mh) {
MethodHandle superGetter = uap.getAccessorsGetter();
- if (isInherited()) {
+ if (!isSelf()) {
superGetter = ScriptObject.addProtoFilter(superGetter, getProtoChainLength());
}
if (request != null && !(request.getReceiver() instanceof ScriptObject)) {
@@ -183,11 +183,12 @@
}
/**
- * Check if the property found was inherited, i.e. not directly in the self
- * @return true if inherited property
+ * Check if the property found was inherited from a prototype and it is an ordinary
+ * property (one that has no accessor function).
+ * @return true if the found property is an inherited ordinary property
*/
- public boolean isInherited() {
- return self != prototype;
+ public boolean isInheritedOrdinaryProperty() {
+ return !isSelf() && !getProperty().isAccessorProperty();
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Mon Jul 25 10:58:58 2016 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Mon Jul 25 11:03:01 2016 +0200
@@ -796,7 +796,7 @@
* @param start the object on which the lookup was originally initiated
* @return FindPropertyData or null if not found.
*/
- protected FindProperty findProperty(final Object key, final boolean deep, boolean isScope, final ScriptObject start) {
+ protected FindProperty findProperty(final Object key, final boolean deep, final boolean isScope, final ScriptObject start) {
final PropertyMap selfMap = getMap();
final Property property = selfMap.findProperty(key);
@@ -2184,7 +2184,7 @@
FindProperty find = findProperty(name, true, NashornCallSiteDescriptor.isScope(desc), this);
// If it's not a scope search, then we don't want any inherited properties except those with user defined accessors.
- if (find != null && find.isInherited() && !find.getProperty().isAccessorProperty()) {
+ if (find != null && find.isInheritedOrdinaryProperty()) {
// We should still check if inherited data property is not writable
if (isExtensible() && !find.getProperty().isWritable()) {
return createEmptySetMethod(desc, explicitInstanceOfCheck, "property.not.writable", true);
@@ -3044,7 +3044,7 @@
invalidateGlobalConstant(key);
- if (f != null && f.isInherited() && !f.getProperty().isAccessorProperty()) {
+ if (f != null && f.isInheritedOrdinaryProperty()) {
final boolean isScope = isScopeFlag(callSiteFlags);
// If the start object of the find is not this object it means the property was found inside a
// 'with' statement expression (see WithObject.findProperty()). In this case we forward the 'set'
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/SetMethodCreator.java Mon Jul 25 10:58:58 2016 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/SetMethodCreator.java Mon Jul 25 11:03:01 2016 +0200
@@ -170,7 +170,7 @@
assert property != null;
final MethodHandle boundHandle;
- if (!property.isAccessorProperty() && find.isInherited()) {
+ if (find.isInheritedOrdinaryProperty()) {
boundHandle = ScriptObject.addProtoFilter(methodHandle, find.getProtoChainLength());
} else {
boundHandle = methodHandle;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java Mon Jul 25 10:58:58 2016 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java Mon Jul 25 11:03:01 2016 +0200
@@ -117,7 +117,7 @@
return new GuardedInvocation(GlobalConstants.staticConstantGetter(find.getObjectValue()), guard, sp, null);
}
- if (find.isInherited() && !(find.getProperty().isAccessorProperty())) {
+ if (find.isInheritedOrdinaryProperty()) {
// If property is found in the prototype object bind the method handle directly to
// the proto filter instead of going through wrapper instantiation below.
final ScriptObject proto = wrappedReceiver.getProto();