Jint.ExecutionVisitor.Assign C# (CSharp) Method

Assign() public method

public Assign ( Jint.Expressions.MemberExpression left, JsInstance value ) : void
left Jint.Expressions.MemberExpression
value Jint.Native.JsInstance
return void
        public void Assign(MemberExpression left, JsInstance value)
        {
            string propertyName;
            Descriptor d = null;

            if (!(left.Member is IAssignable)) {
                throw new JintException("The left member of an assignment must be a member");
            }

            EnsureIdentifierIsDefined(value);

            JsDictionaryObject baseObject;

            if (left.Previous != null) {
                // if this a property
                left.Previous.Accept(this);
                baseObject = Result as JsDictionaryObject;

                if (baseObject == null)
                    throw new JintException("Attempt to assign to an undefined variable.");
            }
            else {
                baseObject = CurrentScope;
                // this a variable
                propertyName = ((Identifier)left.Member).Text;

                CurrentScope.TryGetDescriptor(propertyName, out d);
            }

            // now baseObject contains an object or a scope against which to resolve left.Member

            if (left.Member is Identifier) {
                propertyName = ((Identifier)left.Member).Text;

                // Assigning function Name
                //if (value.Class == JsInstance.CLASS_FUNCTION)
                //    ((JsFunction)value).Name = propertyName;

                Result = baseObject[propertyName] = value;
            }
            else {
                Indexer indexer = left.Member as Indexer;

                // calculate index expression
                indexer.Index.Accept(this);

                if (baseObject is JsObject)
                {
                    JsObject target = baseObject as JsObject;
                    if (target.Indexer != null)
                    {
                        target.Indexer.set(target, Result, value);
                        Result = value;
                        return;
                    }
                }

                // Assigning function Name
                //if (value.Class == JsInstance.CLASS_FUNCTION)
                //    ((JsFunction)value).Name = Result.Value.ToString();
                Result = baseObject[Result] = value;
            }
        }