Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ CompileAddress()

ByRefUpdater System.Linq.Expressions.Interpreter.LightCompiler.CompileAddress ( Expression node,
int index )
inlineprivate

Definition at line 1678 of file LightCompiler.cs.

1679 {
1680 if (index != -1 || ShouldWritebackNode(node))
1681 {
1682 switch (node.NodeType)
1683 {
1684 case ExpressionType.Parameter:
1685 LoadLocalNoValueTypeCopy((ParameterExpression)node);
1686 return new ParameterByRefUpdater(ResolveLocal((ParameterExpression)node), index);
1687 case ExpressionType.ArrayIndex:
1688 {
1689 BinaryExpression binaryExpression = (BinaryExpression)node;
1691 }
1692 case ExpressionType.Index:
1693 {
1694 IndexExpression indexExpression = (IndexExpression)node;
1695 if (indexExpression.Indexer != null)
1696 {
1697 LocalDefinition? obj = null;
1698 if (indexExpression.Object != null)
1699 {
1703 _instructions.EmitStoreLocal(obj.GetValueOrDefault().Index);
1704 }
1705 int argumentCount = indexExpression.ArgumentCount;
1706 LocalDefinition[] array = new LocalDefinition[argumentCount];
1707 for (int i = 0; i < argumentCount; i++)
1708 {
1709 Expression argument = indexExpression.GetArgument(i);
1711 LocalDefinition localDefinition = _locals.DefineLocal(Expression.Parameter(argument.Type), _instructions.Count);
1715 }
1717 return new IndexMethodByRefUpdater(obj, array, indexExpression.Indexer.GetSetMethod(), index);
1718 }
1719 if (indexExpression.ArgumentCount == 1)
1720 {
1721 return CompileArrayIndexAddress(indexExpression.Object, indexExpression.GetArgument(0), index);
1722 }
1724 }
1725 case ExpressionType.MemberAccess:
1726 {
1727 MemberExpression memberExpression = (MemberExpression)node;
1728 LocalDefinition? obj2 = null;
1729 if (memberExpression.Expression != null)
1730 {
1731 obj2 = _locals.DefineLocal(Expression.Parameter(memberExpression.Expression.Type, "member"), _instructions.Count);
1734 _instructions.EmitStoreLocal(obj2.GetValueOrDefault().Index);
1735 }
1736 FieldInfo fieldInfo = memberExpression.Member as FieldInfo;
1737 if (fieldInfo != null)
1738 {
1740 if (!fieldInfo.IsLiteral && !fieldInfo.IsInitOnly)
1741 {
1742 return new FieldByRefUpdater(obj2, fieldInfo, index);
1743 }
1744 return null;
1745 }
1746 PropertyInfo propertyInfo = (PropertyInfo)memberExpression.Member;
1747 _instructions.EmitCall(propertyInfo.GetGetMethod(nonPublic: true));
1748 if (propertyInfo.CanWrite)
1749 {
1750 return new PropertyByRefUpdater(obj2, propertyInfo, index);
1751 }
1752 return null;
1753 }
1754 case ExpressionType.Call:
1755 {
1756 MethodCallExpression methodCallExpression = (MethodCallExpression)node;
1757 if (!methodCallExpression.Method.IsStatic && methodCallExpression.Object.Type.IsArray && methodCallExpression.Method == TypeUtils.GetArrayGetMethod(methodCallExpression.Object.Type))
1758 {
1760 }
1761 break;
1762 }
1763 }
1764 }
1765 Compile(node);
1766 return null;
1767 }
static MethodInfo GetArrayGetMethod(Type arrayType)
Definition TypeUtils.cs:769
ByRefUpdater CompileArrayIndexAddress(Expression array, Expression index, int argumentIndex)
void Compile(Expression expr, bool asVoid)
LocalVariable ResolveLocal(ParameterExpression variable)
ByRefUpdater CompileMultiDimArrayAccess(Expression array, IArgumentProvider arguments, int index)
void LoadLocalNoValueTypeCopy(ParameterExpression variable)
LocalDefinition DefineLocal(ParameterExpression variable, int start)

References System.Linq.Expressions.Interpreter.LightCompiler._instructions, System.Linq.Expressions.Interpreter.LightCompiler._locals, System.array, System.Reflection.PropertyInfo.CanWrite, System.Linq.Expressions.Interpreter.LightCompiler.Compile(), System.Linq.Expressions.Interpreter.LightCompiler.CompileArrayIndexAddress(), System.Linq.Expressions.Interpreter.LightCompiler.CompileMultiDimArrayAccess(), System.Linq.Expressions.Interpreter.InstructionList.Count, System.Linq.Expressions.Interpreter.LocalVariables.DefineLocal(), System.Linq.Expressions.Interpreter.InstructionList.EmitCall(), System.Linq.Expressions.Interpreter.InstructionList.EmitDup(), System.Linq.Expressions.Interpreter.LightCompiler.EmitIndexGet(), System.Linq.Expressions.Interpreter.InstructionList.EmitLoadField(), System.Linq.Expressions.Interpreter.InstructionList.EmitStoreLocal(), System.Linq.Expressions.Interpreter.LightCompiler.EmitThisForMethodCall(), System.Dynamic.Utils.TypeUtils.GetArrayGetMethod(), System.Reflection.PropertyInfo.GetGetMethod(), System.Linq.index, System.Linq.Expressions.Interpreter.LightCompiler.LoadLocalNoValueTypeCopy(), System.obj, System.Linq.Expressions.Expression< TDelegate >.Parameter(), System.Linq.Expressions.Interpreter.LightCompiler.ResolveLocal(), and System.Linq.Expressions.Interpreter.LightCompiler.ShouldWritebackNode().

Referenced by System.Linq.Expressions.Interpreter.LightCompiler.CompileConvertUnaryExpression(), System.Linq.Expressions.Interpreter.LightCompiler.CompileMethodCallExpression(), System.Linq.Expressions.Interpreter.LightCompiler.CompileNewExpression(), and System.Linq.Expressions.Interpreter.LightCompiler.EmitThisForMethodCall().