26using IKVM.ByteCode.Decoding;
31 sealed partial class ClassFile
37 internal sealed class ConstantPoolItemClass : ConstantPoolItem, IEquatable<ConstantPoolItemClass>
40 static readonly
char[] InvalidJava15Characters = [
'.',
';',
'[',
']'];
42 readonly ClassConstantData _data;
44 RuntimeJavaType _javaType;
52 public ConstantPoolItemClass(RuntimeContext context, ClassConstantData data) :
64 public ConstantPoolItemClass(RuntimeContext context,
string name, RuntimeJavaType javaType) :
78 _name = classFile.GetConstantPoolUtf8String(utf8_cp, _data.Name);
88 if (
char.IsLetter(prev) || prev ==
'$' || prev ==
'_' || prev ==
'[' || prev ==
'/')
91 int end = _name.Length;
97 while (_name[skip] ==
'[')
100 if (_name.EndsWith(
";"))
104 for (
int i = skip; i < end; i++)
107 if (!
char.IsLetterOrDigit(c) && c !=
'$' && c !=
'_' && (c !=
'/' || prev ==
'/'))
113 _name =
string.Intern(_name.Replace(
'/',
'.'));
122 int end = _name.Length;
132 if (_name[end - 1] ==
';')
135 while (_name[start] ==
'[')
139 if (_name.IndexOfAny(InvalidJava15Characters, start, end - start) >= 0)
142 _name =
string.Intern(_name.Replace(
'/',
'.'));
149 public override void MarkLinkRequired()
154 internal void LinkSelf(RuntimeJavaType thisType)
156 _javaType = thisType;
160 public override void Link(RuntimeJavaType thisType,
LoadMode mode)
164 var tw = thisType.ClassLoader.LoadClass(_name, mode |
LoadMode.WarnClassNotFound);
166#if IMPORTER == false && FIRST_PASS == false
167 if (!tw.IsUnloadable)
171 thisType.ClassLoader.CheckPackageAccess(tw, thisType.ClassObject.pd);
175 tw =
new RuntimeUnloadableJavaType(Context, _name);
187 public string Name => _name;
193 public RuntimeJavaType GetClassType()
199 public override ConstantType GetConstantType()
201 return ConstantType.Class;
209 public bool Equals(ConstantPoolItemClass other)
211 return ReferenceEquals(_name, other._name);
215 public sealed override int GetHashCode()
217 return _name.GetHashCode();
global::java.lang.invoke.LambdaForm.Name Name
static bool IsValidFieldDescriptor(string descriptor)
Returns true if the specified descriptor is a valid field descriptor.
RuntimeVerifierJavaTypeFactory VerifierJavaTypeFactory
Gets the RuntimeVerifierJavaTypeFactory associated with this instance of the runtime.