public JsValue EvaluateUnaryExpression(UnaryExpression unaryExpression) { var value = _engine.EvaluateExpression(unaryExpression.Argument); Reference r; switch (unaryExpression.Operator) { case UnaryOperator.Plus: return TypeConverter.ToNumber(_engine.GetValue(value)); case UnaryOperator.Minus: var n = TypeConverter.ToNumber(_engine.GetValue(value)); return double.IsNaN(n) ? double.NaN : n*-1; case UnaryOperator.BitwiseNot: return ~TypeConverter.ToInt32(_engine.GetValue(value)); case UnaryOperator.LogicalNot: return !TypeConverter.ToBoolean(_engine.GetValue(value)); case UnaryOperator.Delete: r = value as Reference; if (r == null) { return true; } if (r.IsUnresolvableReference()) { if (r.IsStrict()) { throw new JavaScriptException(_engine.SyntaxError); } return true; } if (r.IsPropertyReference()) { var o = TypeConverter.ToObject(_engine, r.GetBase()); return o.Delete(r.GetReferencedName(), r.IsStrict()); } if (r.IsStrict()) { throw new JavaScriptException(_engine.SyntaxError); } var bindings = r.GetBase().TryCast<EnvironmentRecord>(); return bindings.DeleteBinding(r.GetReferencedName()); case UnaryOperator.Void: _engine.GetValue(value); return Undefined.Instance; case UnaryOperator.TypeOf: r = value as Reference; if (r != null) { if (r.IsUnresolvableReference()) { return "undefined"; } } var v = _engine.GetValue(value); if (v == Undefined.Instance) { return "undefined"; } if (v == Null.Instance) { return "object"; } switch (v.Type) { case Types.Boolean: return "boolean"; case Types.Number: return "number"; case Types.String: return "string"; } if (v.TryCast<ICallable>() != null) { return "function"; } return "object"; default: throw new ArgumentException(); } }
public ExpressionContext(JScriptBuilder builder, UnaryExpression e) : this(builder) { _op = OperatorInfo.GetUnary(e.Operator, e.Prefix); Enter(); }
private void EmitUnaryExpression(UnaryExpression e) { if (e.Prefix) { using (var ec = new Wpf2Html5.Builder.ExpressionContext(this, e)) { Write(ec.Token); Emit(e.Argument); } } else { using (var ec = new Wpf2Html5.Builder.ExpressionContext(this, e)) { Emit(e.Argument); Write(ec.Token); } } }