Compare commits

...

3 Commits

Author SHA1 Message Date
Alexandre Mutel
94e07d11ce Revert optimization for RendererBase to use a plain type for the dictionary key (#632) 2022-04-23 07:46:26 +02:00
Alexandre Mutel
263041e899 Merge pull request #632 from MihaZupan/wasm-mt-ptr
Don't try to use the MT pointer on unsupported platforms
2022-04-23 07:38:16 +02:00
Miha Zupan
e8f9274b64 Don't try to use the MT pointer on unsupported platforms 2022-04-22 20:36:52 +02:00

View File

@@ -4,7 +4,9 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Markdig.Helpers;
using Markdig.Syntax;
using Markdig.Syntax.Inlines;
@@ -17,20 +19,7 @@ namespace Markdig.Renderers
/// <seealso cref="IMarkdownRenderer" />
public abstract class RendererBase : IMarkdownRenderer
{
private readonly struct KeyWrapper : IEquatable<KeyWrapper>
{
public readonly IntPtr Key;
public KeyWrapper(IntPtr key) => Key = key;
public bool Equals(KeyWrapper other) => Key == other.Key;
public override int GetHashCode() => Key.GetHashCode();
public override bool Equals(object? obj) => throw new NotImplementedException();
}
private readonly Dictionary<KeyWrapper, IMarkdownObjectRenderer?> _renderersPerType = new();
private readonly Dictionary<Type, IMarkdownObjectRenderer?> _renderersPerType = new();
internal int _childrenDepth = 0;
/// <summary>
@@ -40,13 +29,11 @@ namespace Markdig.Renderers
private IMarkdownObjectRenderer? GetRendererInstance(MarkdownObject obj)
{
KeyWrapper key = GetKeyForType(obj);
Type objectType = obj.GetType();
var key = obj.GetType();
for (int i = 0; i < ObjectRenderers.Count; i++)
{
var renderer = ObjectRenderers[i];
if (renderer.Accept(this, objectType))
if (renderer.Accept(this, key))
{
_renderersPerType[key] = renderer;
return renderer;
@@ -154,7 +141,7 @@ namespace Markdig.Renderers
// Calls before writing an object
ObjectWriteBefore?.Invoke(this, obj);
if (!_renderersPerType.TryGetValue(GetKeyForType(obj), out IMarkdownObjectRenderer? renderer))
if (!_renderersPerType.TryGetValue(obj.GetType(), out IMarkdownObjectRenderer? renderer))
{
renderer = GetRendererInstance(obj);
}
@@ -175,22 +162,5 @@ namespace Markdig.Renderers
// Calls after writing an object
ObjectWriteAfter?.Invoke(this, obj);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static KeyWrapper GetKeyForType(MarkdownObject obj)
{
#if NET
IntPtr methodTablePtr = Unsafe.Add(ref Unsafe.As<RawData>(obj).Data, -1);
return new KeyWrapper(methodTablePtr);
#else
IntPtr typeHandle = Type.GetTypeHandle(obj).Value;
return new KeyWrapper(typeHandle);
#endif
}
private sealed class RawData
{
public IntPtr Data;
}
}
}