From 6141392ab9a36bce9dd888a8aca0775931d4cd04 Mon Sep 17 00:00:00 2001 From: hns Date: Wed, 5 Nov 2008 15:36:27 +0000 Subject: [PATCH] Fix bug 647: Allow HopObjects to use ScriptableObject slot properties, for example to implement getters and setters. Patch from Juerg Lehni. --- src/helma/scripting/rhino/HopObject.java | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/helma/scripting/rhino/HopObject.java b/src/helma/scripting/rhino/HopObject.java index 9b6319c7..ae320055 100644 --- a/src/helma/scripting/rhino/HopObject.java +++ b/src/helma/scripting/rhino/HopObject.java @@ -757,6 +757,11 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco } } super.put(name, start, value); + } else if (super.has(name, start)) { + // if property is defined as ScriptableObject slot + // (e.g. via __defineGetter__/__defineSetter__) + // use ScriptableObject.put to set it + super.put(name, start, value); } else { checkNode(); @@ -810,10 +815,11 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco public boolean has(String name, Scriptable start) { if (node != null) { checkNode(); - return (node.get(name) != null); - } else { - return super.has(name, start); + if (node.get(name) != null) { + return true; + } } + return super.has(name, start); } /** @@ -825,9 +831,8 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco if ((node != null)) { checkNode(); node.unset(name); - } else { - super.delete(name); } + super.delete(name); } /** @@ -839,11 +844,11 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco * @return ... */ public Object get(String name, Scriptable start) { - if (node == null) { - return super.get(name, start); - } else { - return getFromNode(name); + Object obj = super.get(name, start); + if (obj == Scriptable.NOT_FOUND && node != null) { + obj = getFromNode(name); } + return obj; } /**