@Override public void defineOwnProperty(Context cx, Object key, ScriptableObject desc) { if (key instanceof String) { String name = (String) key; int info = findInstanceIdInfo(name); if (info != 0) { int id = (info & 0xFFFF); if (isAccessorDescriptor(desc)) { delete(id); // it will be replaced with a slot } else { int attr = (info >>> 16); Object value = getProperty(desc, "value"); setInstanceIdValue(id, value == NOT_FOUND ? Undefined.instance : value); setAttributes(id, applyDescriptorToAttributeBitset(attr, desc)); return; } } if (prototypeValues != null) { int id = prototypeValues.findId(name); if (id != 0) { if (isAccessorDescriptor(desc)) { prototypeValues.delete(id); // it will be replaced with a slot } else { int attr = prototypeValues.getAttributes(id); Object value = getProperty(desc, "value"); prototypeValues.set(id, this, value == NOT_FOUND ? Undefined.instance : value); prototypeValues.setAttributes(id, applyDescriptorToAttributeBitset(attr, desc)); return; } } } } super.defineOwnProperty(cx, key, desc); }
private ScriptableObject getBuiltInDescriptor(String name) { Object value = null; int attr = EMPTY; Scriptable scope = getParentScope(); if (scope == null) { scope = this; } int info = findInstanceIdInfo(name); if (info != 0) { int id = (info & 0xFFFF); value = getInstanceIdValue(id); attr = (info >>> 16); return buildDataDescriptor(scope, value, attr); } if (prototypeValues != null) { int id = prototypeValues.findId(name); if (id != 0) { value = prototypeValues.get(id); attr = prototypeValues.getAttributes(id); return buildDataDescriptor(scope, value, attr); } } return null; }
@Override public int getAttributes(String name) { int info = findInstanceIdInfo(name); if (info != 0) { int attr = (info >>> 16); return attr; } if (prototypeValues != null) { int id = prototypeValues.findId(name); if (id != 0) { return prototypeValues.getAttributes(id); } } return super.getAttributes(name); }