Fix bug 647: Allow HopObjects to use ScriptableObject slot properties, for

example to implement getters and setters. Patch from Juerg Lehni.
<http://helma.org/bugs/show_bug.cgi?id=647>
This commit is contained in:
hns 2008-11-05 15:36:27 +00:00
parent 941395437b
commit 6141392ab9

View file

@ -757,6 +757,11 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco
} }
} }
super.put(name, start, value); 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 { } else {
checkNode(); checkNode();
@ -810,10 +815,11 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco
public boolean has(String name, Scriptable start) { public boolean has(String name, Scriptable start) {
if (node != null) { if (node != null) {
checkNode(); checkNode();
return (node.get(name) != null); if (node.get(name) != null) {
} else { return true;
return super.has(name, start); }
} }
return super.has(name, start);
} }
/** /**
@ -825,9 +831,8 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco
if ((node != null)) { if ((node != null)) {
checkNode(); checkNode();
node.unset(name); node.unset(name);
} else {
super.delete(name);
} }
super.delete(name);
} }
/** /**
@ -839,11 +844,11 @@ public class HopObject extends ScriptableObject implements Wrapper, PropertyReco
* @return ... * @return ...
*/ */
public Object get(String name, Scriptable start) { public Object get(String name, Scriptable start) {
if (node == null) { Object obj = super.get(name, start);
return super.get(name, start); if (obj == Scriptable.NOT_FOUND && node != null) {
} else { obj = getFromNode(name);
return getFromNode(name);
} }
return obj;
} }
/** /**