Example #1
0
        internal BootstrapMethod(JavaClassImage image, BootstrapMethodInfo info)
        {
            _handle = new LazyValue <MethodHandle>(() =>
            {
                var constantInfo = image.ClassFile.ConstantPool.ResolveConstant(info.MethodRefIndex);
                return(constantInfo is MethodHandleInfo methodHandleInfo
                    ? new MethodHandle(image, methodHandleInfo)
                    : null);
            });

            Arguments = new List <object>(info.Arguments.Count);
            foreach (ushort argIndex in info.Arguments)
            {
                Arguments.Add(ResolveArgument(image, argIndex));
            }
        }
Example #2
0
        public int GetBootstrapMethodIndex(BootstrapMethod bootstrapMethod)
        {
            var info = new BootstrapMethodInfo
            {
                MethodRefIndex = (ushort)ConstantPoolBuffer.GetMethodHandleIndex(bootstrapMethod.Handle),
            };

            foreach (var arg in bootstrapMethod.Arguments)
            {
                info.Arguments.Add((ushort)ConstantPoolBuffer.GetStaticConstantIndex(arg));
            }

            if (!_bootstrapInfos.TryGetValue(info, out int index))
            {
                var methods = BootstrapMethodsAttribute.BootstrapMethods;
                index = methods.Count;
                methods.Add(info);
                _bootstrapInfos.Add(info, index);
            }

            return(index);
        }