⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scriptableobject.java

📁 這是一個javascript 的 interpreter是了解 web browser的好材料
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino code, released * May 6, 1999. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1997-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): *   Norris Boyd *   Igor Bukanov *   Bob Jervis *   Roger Lawrence *   Steve Weiss * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */// API classpackage org.mozilla.javascript;import java.lang.reflect.*;import java.util.Hashtable;import java.io.*;import org.mozilla.javascript.debug.DebuggableObject;/** * This is the default implementation of the Scriptable interface. This * class provides convenient default behavior that makes it easier to * define host objects. * <p> * Various properties and methods of JavaScript objects can be conveniently * defined using methods of ScriptableObject. * <p> * Classes extending ScriptableObject must define the getClassName method. * * @see org.mozilla.javascript.Scriptable * @author Norris Boyd */public abstract class ScriptableObject implements Scriptable, Serializable,                                                  DebuggableObject,                                                  ConstProperties{    /**     * The empty property attribute.     *     * Used by getAttributes() and setAttributes().     *     * @see org.mozilla.javascript.ScriptableObject#getAttributes(String)     * @see org.mozilla.javascript.ScriptableObject#setAttributes(String, int)     */    public static final int EMPTY =     0x00;    /**     * Property attribute indicating assignment to this property is ignored.     *     * @see org.mozilla.javascript.ScriptableObject     *      #put(String, Scriptable, Object)     * @see org.mozilla.javascript.ScriptableObject#getAttributes(String)     * @see org.mozilla.javascript.ScriptableObject#setAttributes(String, int)     */    public static final int READONLY =  0x01;    /**     * Property attribute indicating property is not enumerated.     *     * Only enumerated properties will be returned by getIds().     *     * @see org.mozilla.javascript.ScriptableObject#getIds()     * @see org.mozilla.javascript.ScriptableObject#getAttributes(String)     * @see org.mozilla.javascript.ScriptableObject#setAttributes(String, int)     */    public static final int DONTENUM =  0x02;    /**     * Property attribute indicating property cannot be deleted.     *     * @see org.mozilla.javascript.ScriptableObject#delete(String)     * @see org.mozilla.javascript.ScriptableObject#getAttributes(String)     * @see org.mozilla.javascript.ScriptableObject#setAttributes(String, int)     */    public static final int PERMANENT = 0x04;    /**     * Property attribute indicating that this is a const property that has not     * been assigned yet.  The first 'const' assignment to the property will     * clear this bit.     */    public static final int UNINITIALIZED_CONST = 0x08;    public static final int CONST = PERMANENT|READONLY|UNINITIALIZED_CONST;    /**     * The prototype of this object.     */    private Scriptable prototypeObject;    /**     * The parent scope of this object.     */    private Scriptable parentScopeObject;    private static final Slot REMOVED = new Slot(null, 0, READONLY);    static {        REMOVED.wasDeleted = 1;    }    private transient Slot[] slots;    // If count >= 0, it gives number of keys or if count < 0,    // it indicates sealed object where ~count gives number of keys    private int count;    // cache; may be removed for smaller memory footprint    private transient Slot lastAccess = REMOVED;    // associated values are not serialized    private transient volatile Hashtable associatedValues;    private static final int SLOT_QUERY = 1;    private static final int SLOT_MODIFY = 2;    private static final int SLOT_REMOVE = 3;    private static final int SLOT_MODIFY_GETTER_SETTER = 4;    private static final int SLOT_MODIFY_CONST = 5;    private static class Slot implements Serializable    {        static final long serialVersionUID = -3539051633409902634L;        String name; // This can change due to caching        int indexOrHash;        private volatile short attributes;        transient volatile byte wasDeleted;        volatile Object value;        transient volatile Slot next;        Slot(String name, int indexOrHash, int attributes)        {            this.name = name;            this.indexOrHash = indexOrHash;            this.attributes = (short)attributes;        }        private void readObject(ObjectInputStream in)            throws IOException, ClassNotFoundException        {            in.defaultReadObject();            if (name != null) {                indexOrHash = name.hashCode();            }        }        final int getAttributes()        {            return attributes;        }        final synchronized void setAttributes(int value)        {            checkValidAttributes(value);            attributes = (short)value;        }        final void checkNotReadonly()        {            if ((attributes & READONLY) != 0) {                String str = (name != null ? name                              : Integer.toString(indexOrHash));                throw Context.reportRuntimeError1("msg.modify.readonly", str);            }        }    }    private static final class GetterSlot extends Slot    {        static final long serialVersionUID = -4900574849788797588L;        Object getter;        Object setter;        GetterSlot(String name, int indexOrHash, int attributes)        {            super(name, indexOrHash, attributes);        }    }    static void checkValidAttributes(int attributes)    {        final int mask = READONLY | DONTENUM | PERMANENT | UNINITIALIZED_CONST;        if ((attributes & ~mask) != 0) {            throw new IllegalArgumentException(String.valueOf(attributes));        }    }    public ScriptableObject()    {    }    public ScriptableObject(Scriptable scope, Scriptable prototype)    {        if (scope == null)            throw new IllegalArgumentException();        parentScopeObject = scope;        prototypeObject = prototype;    }    /**     * Return the name of the class.     *     * This is typically the same name as the constructor.     * Classes extending ScriptableObject must implement this abstract     * method.     */    public abstract String getClassName();    /**     * Returns true if the named property is defined.     *     * @param name the name of the property     * @param start the object in which the lookup began     * @return true if and only if the property was found in the object     */    public boolean has(String name, Scriptable start)    {        return null != getSlot(name, 0, SLOT_QUERY);    }    /**     * Returns true if the property index is defined.     *     * @param index the numeric index for the property     * @param start the object in which the lookup began     * @return true if and only if the property was found in the object     */    public boolean has(int index, Scriptable start)    {        return null != getSlot(null, index, SLOT_QUERY);    }    /**     * Returns the value of the named property or NOT_FOUND.     *     * If the property was created using defineProperty, the     * appropriate getter method is called.     *     * @param name the name of the property     * @param start the object in which the lookup began     * @return the value of the property (may be null), or NOT_FOUND     */    public Object get(String name, Scriptable start)    {        return getImpl(name, 0, start);    }    /**     * Returns the value of the indexed property or NOT_FOUND.     *     * @param index the numeric index for the property     * @param start the object in which the lookup began     * @return the value of the property (may be null), or NOT_FOUND     */    public Object get(int index, Scriptable start)    {        return getImpl(null, index, start);    }    /**     * Sets the value of the named property, creating it if need be.     *     * If the property was created using defineProperty, the     * appropriate setter method is called. <p>     *     * If the property's attributes include READONLY, no action is     * taken.     * This method will actually set the property in the start     * object.     *     * @param name the name of the property     * @param start the object whose property is being set     * @param value value to set the property to     */    public void put(String name, Scriptable start, Object value)    {        if (putImpl(name, 0, start, value, EMPTY))            return;        if (start == this) throw Kit.codeBug();        start.put(name, start, value);    }    /**     * Sets the value of the indexed property, creating it if need be.     *     * @param index the numeric index for the property     * @param start the object whose property is being set     * @param value value to set the property to     */    public void put(int index, Scriptable start, Object value)    {        if (putImpl(null, index, start, value, EMPTY))            return;        if (start == this) throw Kit.codeBug();        start.put(index, start, value);    }    /**     * Removes a named property from the object.     *     * If the property is not found, or it has the PERMANENT attribute,     * no action is taken.     *     * @param name the name of the property     */    public void delete(String name)    {        checkNotSealed(name, 0);        accessSlot(name, 0, SLOT_REMOVE);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -