/// <summary> /// http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.1 /// </summary> /// <param name="memberExpression"></param> /// <returns></returns> public Reference EvaluateMemberExpression(MemberExpression memberExpression) { var baseReference = EvaluateExpression(memberExpression.Object); var baseValue = _engine.GetValue(baseReference); Expression expression = memberExpression.Property; if (!memberExpression.Computed) // index accessor ? { expression = new Literal { Type = SyntaxNodes.Literal, Value = memberExpression.Property.As<Identifier>().Name }; } var propertyNameReference = EvaluateExpression(expression); var propertyNameValue = _engine.GetValue(propertyNameReference); TypeConverter.CheckObjectCoercible(_engine, baseValue); var propertyNameString = TypeConverter.ToString(propertyNameValue); return new Reference(baseValue, propertyNameString, StrictModeScope.IsStrictModeCode); }
private void EmitMemberExpression(MemberExpression e) { Emit(e.Object); if (e.Computed) { Write("["); Emit(e.Property); Write("]"); } else { Write("."); Emit(e.Property); } }