Пример #1
0
        public virtual bool MoveNext()
        {
            // OPT this could be more efficient
            bool result;

            for (; ;)
            {
                if (obj == null)
                {
                    result = false;
                    break;
                }
                if (index == ids.Length)
                {
                    obj = obj.GetPrototype();
                    this.ChangeObject();
                    continue;
                }
                object id = ids [index++];
                if (used != null && used.has(id))
                {
                    continue;
                }
                if (id is string)
                {
                    string strId = (string)id;
                    if (!obj.Has(strId, obj))
                    {
                        continue; // must have been deleted
                    }
                    currentId = strId;
                }
                else
                {
                    int intId = Convert.ToInt32(id);
                    if (!obj.Has(intId, obj))
                    {
                        continue; // must have been deleted
                    }
                    currentId = Convert.ToString(intId);
                }
                result = true;
                break;
            }
            return(result);
        }
 private static IScriptable GetBase (IScriptable obj, int index)
 {
     do {
         if (obj.Has (index, obj))
             break;
         obj = obj.GetPrototype ();
     }
     while (obj != null);
     return obj;
 }
 private static IScriptable GetBase (IScriptable obj, string name)
 {
     do {
         if (obj.Has (name, obj))
             break;
         obj = obj.GetPrototype ();
     }
     while (obj != null);
     return obj;
 }
Пример #4
0
        public override object ExecIdCall(IdFunctionObject f, Context cx, IScriptable scope, IScriptable thisObj, object [] args)
        {
            if (!f.HasTag(OBJECT_TAG))
            {
                return(base.ExecIdCall(f, cx, scope, thisObj, args));
            }
            int id = f.MethodId;

            switch (id)
            {
            case Id_constructor: {
                if (thisObj != null)
                {
                    // BaseFunction.construct will set up parent, proto
                    return(f.Construct(cx, scope, args));
                }
                if (args.Length == 0 || args [0] == null || args [0] == Undefined.Value)
                {
                    return(new BuiltinObject());
                }
                return(ScriptConvert.ToObject(cx, scope, args [0]));
            }


            case Id_toLocaleString:
            // For now just alias toString
            case Id_toString: {
                if (cx.HasFeature(Context.Features.ToStringAsSource))
                {
                    string s = ScriptRuntime.defaultObjectToSource(cx, scope, thisObj, args);
                    int    L = s.Length;
                    if (L != 0 && s [0] == '(' && s [L - 1] == ')')
                    {
                        // Strip () that surrounds toSource
                        s = s.Substring(1, (L - 1) - (1));
                    }
                    return(s);
                }
                return(ScriptRuntime.DefaultObjectToString(thisObj));
            }


            case Id_valueOf:
                return(thisObj);


            case Id_hasOwnProperty: {
                bool result;
                if (args.Length == 0)
                {
                    result = false;
                }
                else
                {
                    string s = ScriptRuntime.ToStringIdOrIndex(cx, args [0]);
                    if (s == null)
                    {
                        int index = ScriptRuntime.lastIndexResult(cx);
                        result = thisObj.Has(index, thisObj);
                    }
                    else
                    {
                        result = thisObj.Has(s, thisObj);
                    }
                }
                return(result);
            }


            case Id_propertyIsEnumerable: {
                bool result;
                if (args.Length == 0)
                {
                    result = false;
                }
                else
                {
                    string s = ScriptRuntime.ToStringIdOrIndex(cx, args [0]);
                    if (s == null)
                    {
                        int index = ScriptRuntime.lastIndexResult(cx);
                        result = thisObj.Has(index, thisObj);
                        if (result && thisObj is ScriptableObject)
                        {
                            ScriptableObject so = (ScriptableObject)thisObj;
                            int attrs           = so.GetAttributes(index);
                            result = ((attrs & ScriptableObject.DONTENUM) == 0);
                        }
                    }
                    else
                    {
                        result = thisObj.Has(s, thisObj);
                        if (result && thisObj is ScriptableObject)
                        {
                            ScriptableObject so = (ScriptableObject)thisObj;
                            int attrs           = so.GetAttributes(s);
                            result = ((attrs & ScriptableObject.DONTENUM) == 0);
                        }
                    }
                }
                return(result);
            }


            case Id_isPrototypeOf: {
                bool result = false;
                if (args.Length != 0 && args [0] is IScriptable)
                {
                    IScriptable v = (IScriptable)args [0];
                    do
                    {
                        v = v.GetPrototype();
                        if (v == thisObj)
                        {
                            result = true;
                            break;
                        }
                    }while (v != null);
                }
                return(result);
            }


            case Id_toSource:
                return(ScriptRuntime.defaultObjectToSource(cx, scope, thisObj, args));


            case Id___lookupGetter__:
            case Id___lookupSetter__: {
                if (args.Length < 1)
                {
                    return(Undefined.Value);
                }

                string name  = ScriptRuntime.ToStringIdOrIndex(cx, args [0]);
                int    index = (name != null) ? name.GetHashCode() : ScriptRuntime.lastIndexResult(cx);

                // TODO: delegate way up to prototypes?
                ScriptableObject so = (thisObj as ScriptableObject);
                if (so == null)
                {
                    throw ScriptRuntime.TypeError("this is not a scriptable object.");
                }

                if (id == Id___lookupGetter__)
                {
                    return(so.LookupGetter(name));
                }
                else
                {
                    return(so.LookupSetter(name));
                }
            }

            case Id___defineGetter__:
            case Id___defineSetter__: {
                if (args.Length < 2 || args.Length > 0 && !(args [1] is ICallable))
                {
                    object badArg = (args.Length > 1 ? args [1] : Undefined.Value);
                    throw ScriptRuntime.NotFunctionError(badArg);
                }

                string name  = ScriptRuntime.ToStringIdOrIndex(cx, args [0]);
                int    index = (name != null) ? name.GetHashCode() : ScriptRuntime.lastIndexResult(cx);

                // TODO: delegate way up to prototypes?
                ScriptableObject so = (thisObj as ScriptableObject);
                if (so == null)
                {
                    throw ScriptRuntime.TypeError("this is not a scriptable object.");
                }
                ICallable getterOrSetter = (ICallable)args [1];

                if (id == Id___defineGetter__)
                {
                    if (name == null)
                    {
                        so.DefineGetter(index, getterOrSetter);
                    }
                    else
                    {
                        so.DefineGetter(name, getterOrSetter);
                    }
                }
                else
                {
                    if (name == null)
                    {
                        so.DefineSetter(index, getterOrSetter);
                    }
                    else
                    {
                        so.DefineSetter(name, getterOrSetter);
                    }
                }

                return(Undefined.Value);

                break;
            }

            default:
                throw new ArgumentException(Convert.ToString(id));
            }
        }
Пример #5
0
        public override object ExecIdCall(IdFunctionObject f, Context cx, IScriptable scope, IScriptable thisObj, object [] args)
        {
            if (!f.HasTag (OBJECT_TAG)) {
                return base.ExecIdCall (f, cx, scope, thisObj, args);
            }
            int id = f.MethodId;
            switch (id) {

                case Id_constructor: {
                        if (thisObj != null) {
                            // BaseFunction.construct will set up parent, proto
                            return f.Construct (cx, scope, args);
                        }
                        if (args.Length == 0 || args [0] == null || args [0] == Undefined.Value) {
                            return new BuiltinObject ();
                        }
                        return ScriptConvert.ToObject (cx, scope, args [0]);
                    }

                case Id_toLocaleString:
                // For now just alias toString
                case Id_toString: {
                        if (cx.HasFeature (Context.Features.ToStringAsSource)) {
                            string s = ScriptRuntime.defaultObjectToSource (cx, scope, thisObj, args);
                            int L = s.Length;
                            if (L != 0 && s [0] == '(' && s [L - 1] == ')') {
                                // Strip () that surrounds toSource
                                s = s.Substring (1, (L - 1) - (1));
                            }
                            return s;
                        }
                        return ScriptRuntime.DefaultObjectToString (thisObj);
                    }

                case Id_valueOf:
                    return thisObj;

                case Id_hasOwnProperty: {
                        bool result;
                        if (args.Length == 0) {
                            result = false;
                        }
                        else {
                            string s = ScriptRuntime.ToStringIdOrIndex (cx, args [0]);
                            if (s == null) {
                                int index = ScriptRuntime.lastIndexResult (cx);
                                result = thisObj.Has (index, thisObj);
                            }
                            else {
                                result = thisObj.Has (s, thisObj);
                            }
                        }
                        return result;
                    }

                case Id_propertyIsEnumerable: {
                        bool result;
                        if (args.Length == 0) {
                            result = false;
                        }
                        else {
                            string s = ScriptRuntime.ToStringIdOrIndex (cx, args [0]);
                            if (s == null) {
                                int index = ScriptRuntime.lastIndexResult (cx);
                                result = thisObj.Has (index, thisObj);
                                if (result && thisObj is ScriptableObject) {
                                    ScriptableObject so = (ScriptableObject)thisObj;
                                    int attrs = so.GetAttributes (index);
                                    result = ((attrs & ScriptableObject.DONTENUM) == 0);
                                }
                            }
                            else {
                                result = thisObj.Has (s, thisObj);
                                if (result && thisObj is ScriptableObject) {
                                    ScriptableObject so = (ScriptableObject)thisObj;
                                    int attrs = so.GetAttributes (s);
                                    result = ((attrs & ScriptableObject.DONTENUM) == 0);
                                }
                            }
                        }
                        return result;
                    }

                case Id_isPrototypeOf: {
                        bool result = false;
                        if (args.Length != 0 && args [0] is IScriptable) {
                            IScriptable v = (IScriptable)args [0];
                            do {
                                v = v.GetPrototype ();
                                if (v == thisObj) {
                                    result = true;
                                    break;
                                }
                            }
                            while (v != null);
                        }
                        return result;
                    }

                case Id_toSource:
                    return ScriptRuntime.defaultObjectToSource (cx, scope, thisObj, args);

                case Id___lookupGetter__:
                case Id___lookupSetter__: {
                        if (args.Length < 1)
                            return Undefined.Value;

                        string name = ScriptRuntime.ToStringIdOrIndex (cx, args [0]);
                        int index = (name != null) ? name.GetHashCode () : ScriptRuntime.lastIndexResult (cx);

                        // TODO: delegate way up to prototypes?
                        ScriptableObject so = (thisObj as ScriptableObject);
                        if (so == null) {
                            throw ScriptRuntime.TypeError ("this is not a scriptable object.");
                        }

                        if (id == Id___lookupGetter__) {
                            return so.LookupGetter (name);
                        }
                        else {
                            return so.LookupSetter (name);
                        }
                    }

                case Id___defineGetter__:
                case Id___defineSetter__: {
                        if (args.Length < 2 || args.Length > 0 && !(args [1] is ICallable)) {
                            object badArg = (args.Length > 1 ? args [1] : Undefined.Value);
                            throw ScriptRuntime.NotFunctionError (badArg);
                        }

                        string name = ScriptRuntime.ToStringIdOrIndex (cx, args [0]);
                        int index = (name != null) ? name.GetHashCode () : ScriptRuntime.lastIndexResult (cx);

                        // TODO: delegate way up to prototypes?
                        ScriptableObject so = (thisObj as ScriptableObject);
                        if (so == null) {
                            throw ScriptRuntime.TypeError ("this is not a scriptable object.");
                        }
                        ICallable getterOrSetter = (ICallable)args [1];

                        if (id == Id___defineGetter__) {
                            if (name == null) {
                                so.DefineGetter (index, getterOrSetter);
                            } else {
                                so.DefineGetter (name, getterOrSetter);
                            }
                        }
                        else {
                            if (name == null) {
                                so.DefineSetter (index, getterOrSetter);
                            } else {
                                so.DefineSetter (name, getterOrSetter);
                            }
                        }

                        return Undefined.Value;
                        break;
                    }

                default:
                    throw new ArgumentException (Convert.ToString (id));

            }
        }
Пример #6
0
 public virtual bool Has(string name, IScriptable start)
 {
     return(obj.Has(name, start));
 }