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

📄 nativearray.java

📁 這是一個javascript 的 interpreter是了解 web browser的好材料
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
        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;        if (isLast) {            // lastIndexOf            /*             * From http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:lastIndexOf             * The index at which to start searching backwards. Defaults to the             * array's length, i.e. the whole array will be searched. If the             * index is greater than or equal to the length of the array, the             * whole array will be searched. If negative, it is taken as the             * offset from the end of the array. Note that even when the index             * is negative, the array is still searched from back to front. If             * the calculated index is less than 0, -1 is returned, i.e. the             * array will not be searched.             */            if (args.length < 2) {                // default                start = length-1;            } else {                start = ScriptRuntime.toInt32(ScriptRuntime.toNumber(args[1]));                if (start >= length)                    start = length-1;                else if (start < 0)                    start += length;                // Note that start may be negative, but that's okay                // as the result of -1 will fall out from the code below            }        } else {            // indexOf            /*             * From http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf             * The index at which to begin the search. Defaults to 0, i.e. the             * whole array will be searched. If the index is greater than or             * equal to the length of the array, -1 is returned, i.e. the array             * will not be searched. If negative, it is taken as the offset from             * the end of the array. Note that even when the index is negative,             * the array is still searched from front to back. If the calculated             * index is less than 0, the whole array will be searched.             */            if (args.length < 2) {                // default                start = 0;            } else {                start = ScriptRuntime.toInt32(ScriptRuntime.toNumber(args[1]));                if (start < 0) {                    start += length;                    if (start < 0)                        start = 0;                }                // Note that start may be > length-1, but that's okay                // as the result of -1 will fall out from the code below            }        }        if (thisObj instanceof NativeArray) {            NativeArray na = (NativeArray) thisObj;            if (na.denseOnly) {                if (isLast) {                  for (int i=(int)start; i >= 0; i--) {                      if (na.dense[i] != Scriptable.NOT_FOUND &&                          ScriptRuntime.shallowEq(na.dense[i], compareTo))                      {                          return new Long(i);                      }                  }                } else {                  for (int i=(int)start; i < length; i++) {                      if (na.dense[i] != Scriptable.NOT_FOUND &&                          ScriptRuntime.shallowEq(na.dense[i], compareTo))                      {                          return new Long(i);                      }                  }                }                return NEGATIVE_ONE;            }        }        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;        if (args.length < 2 || args[1] == null || args[1] == Undefined.instance)        {            thisArg = parent;        } else {            thisArg = ScriptRuntime.toObject(cx, scope, args[1]);        }        long length = getLengthProperty(cx, thisObj);        Scriptable array = ScriptRuntime.newObject(cx, scope, "Array", null);        long j=0;        for (long i=0; i < length; i++) {            Object[] innerArgs = new Object[3];            Object elem = (i > Integer.MAX_VALUE)                ? ScriptableObject.getProperty(thisObj, Long.toString(i))                : ScriptableObject.getProperty(thisObj, (int)i);            if (elem == Scriptable.NOT_FOUND) {                continue;            }            innerArgs[0] = elem;            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, i, 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 static final int        ConstructorId_join                 = -Id_join,        ConstructorId_reverse              = -Id_reverse,        ConstructorId_sort                 = -Id_sort,        ConstructorId_push                 = -Id_push,        ConstructorId_pop                  = -Id_pop,        ConstructorId_shift                = -Id_shift,        ConstructorId_unshift              = -Id_unshift,        ConstructorId_splice               = -Id_splice,        ConstructorId_concat               = -Id_concat,        ConstructorId_slice                = -Id_slice,        ConstructorId_indexOf              = -Id_indexOf,        ConstructorId_lastIndexOf          = -Id_lastIndexOf,        ConstructorId_every                = -Id_every,        ConstructorId_filter               = -Id_filter,        ConstructorId_forEach              = -Id_forEach,        ConstructorId_map                  = -Id_map,        ConstructorId_some                 = -Id_some;    /**     * Internal representation of the JavaScript array's length property.     */    private long length;    /**     * Fast storage for dense arrays. Sparse arrays will use the superclass's     * hashtable storage scheme.     */    private Object[] dense;    /**     * True if all numeric properties are stored in <code>dense</code>.     */    private boolean denseOnly;    /**     * The maximum size of <code>dense</code> that will be allocated initially.     */    private static int maximumInitialCapacity = 10000;    /**     * The default capacity for <code>dense</code>.     */    private static final int DEFAULT_INITIAL_CAPACITY = 10;    /**     * The factor to grow <code>dense</code> by.     */    private static final double GROW_FACTOR = 1.5;    private static final int MAX_PRE_GROW_SIZE = (int)(Integer.MAX_VALUE / GROW_FACTOR);}

⌨️ 快捷键说明

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