Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit aaa4652

Browse files
committed
Refactor JsAot to fix NRE's
1 parent 54d94be commit aaa4652

File tree

5 files changed

+55
-32
lines changed

5 files changed

+55
-32
lines changed

src/ServiceStack.Text/CsvReader.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,8 @@ public static object ReadObjectRow(string csv)
315315

316316
public static List<Dictionary<string, string>> ReadStringDictionary(IEnumerable<string> rows)
317317
{
318+
if (rows == null) return null; //AOT
319+
318320
var to = new List<Dictionary<string, string>>();
319321

320322
List<string> headers = null;

src/ServiceStack.Text/CsvSerializer.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.IO;
55
using System.Linq;
66
using System.Reflection;
7+
using System.Runtime.CompilerServices;
78
using System.Text;
89
using System.Threading;
910
using ServiceStack.Text.Common;
@@ -223,6 +224,22 @@ internal static object ConvertFrom(Type type, object results)
223224

224225
return results.ConvertTo(type);
225226
}
227+
228+
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
229+
public static void InitAot<T>()
230+
{
231+
CsvSerializer<T>.WriteFn();
232+
CsvSerializer<T>.WriteObject(null, null);
233+
CsvWriter<T>.Write(null, default(IEnumerable<T>));
234+
CsvWriter<T>.WriteRow(null, default(T));
235+
CsvWriter<T>.WriteObject(null, default(IEnumerable<T>));
236+
CsvWriter<T>.WriteObjectRow(null, default(IEnumerable<T>));
237+
238+
CsvReader<T>.ReadRow(null);
239+
CsvReader<T>.ReadObject(null);
240+
CsvReader<T>.ReadObjectRow(null);
241+
CsvReader<T>.ReadStringDictionary(null);
242+
}
226243
}
227244

228245
public static class CsvSerializer<T>
@@ -517,6 +534,8 @@ public static object ReadEnumerableProperty(string row)
517534

518535
public static object ReadNonEnumerableType(string row)
519536
{
537+
if (row == null) return null; //AOT
538+
520539
var value = readElementFn(row);
521540
var to = typeof(T).CreateInstance();
522541
valueSetter(to, value);
@@ -525,6 +544,8 @@ public static object ReadNonEnumerableType(string row)
525544

526545
public static object ReadObject(string value)
527546
{
547+
if (value == null) return null; //AOT
548+
528549
var hold = JsState.IsCsv;
529550
JsState.IsCsv = true;
530551
try
@@ -536,7 +557,5 @@ public static object ReadObject(string value)
536557
JsState.IsCsv = hold;
537558
}
538559
}
539-
540-
541560
}
542561
}

src/ServiceStack.Text/CsvWriter.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ internal class CsvDictionaryWriter
1010
{
1111
public static void WriteRow(TextWriter writer, IEnumerable<string> row)
1212
{
13+
if (writer == null) return; //AOT
14+
1315
var ranOnce = false;
1416
foreach (var field in row)
1517
{
@@ -22,6 +24,8 @@ public static void WriteRow(TextWriter writer, IEnumerable<string> row)
2224

2325
public static void WriteObjectRow(TextWriter writer, IEnumerable<object> row)
2426
{
27+
if (writer == null) return; //AOT
28+
2529
var ranOnce = false;
2630
foreach (var field in row)
2731
{
@@ -241,11 +245,15 @@ public static List<List<string>> GetRows(IEnumerable<T> records)
241245

242246
public static void WriteObject(TextWriter writer, object records)
243247
{
248+
if (writer == null) return; //AOT
249+
244250
Write(writer, (IEnumerable<T>)records);
245251
}
246252

247253
public static void WriteObjectRow(TextWriter writer, object record)
248254
{
255+
if (writer == null) return; //AOT
256+
249257
WriteRow(writer, (T)record);
250258
}
251259

@@ -331,6 +339,8 @@ public static void WriteRow(TextWriter writer, T row)
331339

332340
public static void WriteRow(TextWriter writer, IEnumerable<string> row)
333341
{
342+
if (writer == null) return; //AOT
343+
334344
var ranOnce = false;
335345
foreach (var field in row)
336346
{
@@ -343,6 +353,8 @@ public static void WriteRow(TextWriter writer, IEnumerable<string> row)
343353

344354
public static void Write(TextWriter writer, IEnumerable<List<string>> rows)
345355
{
356+
if (writer == null) return; //AOT
357+
346358
if (Headers.Count > 0)
347359
{
348360
var ranOnce = false;

src/ServiceStack.Text/JsAot.cs

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ public static void Run()
3232
try
3333
{
3434
RegisterForAot();
35+
36+
//Uncomment if using EncryptedMessagingFeature
37+
//RegisterTypeForAot<EncryptedMessage>();
38+
//RegisterTypeForAot<EncryptedMessageResponse>();
3539
}
3640
catch (Exception ex)
3741
{
@@ -99,27 +103,19 @@ internal static void RegisterForAot()
99103
}
100104

101105
[Preserve]
106+
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
102107
public static void RegisterTypeForAot<T>()
103108
{
104109
AotConfig.RegisterSerializers<T>();
105110
}
106111

107-
[Preserve]
108-
public static void RegisterQueryStringWriter()
109-
{
110-
var i = 0;
111-
if (QueryStringWriter<Poco>.WriteFn() != null) i++;
112-
}
113-
114112
[Preserve]
115113
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
116-
public static int RegisterElement<T, TElement>()
114+
public static void RegisterElement<T, TElement>()
117115
{
118-
var i = 0;
119116
AotConfig.RegisterSerializers<TElement>();
120117
AotConfig.RegisterElement<T, TElement, Text.Json.JsonTypeSerializer>();
121118
AotConfig.RegisterElement<T, TElement, Text.Jsv.JsvTypeSerializer>();
122-
return i;
123119
}
124120

125121
[Preserve(AllMembers = true)]
@@ -148,7 +144,6 @@ static AotConfig()
148144
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
149145
internal static void RegisterSerializers<T>()
150146
{
151-
var i = 0;
152147
Register<T, Text.Json.JsonTypeSerializer>();
153148
jsonSerializer.GetParseFn<T>();
154149
jsonSerializer.GetWriteFn<T>();
@@ -161,18 +156,8 @@ internal static void RegisterSerializers<T>()
161156
jsvReader.GetParseFn<T>();
162157
jsvWriter.GetWriteFn<T>();
163158

164-
RegisterCsvSerializer<T>();
165-
RegisterQueryStringWriter();
166-
}
167-
168-
[Preserve]
169-
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
170-
internal static void RegisterCsvSerializer<T>()
171-
{
172-
CsvSerializer<T>.WriteFn();
173-
CsvSerializer<T>.WriteObject(null, null);
174-
CsvWriter<T>.Write(null, default(IEnumerable<T>));
175-
CsvWriter<T>.WriteRow(null, default(T));
159+
CsvSerializer.InitAot<T>();
160+
QueryStringWriter<T>.WriteFn();
176161
}
177162

178163
[Preserve]
@@ -187,8 +172,6 @@ public static ParseStringDelegate GetParseFn(Type type)
187172
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
188173
internal static void Register<T, TSerializer>() where TSerializer : ITypeSerializer
189174
{
190-
var i = 0;
191-
192175
Text.Json.JsonReader.InitAot<T>();
193176
Text.Json.JsonWriter.InitAot<T>();
194177

@@ -206,11 +189,11 @@ internal static void Register<T, TSerializer>() where TSerializer : ITypeSeriali
206189

207190
JsConfig<T>.ExcludeTypeInfo = false;
208191

209-
if (JsConfig<T>.OnDeserializedFn != null) i++;
210-
if (JsConfig<T>.HasDeserializeFn) i++;
211-
if (JsConfig<T>.SerializeFn != null) i++;
212-
if (JsConfig<T>.DeSerializeFn != null) i++;
213-
if (TypeConfig<T>.Properties != null) i++;
192+
var r1 = JsConfig<T>.OnDeserializedFn;
193+
var r2 = JsConfig<T>.HasDeserializeFn;
194+
var r3 = JsConfig<T>.SerializeFn;
195+
var r4 = JsConfig<T>.DeSerializeFn;
196+
var r5 = TypeConfig<T>.Properties;
214197

215198
JsReader<TSerializer>.InitAot<T>();
216199
JsWriter<TSerializer>.InitAot<T>();

src/ServiceStack.Text/QueryStringSerializer.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Globalization;
1818
using System.IO;
1919
using System.Linq;
20+
using System.Runtime.CompilerServices;
2021
using System.Text;
2122
using System.Threading;
2223
using ServiceStack.Text;
@@ -91,6 +92,12 @@ public static string SerializeToString<T>(T value)
9192
GetWriteFn(value.GetType())(writer, value);
9293
return StringWriterThreadStatic.ReturnAndFree(writer);
9394
}
95+
96+
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
97+
public static void InitAot<T>()
98+
{
99+
QueryStringWriter<T>.WriteFn();
100+
}
94101
}
95102

96103
/// <summary>

0 commit comments

Comments
 (0)