protected override void Initialize(EvaluationContext context)
        {
            _canBuildFast = true;
            var expression = (ObjectExpression)_expression;

            if (expression.Properties.Count == 0)
            {
                // empty object initializer
                return;
            }

            var engine = context.Engine;

            _valueExpressions = new JintExpression[expression.Properties.Count];
            _properties       = new ObjectProperty[expression.Properties.Count];

            for (var i = 0; i < _properties.Length; i++)
            {
                string?propName = null;
                var    property = expression.Properties[i];
                if (property is Property p)
                {
                    if (p.Key is Literal literal)
                    {
                        propName = EsprimaExtensions.LiteralKeyToString(literal);
                    }

                    if (!p.Computed && p.Key is Identifier identifier)
                    {
                        propName       = identifier.Name;
                        _canBuildFast &= propName != "__proto__";
                    }

                    _properties[i] = new ObjectProperty(propName, p);

                    if (p.Kind == PropertyKind.Init || p.Kind == PropertyKind.Data)
                    {
                        var propertyValue = p.Value;
                        _valueExpressions[i] = Build(engine, propertyValue);
                        _canBuildFast       &= !propertyValue.IsFunctionDefinition();
                    }
                    else
                    {
                        _canBuildFast = false;
                    }
                }
                else if (property is SpreadElement spreadElement)
                {
                    _canBuildFast        = false;
                    _properties[i]       = null;
                    _valueExpressions[i] = Build(engine, spreadElement.Argument);
                }
                else
                {
                    ExceptionHelper.ThrowArgumentOutOfRangeException("property", "cannot handle property " + property);
                }

                _canBuildFast &= propName != null;
            }
        }
Exemple #2
0
        /// <summary>
        /// A version of <see cref="EsprimaExtensions.GetKey"/> that cannot get into loop as we are already building a stack.
        /// </summary>
        private static string GetPropertyKey(Expression expression)
        {
            if (expression is Literal literal)
            {
                return(EsprimaExtensions.LiteralKeyToString(literal));
            }

            if (expression is Identifier identifier)
            {
                return(identifier.Name);
            }

            if (expression is StaticMemberExpression staticMemberExpression)
            {
                return(GetPropertyKey(staticMemberExpression.Object) + "." + GetPropertyKey(staticMemberExpression.Property));
            }

            return("?");
        }
Exemple #3
0
 public override string ToString()
 {
     return(EsprimaExtensions.DoubleToString(_value));
 }