Skip to content

Instantly share code, notes, and snippets.

@lahma
Last active December 6, 2018 20:47
Show Gist options
  • Select an option

  • Save lahma/012cf97ca0677294242e547c26a89bc3 to your computer and use it in GitHub Desktop.

Select an option

Save lahma/012cf97ca0677294242e547c26a89bc3 to your computer and use it in GitHub Desktop.
internal class JintLiteralExpression : JintExpression
{
internal readonly JsValue _cachedValue;
public JintLiteralExpression(Engine engine, Literal expression) : base(engine, expression)
{
_cachedValue = ConvertToJsValue(expression);
}
internal static JsValue ConvertToJsValue(Literal literal)
{
if (literal.TokenType == TokenType.BooleanLiteral)
{
return literal.NumericValue > 0.0 ? JsBoolean.True : JsBoolean.False;
}
if (literal.TokenType == TokenType.NullLiteral)
{
return JsValue.Null;
}
if (literal.TokenType == TokenType.NumericLiteral)
{
return JsNumber.Create(literal.NumericValue);
}
if (literal.TokenType == TokenType.StringLiteral)
{
return JsString.Create((string) literal.Value);
}
return null;
}
public override JsValue GetValue()
{
// need to notify correct node when taking shortcut
_engine._lastSyntaxNode = _expression;
return _cachedValue ?? ResolveValue();
}
protected override object EvaluateInternal()
{
return GetValue();
}
private JsValue ResolveValue()
{
var expression = (Literal) _expression;
if (expression.TokenType == TokenType.RegularExpression)
{
return _engine.RegExp.Construct((System.Text.RegularExpressions.Regex) expression.Value, expression.Regex.Flags);
}
return JsValue.FromObject(_engine, expression.Value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment