public override void Visit(DeleteExpression node) { Visit((UnaryExpression)node); }
//{ // Visit(node, Types.Operations.Convert.ToObject); // _ilGen.Callvirt(Types.DObject.ToDFunction); // _result.ValueType = mdr.ValueTypes.Function; //} #endregion #region Unary Operators; ECMA 11.4 ------------------------------------------------------------------------------------- public override void Visit(DeleteExpression node) { var expression = node.Expression; var parent = expression as ParenExpression; if (parent != null) expression = parent.Expression; var indexer = expression as ReadIndexerExpression; if (indexer != null) { PushLocation(node); var stackState = _localVars.GetTemporaryStackState(); VisitNode(indexer.Container); var containerType = _result.ValueType; VisitNode(indexer.Index); var indexType = _result.ValueType; _localVars.PopTemporariesAfter(stackState); _ilGen.Call(Types.Operations.Unary.DeleteProperty.Get(containerType, indexType)); _result.ValueType = mdr.ValueTypes.Boolean; PopLocation(); } else { //we need to visit in case the expression has side effects, but then throw away result var readId = expression as ReadIdentifierExpression; if (readId != null) { PushLocation(node); var stackState = _localVars.GetTemporaryStackState(); VisitNode(readId); AsVoid(); _localVars.PopTemporariesAfter(stackState); _ilGen.Ldloc(_context); _ilGen.Ldc_I4(readId.Symbol.FieldId); _ilGen.Call(Types.Operations.Unary.DeleteVariable.Get(mdr.ValueTypes.Object, mdr.ValueTypes.Int32)); _result.ValueType = mdr.ValueTypes.Boolean; PopLocation(); } else Visit(node, Types.Operations.Unary.Delete); } }
internal static mdr.ValueTypes GetType(DeleteExpression expression) { return Types.Operations.Unary.Delete.ReturnType(expression.Expression.ValueType); }
public override void Visit(DeleteExpression node) { base.Visit(node); node.ValueType = GetType(node); }
public override void Visit(DeleteExpression node) { throw new NotImplementedException(); }
public DeleteExpression MakeDeleteExpression(IExpression expression) { var n = new DeleteExpression((Expression)expression); return n; }
public abstract void Visit(DeleteExpression node);
public override void Visit(DeleteExpression node) { PushLocation(node); var expression = node.Expression; var parent = expression as ParenExpression; if (parent != null) expression = parent.Expression; var indexer = expression as ReadIndexerExpression; if (indexer != null) { VisitNode(indexer.Container); VisitNode(indexer.Index); Call(Types.Operations.Stack.DeleteProperty, 2, 1); } else { //we need to visit in case the expression has side effects, but then return false VisitNode(node.Expression); var readId = expression as ReadIdentifierExpression; if (readId != null) { Call(Types.Operations.Stack.Pop, 1, 0); _ilGen.Ldloc(_context); Call(Types.Operations.Stack.LoadDObject, 0, 1); _ilGen.Ldc_I4(readId.Symbol.FieldId); Call(Types.Operations.Stack.LoadInt, 0, 1); Call(Types.Operations.Stack.DeleteVariable, 2, 1); } else Call(Types.Operations.Stack.Delete, 1, 1); } PopLocation(); }
public DeleteExpression MakeDeleteExpression(IExpression expression) { var n = new DeleteExpression((Expression)expression); return(n); }
public override void Visit(DeleteExpression node) { AssignToImplicitReturn(node); }