SyncObjectInitializer.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Mono.CecilX;
  2. using Mono.CecilX.Cil;
  3. namespace Mirror.Weaver
  4. {
  5. public static class SyncObjectInitializer
  6. {
  7. public static void GenerateSyncObjectInitializer(ILProcessor worker, FieldDefinition fd)
  8. {
  9. // register syncobject in network behaviour
  10. GenerateSyncObjectRegistration(worker, fd);
  11. }
  12. public static bool ImplementsSyncObject(TypeReference typeRef)
  13. {
  14. try
  15. {
  16. // value types cant inherit from SyncObject
  17. if (typeRef.IsValueType)
  18. {
  19. return false;
  20. }
  21. return typeRef.Resolve().ImplementsInterface<SyncObject>();
  22. }
  23. catch
  24. {
  25. // sometimes this will fail if we reference a weird library that can't be resolved, so we just swallow that exception and return false
  26. }
  27. return false;
  28. }
  29. /*
  30. // generates code like:
  31. this.InitSyncObject(m_sizes);
  32. */
  33. static void GenerateSyncObjectRegistration(ILProcessor worker, FieldDefinition fd)
  34. {
  35. worker.Emit(OpCodes.Ldarg_0);
  36. worker.Emit(OpCodes.Ldarg_0);
  37. worker.Emit(OpCodes.Ldfld, fd);
  38. worker.Emit(OpCodes.Call, WeaverTypes.InitSyncObjectReference);
  39. }
  40. }
  41. }