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

📄 nativearray.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
            N = (int)currentLength;        }        if (N == 0) { return superIds; }        int superLength = superIds.length;        Object[] ids = new Object[N + superLength];        // Make a copy of dense to be immune to removing        // of array elems from other thread when calculating presentCount        System.arraycopy(dense, 0, ids, 0, N);        int presentCount = 0;        for (int i = 0; i != N; ++i) {            // Replace existing elements by their indexes            if (ids[i] != NOT_FOUND) {                ids[presentCount] = new Integer(i);                ++presentCount;            }        }        if (presentCount != N) {            // dense contains deleted elems, need to shrink the result            Object[] tmp = new Object[presentCount + superLength];            System.arraycopy(ids, 0, tmp, 0, presentCount);            ids = tmp;        }        System.arraycopy(superIds, 0, ids, presentCount, superLength);        return ids;    }    public Object getDefaultValue(Class hint)    {        if (hint == ScriptRuntime.NumberClass) {            Context cx = Context.getContext();            if (cx.getLanguageVersion() == Context.VERSION_1_2)                return new Long(length);        }        return super.getDefaultValue(hint);    }    /**     * See ECMA 15.4.1,2     */    private static Object jsConstructor(Context cx, Scriptable scope,                                        Object[] args)    {        if (args.length == 0)            return new NativeArray();        // Only use 1 arg as first element for version 1.2; for        // any other version (including 1.3) follow ECMA and use it as        // a length.        if (cx.getLanguageVersion() == Context.VERSION_1_2) {            return new NativeArray(args);        } else {            Object arg0 = args[0];            if (args.length > 1 || !(arg0 instanceof Number)) {                return new NativeArray(args);            } else {                long len = ScriptRuntime.toUint32(arg0);                if (len != ((Number)arg0).doubleValue())                    throw Context.reportRuntimeError0("msg.arraylength.bad");                return new NativeArray(len);            }        }    }    public long getLength() {        return length;    }    /** @deprecated Use {@link #getLength()} instead. */    public long jsGet_length() {        return getLength();    }    private void setLength(Object val) {        /* XXX do we satisfy this?         * 15.4.5.1 [[Put]](P, V):         * 1. Call the [[CanPut]] method of A with name P.         * 2. If Result(1) is false, return.         * ?         */        double d = ScriptRuntime.toNumber(val);        long longVal = ScriptRuntime.toUint32(d);        if (longVal != d)            throw Context.reportRuntimeError0("msg.arraylength.bad");        if (longVal < length) {            // remove all properties between longVal and length            if (length - longVal > 0x1000) {                // assume that the representation is sparse                Object[] e = getIds(); // will only find in object itself                for (int i=0; i < e.length; i++) {                    Object id = e[i];                    if (id instanceof String) {                        // > MAXINT will appear as string                        String strId = (String)id;                        long index = toArrayIndex(strId);                        if (index >= longVal)                            delete(strId);                    } else {                        int index = ((Integer)id).intValue();                        if (index >= longVal)                            delete(index);                    }                }            } else {                // assume a dense representation                for (long i = longVal; i < length; i++) {                    deleteElem(this, i);                }            }        }        length = longVal;    }    /* Support for generic Array-ish objects.  Most of the Array     * functions try to be generic; anything that has a length     * property is assumed to be an array.     * getLengthProperty returns 0 if obj does not have the length property     * or its value is not convertible to a number.     */    static long getLengthProperty(Context cx, Scriptable obj) {        // These will both give numeric lengths within Uint32 range.        if (obj instanceof NativeString) {            return ((NativeString)obj).getLength();        } else if (obj instanceof NativeArray) {            return ((NativeArray)obj).getLength();        } else if (!(obj instanceof Scriptable)) {            return 0;        }        return ScriptRuntime.toUint32(            ScriptRuntime.getObjectProp(obj, "length", cx));    }    private static Object setLengthProperty(Context cx, Scriptable target,                                            long length)    {        return ScriptRuntime.setObjectProp(                   target, "length", ScriptRuntime.wrapNumber(length), cx);    }    /* Utility functions to encapsulate index > Integer.MAX_VALUE     * handling.  Also avoids unnecessary object creation that would     * be necessary to use the general ScriptRuntime.get/setElem     * functions... though this is probably premature optimization.     */    private static void deleteElem(Scriptable target, long index) {        int i = (int)index;        if (i == index) { target.delete(i); }        else { target.delete(Long.toString(index)); }    }    private static Object getElem(Context cx, Scriptable target, long index)    {        if (index > Integer.MAX_VALUE) {            String id = Long.toString(index);            return ScriptRuntime.getObjectProp(target, id, cx);        } else {            return ScriptRuntime.getObjectIndex(target, (int)index, cx);        }    }    private static void setElem(Context cx, Scriptable target, long index,                                Object value)    {        if (index > Integer.MAX_VALUE) {            String id = Long.toString(index);            ScriptRuntime.setObjectProp(target, id, value, cx);        } else {            ScriptRuntime.setObjectIndex(target, (int)index, value, cx);        }    }    private static String toStringHelper(Context cx, Scriptable scope,                                         Scriptable thisObj,                                         boolean toSource, boolean toLocale)    {        /* It's probably redundant to handle long lengths in this         * function; StringBuffers are limited to 2^31 in java.         */        long length = getLengthProperty(cx, thisObj);        StringBuffer result = new StringBuffer(256);        // whether to return '4,unquoted,5' or '[4, "quoted", 5]'        String separator;        if (toSource) {            result.append('[');            separator = ", ";        } else {            separator = ",";        }        boolean haslast = false;        long i = 0;        boolean toplevel, iterating;        if (cx.iterating == null) {            toplevel = true;            iterating = false;            cx.iterating = new ObjToIntMap(31);        } else {            toplevel = false;            iterating = cx.iterating.has(thisObj);        }        // Make sure cx.iterating is set to null when done        // so we don't leak memory        try {            if (!iterating) {                cx.iterating.put(thisObj, 0); // stop recursion.                for (i = 0; i < length; i++) {                    if (i > 0) result.append(separator);                    Object elem = getElem(cx, thisObj, i);                    if (elem == null || elem == Undefined.instance) {                        haslast = false;                        continue;                    }                    haslast = true;                    if (toSource) {                        result.append(ScriptRuntime.uneval(cx, scope, elem));                    } else if (elem instanceof String) {                        String s = (String)elem;                        if (toSource) {                            result.append('\"');                            result.append(ScriptRuntime.escapeString(s));                            result.append('\"');                        } else {                            result.append(s);                        }                    } else {                        if (toLocale && elem != Undefined.instance &&                            elem != null)                        {                            Callable fun;                            Scriptable funThis;                            fun = ScriptRuntime.getPropFunctionAndThis(                                      elem, "toLocaleString", cx);                            funThis = ScriptRuntime.lastStoredScriptable(cx);                            elem = fun.call(cx, scope, funThis,                                            ScriptRuntime.emptyArgs);                        }                        result.append(ScriptRuntime.toString(elem));                    }                }            }        } finally {            if (toplevel) {                cx.iterating = null;            }        }        if (toSource) {            //for [,,].length behavior; we want toString to be symmetric.            if (!haslast && i > 0)                result.append(", ]");            else                result.append(']');        }        return result.toString();    }    /**     * See ECMA 15.4.4.3     */    private static String js_join(Context cx, Scriptable thisObj,                                  Object[] args)    {        String separator;        long llength = getLengthProperty(cx, thisObj);        int length = (int)llength;        if (llength != length) {            throw Context.reportRuntimeError1(                "msg.arraylength.too.big", String.valueOf(llength));        }        // if no args, use "," as separator        if (args.length < 1 || args[0] == Undefined.instance) {            separator = ",";        } else {            separator = ScriptRuntime.toString(args[0]);        }        if (length == 0) {            return "";        }        String[] buf = new String[length];        int total_size = 0;        for (int i = 0; i != length; i++) {            Object temp = getElem(cx, thisObj, i);            if (temp != null && temp != Undefined.instance) {                String str = ScriptRuntime.toString(temp);                total_size += str.length();                buf[i] = str;            }        }        total_size += (length - 1) * separator.length();        StringBuffer sb = new StringBuffer(total_size);        for (int i = 0; i != length; i++) {            if (i != 0) {                sb.append(separator);            }            String str = buf[i];            if (str != null) {                // str == null for undefined or null                sb.append(str);            }        }        return sb.toString();    }    /**     * See ECMA 15.4.4.4     */    private static Scriptable js_reverse(Context cx, Scriptable thisObj,                                         Object[] args)    {        long len = getLengthProperty(cx, thisObj);        long half = len / 2;        for(long i=0; i < half; i++) {            long j = len - i - 1;            Object temp1 = getElem(cx, thisObj, i);            Object temp2 = getElem(cx, thisObj, j);            setElem(cx, thisObj, i, temp2);            setElem(cx, thisObj, j, temp1);        }        return thisObj;    }    /**     * See ECMA 15.4.4.5

⌨️ 快捷键说明

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