Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
FuncCallInstruction.cs
Go to the documentation of this file.
2
4
5internal sealed class FuncCallInstruction<TRet> : CallInstruction
6{
7 private readonly Func<TRet> _target;
8
9 public override int ProducedStack => 1;
10
11 public override int ArgumentCount => 0;
12
14 {
15 _target = (Func<TRet>)target.CreateDelegate(typeof(Func<TRet>));
16 }
17
18 public override int Run(InterpretedFrame frame)
19 {
20 frame.Data[frame.StackIndex] = _target();
21 frame.StackIndex -= -1;
22 return 1;
23 }
24
25 public override string ToString()
26 {
27 return "Call(" + _target.Method?.ToString() + ")";
28 }
29}
30internal sealed class FuncCallInstruction<T0, TRet> : CallInstruction
31{
32 private readonly bool _isInstance;
33
34 private readonly Func<T0, TRet> _target;
35
36 public override int ProducedStack => 1;
37
38 public override int ArgumentCount => 1;
39
41 {
42 _isInstance = !target.IsStatic;
43 _target = (Func<T0, TRet>)target.CreateDelegate(typeof(Func<T0, TRet>));
44 }
45
46 public override int Run(InterpretedFrame frame)
47 {
48 object obj = frame.Data[frame.StackIndex - 1];
49 if (_isInstance)
50 {
52 }
53 LightLambda lightLambda;
54 object obj2 = ((!_isInstance || !CallInstruction.TryGetLightLambdaTarget(obj, out lightLambda)) ? ((object)_target((T0)obj)) : InterpretLambdaInvoke(lightLambda, Array.Empty<object>()));
55 frame.Data[frame.StackIndex - 1] = obj2;
56 frame.StackIndex = frame.StackIndex;
57 return 1;
58 }
59
60 public override string ToString()
61 {
62 return "Call(" + _target.Method?.ToString() + ")";
63 }
64}
65internal sealed class FuncCallInstruction<T0, T1, TRet> : CallInstruction
66{
67 private readonly bool _isInstance;
68
69 private readonly Func<T0, T1, TRet> _target;
70
71 public override int ProducedStack => 1;
72
73 public override int ArgumentCount => 2;
74
76 {
77 _isInstance = !target.IsStatic;
78 _target = (Func<T0, T1, TRet>)target.CreateDelegate(typeof(Func<T0, T1, TRet>));
79 }
80
81 public override int Run(InterpretedFrame frame)
82 {
83 object obj = frame.Data[frame.StackIndex - 2];
84 if (_isInstance)
85 {
87 }
88 LightLambda lightLambda;
89 object obj2 = ((!_isInstance || !CallInstruction.TryGetLightLambdaTarget(obj, out lightLambda)) ? ((object)_target((T0)obj, (T1)frame.Data[frame.StackIndex - 1])) : InterpretLambdaInvoke(lightLambda, new object[1] { frame.Data[frame.StackIndex - 1] }));
90 frame.Data[frame.StackIndex - 2] = obj2;
91 frame.StackIndex--;
92 return 1;
93 }
94
95 public override string ToString()
96 {
97 return "Call(" + _target.Method?.ToString() + ")";
98 }
99}
100internal sealed class FuncCallInstruction<T0, T1, T2, TRet> : CallInstruction
101{
102 private readonly bool _isInstance;
103
104 private readonly Func<T0, T1, T2, TRet> _target;
105
106 public override int ProducedStack => 1;
107
108 public override int ArgumentCount => 3;
109
111 {
112 _isInstance = !target.IsStatic;
113 _target = (Func<T0, T1, T2, TRet>)target.CreateDelegate(typeof(Func<T0, T1, T2, TRet>));
114 }
115
116 public override int Run(InterpretedFrame frame)
117 {
118 object obj = frame.Data[frame.StackIndex - 3];
119 if (_isInstance)
120 {
122 }
123 LightLambda lightLambda;
124 object obj2 = ((!_isInstance || !CallInstruction.TryGetLightLambdaTarget(obj, out lightLambda)) ? ((object)_target((T0)obj, (T1)frame.Data[frame.StackIndex - 2], (T2)frame.Data[frame.StackIndex - 1])) : InterpretLambdaInvoke(lightLambda, new object[2]
125 {
126 frame.Data[frame.StackIndex - 2],
127 frame.Data[frame.StackIndex - 1]
128 }));
129 frame.Data[frame.StackIndex - 3] = obj2;
130 frame.StackIndex -= 2;
131 return 1;
132 }
133
134 public override string ToString()
135 {
136 return "Call(" + _target.Method?.ToString() + ")";
137 }
138}
139internal sealed class FuncCallInstruction<T0, T1, T2, T3, TRet> : CallInstruction
140{
141 private readonly bool _isInstance;
142
143 private readonly Func<T0, T1, T2, T3, TRet> _target;
144
145 public override int ProducedStack => 1;
146
147 public override int ArgumentCount => 4;
148
150 {
151 _isInstance = !target.IsStatic;
152 _target = (Func<T0, T1, T2, T3, TRet>)target.CreateDelegate(typeof(Func<T0, T1, T2, T3, TRet>));
153 }
154
155 public override int Run(InterpretedFrame frame)
156 {
157 object obj = frame.Data[frame.StackIndex - 4];
158 if (_isInstance)
159 {
161 }
162 LightLambda lightLambda;
163 object obj2 = ((!_isInstance || !CallInstruction.TryGetLightLambdaTarget(obj, out lightLambda)) ? ((object)_target((T0)obj, (T1)frame.Data[frame.StackIndex - 3], (T2)frame.Data[frame.StackIndex - 2], (T3)frame.Data[frame.StackIndex - 1])) : InterpretLambdaInvoke(lightLambda, new object[3]
164 {
165 frame.Data[frame.StackIndex - 3],
166 frame.Data[frame.StackIndex - 2],
167 frame.Data[frame.StackIndex - 1]
168 }));
169 frame.Data[frame.StackIndex - 4] = obj2;
170 frame.StackIndex -= 3;
171 return 1;
172 }
173
174 public override string ToString()
175 {
176 return "Call(" + _target.Method?.ToString() + ")";
177 }
178}
object InterpretLambdaInvoke(LightLambda targetLambda, object[] args)
static bool TryGetLightLambdaTarget(object instance, [NotNullWhen(true)] out LightLambda lightLambda)
virtual Delegate CreateDelegate(Type delegateType)
Definition MethodInfo.cs:48