53 lines
832 B
C#
53 lines
832 B
C#
using System;
|
|
using System.Threading;
|
|
|
|
namespace AspClassic.Scripting;
|
|
|
|
public sealed class ScopeVariable : IScopeVariable, IWeakReferencable
|
|
{
|
|
private object _value;
|
|
|
|
private WeakReference _weakref;
|
|
|
|
private static readonly object _novalue = new object();
|
|
|
|
public bool HasValue => _value != _novalue;
|
|
|
|
public WeakReference WeakReference
|
|
{
|
|
get
|
|
{
|
|
if (_weakref == null)
|
|
{
|
|
_weakref = new WeakReference(this);
|
|
}
|
|
return _weakref;
|
|
}
|
|
}
|
|
|
|
internal ScopeVariable()
|
|
{
|
|
_value = _novalue;
|
|
}
|
|
|
|
public bool TryGetValue(out dynamic value)
|
|
{
|
|
value = _value;
|
|
if ((object)value != _novalue)
|
|
{
|
|
return true;
|
|
}
|
|
value = null;
|
|
return false;
|
|
}
|
|
|
|
public void SetValue(object value)
|
|
{
|
|
_value = value;
|
|
}
|
|
|
|
public bool DeleteValue()
|
|
{
|
|
return Interlocked.Exchange(ref _value, _novalue) != _novalue;
|
|
}
|
|
}
|