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

📄 nativearray.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
            argc--;        }        long end = begin + count;        /* If there are elements to remove, put them into the return value. */        if (count != 0) {            if (count == 1                && (cx.getLanguageVersion() == Context.VERSION_1_2))            {                /*                 * JS lacks "list context", whereby in Perl one turns the                 * single scalar that's spliced out into an array just by                 * assigning it to @single instead of $single, or by using it                 * as Perl push's first argument, for instance.                 *                 * JS1.2 emulated Perl too closely and returned a non-Array for                 * the single-splice-out case, requiring callers to test and                 * wrap in [] if necessary.  So JS1.3, default, and other                 * versions all return an array of length 1 for uniformity.                 */                result = getElem(cx, thisObj, begin);            } else {                for (long last = begin; last != end; last++) {                    Scriptable resultArray = (Scriptable)result;                    Object temp = getElem(cx, thisObj, last);                    setElem(cx, resultArray, last - begin, temp);                }            }        } else if (count == 0                   && cx.getLanguageVersion() == Context.VERSION_1_2)        {            /* Emulate C JS1.2; if no elements are removed, return undefined. */            result = Undefined.instance;        }        /* Find the direction (up or down) to copy and make way for argv. */        long delta = argc - count;        if (delta > 0) {            for (long last = length - 1; last >= end; last--) {                Object temp = getElem(cx, thisObj, last);                setElem(cx, thisObj, last + delta, temp);            }        } else if (delta < 0) {            for (long last = end; last < length; last++) {                Object temp = getElem(cx, thisObj, last);                setElem(cx, thisObj, last + delta, temp);            }        }        /* Copy from argv into the hole to complete the splice. */        int argoffset = args.length - argc;        for (int i = 0; i < argc; i++) {            setElem(cx, thisObj, begin + i, args[i + argoffset]);        }        /* Update length in case we deleted elements from the end. */        setLengthProperty(cx, thisObj, length + delta);        return result;    }    /*     * See Ecma 262v3 15.4.4.4     */    private static Scriptable js_concat(Context cx, Scriptable scope,                                        Scriptable thisObj, Object[] args)    {        // create an empty Array to return.        scope = getTopLevelScope(scope);        Function ctor = ScriptRuntime.getExistingCtor(cx, scope, "Array");        Scriptable result = ctor.construct(cx, scope, ScriptRuntime.emptyArgs);        long length;        long slot = 0;        /* Put the target in the result array; only add it as an array         * if it looks like one.         */        if (ScriptRuntime.instanceOf(thisObj, ctor, cx)) {            length = getLengthProperty(cx, thisObj);            // Copy from the target object into the result            for (slot = 0; slot < length; slot++) {                Object temp = getElem(cx, thisObj, slot);                setElem(cx, result, slot, temp);            }        } else {            setElem(cx, result, slot++, thisObj);        }        /* Copy from the arguments into the result.  If any argument         * has a numeric length property, treat it as an array and add         * elements separately; otherwise, just copy the argument.         */        for (int i = 0; i < args.length; i++) {            if (ScriptRuntime.instanceOf(args[i], ctor, cx)) {                // ScriptRuntime.instanceOf => instanceof Scriptable                Scriptable arg = (Scriptable)args[i];                length = getLengthProperty(cx, arg);                for (long j = 0; j < length; j++, slot++) {                    Object temp = getElem(cx, arg, j);                    setElem(cx, result, slot, temp);                }            } else {                setElem(cx, result, slot++, args[i]);            }        }        return result;    }    private Scriptable js_slice(Context cx, Scriptable thisObj,                                Object[] args)    {        Scriptable scope = getTopLevelScope(this);        Scriptable result = ScriptRuntime.newObject(cx, scope, "Array", null);        long length = getLengthProperty(cx, thisObj);        long begin, end;        if (args.length == 0) {            begin = 0;            end = length;        } else {            begin = toSliceIndex(ScriptRuntime.toInteger(args[0]), length);            if (args.length == 1) {                end = length;            } else {                end = toSliceIndex(ScriptRuntime.toInteger(args[1]), length);            }        }        for (long slot = begin; slot < end; slot++) {            Object temp = getElem(cx, thisObj, slot);            setElem(cx, result, slot - begin, temp);        }        return result;    }    private static long toSliceIndex(double value, long length) {        long result;        if (value < 0.0) {            if (value + length < 0.0) {                result = 0;            } else {                result = (long)(value + length);            }        } else if (value > length) {            result = length;        } else {            result = (long)value;        }        return result;    }    /**     * Implements the methods "indexOf" and "lastIndexOf".     */    private Object indexOfHelper(Context cx, Scriptable thisObj,                                 Object[] args, boolean isLast)    {        Object compareTo = args.length > 0 ? args[0] : Undefined.instance;        long length = getLengthProperty(cx, thisObj);        long start = args.length > 1             ? ScriptRuntime.toInt32(ScriptRuntime.toNumber(args[1]))            : (isLast ? length : 0);        if (start < 0) {            start += length;            if (start < 0)                start = 0;        }        if (isLast) {          for (long i=start; i >= 0 ; i--) {              if (ScriptRuntime.shallowEq(getElem(cx, thisObj, i), compareTo)) {                  return new Long(i);              }          }        } else {          for (long i=start; i < length; i++) {              if (ScriptRuntime.shallowEq(getElem(cx, thisObj, i), compareTo)) {                  return new Long(i);              }          }        }        return NEGATIVE_ONE;    }    /**     * Implements the methods "every", "filter", "forEach", "map", and "some".     */    private Object iterativeMethod(Context cx, int id, Scriptable scope,                                    Scriptable thisObj, Object[] args)    {        Object callbackArg = args.length > 0 ? args[0] : Undefined.instance;        if (callbackArg == null || !(callbackArg instanceof Function)) {            throw ScriptRuntime.notFunctionError(                     ScriptRuntime.toString(callbackArg));        }        Function f = (Function) callbackArg;        Scriptable parent = ScriptableObject.getTopLevelScope(f);        Scriptable thisArg = args.length > 1 && args[1] instanceof Scriptable                             ? (Scriptable) args[1]                             : parent;        long length = getLengthProperty(cx, thisObj);        Scriptable array = null;        if (id == Id_filter) {            array = ScriptRuntime.newObject(cx, scope, "Array", null);        } else if (id == Id_map) {            // allocate dense array for efficiency            Object[] ctorArgs = { new Long(length) };            array = ScriptRuntime.newObject(cx, scope, "Array", ctorArgs);        }        Object[] innerArgs = new Object[3];        long j=0;        for (long i=0; i < length; i++) {            innerArgs[0] = getElem(cx, thisObj, i);            innerArgs[1] = new Long(i);            innerArgs[2] = thisObj;            Object result = f.call(cx, parent, thisArg, innerArgs);            switch (id) {              case Id_every:                if (!ScriptRuntime.toBoolean(result))                    return Boolean.FALSE;                break;              case Id_filter:                if (ScriptRuntime.toBoolean(result))                  setElem(cx, array, j++, innerArgs[0]);                break;              case Id_forEach:                break;              case Id_map:                setElem(cx, array, j++, result);                break;              case Id_some:                if (ScriptRuntime.toBoolean(result))                    return Boolean.TRUE;                break;            }        }        switch (id) {          case Id_every:            return Boolean.TRUE;          case Id_filter:          case Id_map:            return array;          case Id_some:            return Boolean.FALSE;          case Id_forEach:          default:            return Undefined.instance;        }    }// #string_id_map#    protected int findPrototypeId(String s)    {        int id;// #generated# Last update: 2005-09-26 15:47:42 EDT        L0: { id = 0; String X = null; int c;            L: switch (s.length()) {            case 3: c=s.charAt(0);                if (c=='m') { if (s.charAt(2)=='p' && s.charAt(1)=='a') {id=Id_map; break L0;} }                else if (c=='p') { if (s.charAt(2)=='p' && s.charAt(1)=='o') {id=Id_pop; break L0;} }                break L;            case 4: switch (s.charAt(2)) {                case 'i': X="join";id=Id_join; break L;                case 'm': X="some";id=Id_some; break L;                case 'r': X="sort";id=Id_sort; break L;                case 's': X="push";id=Id_push; break L;                } break L;            case 5: c=s.charAt(1);                if (c=='h') { X="shift";id=Id_shift; }                else if (c=='l') { X="slice";id=Id_slice; }                else if (c=='v') { X="every";id=Id_every; }                break L;            case 6: c=s.charAt(0);                if (c=='c') { X="concat";id=Id_concat; }                else if (c=='f') { X="filter";id=Id_filter; }                else if (c=='s') { X="splice";id=Id_splice; }                break L;            case 7: switch (s.charAt(0)) {                case 'f': X="forEach";id=Id_forEach; break L;                case 'i': X="indexOf";id=Id_indexOf; break L;                case 'r': X="reverse";id=Id_reverse; break L;                case 'u': X="unshift";id=Id_unshift; break L;                } break L;            case 8: c=s.charAt(3);                if (c=='o') { X="toSource";id=Id_toSource; }                else if (c=='t') { X="toString";id=Id_toString; }                break L;            case 11: c=s.charAt(0);                if (c=='c') { X="constructor";id=Id_constructor; }                else if (c=='l') { X="lastIndexOf";id=Id_lastIndexOf; }                break L;            case 14: X="toLocaleString";id=Id_toLocaleString; break L;            }            if (X!=null && X!=s && !X.equals(s)) id = 0;        }// #/generated#        return id;    }    private static final int        Id_constructor          = 1,        Id_toString             = 2,        Id_toLocaleString       = 3,        Id_toSource             = 4,        Id_join                 = 5,        Id_reverse              = 6,        Id_sort                 = 7,        Id_push                 = 8,        Id_pop                  = 9,        Id_shift                = 10,        Id_unshift              = 11,        Id_splice               = 12,        Id_concat               = 13,        Id_slice                = 14,        Id_indexOf              = 15,        Id_lastIndexOf          = 16,        Id_every                = 17,        Id_filter               = 18,        Id_forEach              = 19,        Id_map                  = 20,        Id_some                 = 21,        MAX_PROTOTYPE_ID        = 21;// #/string_id_map#    private long length;    private Object[] dense;    private static final int maximumDenseLength = 10000;}

⌨️ 快捷键说明

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