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; } }
/// <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("?"); }
public override string ToString() { return(EsprimaExtensions.DoubleToString(_value)); }