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;
}
}