Apple Swift 循环上下文的修改规则
Apple Swift mangling rules for recurring context
在装有 Swift 5.6 的 MacOS 上,并给定 mangling rules from here 和以下 Swift 代码:
class Car //AB
{
class Foo //AD
{
func Foo() -> Void //AD
{
}
}
}
Foo
的合成名称是 _$s4TEST3CarC3FooCADyyF
(目标名称 TEST
),我不明白为什么 Foo
的索引代码是 AD
,我希望 AC
被分配:
AA AB AC
TEST.Car.Foo.Foo
在另一个例子中:
class TEST //AA
{
class Car //AC
{
class Foo //AE
{
class Car //AC
{
func Foo() -> Void //AE
{
}
}
}
}
}
损坏的名称是 _$s4TESTAAC3CarC3FooCACCAEyyF
,同样这些是我要分配的值:
AA AB AC
TEST.TEST.Car.Foo.Car.Foo
为什么在第一个长格式编码 3Foo
之后将 Foo
分配给 AE
?为什么 AB
和 AD
被跳过而不被使用?请注意,这仅针对字符串中的经常性项目,如果没有经常性项目,我可以愉快地进行编码。
在第一种情况下,替换索引分配如下:
AA TEST
AB Car
AC TEST.Car
AD Foo
AE TEST.Car.Foo
您可以使用 this question 中的分解代码获得这些结果。 Demangle 方法的损坏名称,只是没有 F
后缀 - 这是为了允许我们将我们选择的任何 A
替换添加到末尾。 (我还删除了 yy
以减少输出中的噪音)
print(swift_demangle("$s4TEST3CarC3FooCAdA")!)
print(swift_demangle("$s4TEST3CarC3FooCAdB")!)
print(swift_demangle("$s4TEST3CarC3FooCAdC")!)
print(swift_demangle("$s4TEST3CarC3FooCAdD")!)
print(swift_demangle("$s4TEST3CarC3FooCAdE")!)
/*
TEST.Car.FooFooTEST
TEST.Car.FooFooCar
TEST.Car.FooFooTEST.Car
TEST.Car.FooFooFoo
TEST.Car.FooFooTEST.Car.Foo
*/
所以事实证明,当处理算法处理 Car
时,它还“记住”了 TEST.Car
的替代(因为它可能是名义类型),而不仅仅是 Car
自己。无论以后是否使用替换都会发生这种情况,可能是为了更容易进行分解 (?)
当您将代码更改为:
时,您也可以看到它的效果
class Car
{
class Foo
{
func Foo() -> Car
{
fatalError("")
}
}
}
现在方法 Foo
的损坏名称是 $s6output3CarC3FooCAdCyF
,利用了 AC
.
作为心智模型,您可以将其视为与错位名称中的字母 C
以及 <number><identifier>
部分相关联的替代索引,如下所示:
$s4TEST3CarC3FooCADyyF
^ ^ ^ ^ ^
| | | | |
AA ABAC ADAE
第二种情况发生了类似的事情。 AB
是 TEST.TEST
,AD
是 TEST.TEST.Car
。
在装有 Swift 5.6 的 MacOS 上,并给定 mangling rules from here 和以下 Swift 代码:
class Car //AB
{
class Foo //AD
{
func Foo() -> Void //AD
{
}
}
}
Foo
的合成名称是 _$s4TEST3CarC3FooCADyyF
(目标名称 TEST
),我不明白为什么 Foo
的索引代码是 AD
,我希望 AC
被分配:
AA AB AC
TEST.Car.Foo.Foo
在另一个例子中:
class TEST //AA
{
class Car //AC
{
class Foo //AE
{
class Car //AC
{
func Foo() -> Void //AE
{
}
}
}
}
}
损坏的名称是 _$s4TESTAAC3CarC3FooCACCAEyyF
,同样这些是我要分配的值:
AA AB AC
TEST.TEST.Car.Foo.Car.Foo
为什么在第一个长格式编码 3Foo
之后将 Foo
分配给 AE
?为什么 AB
和 AD
被跳过而不被使用?请注意,这仅针对字符串中的经常性项目,如果没有经常性项目,我可以愉快地进行编码。
在第一种情况下,替换索引分配如下:
AA TEST
AB Car
AC TEST.Car
AD Foo
AE TEST.Car.Foo
您可以使用 this question 中的分解代码获得这些结果。 Demangle 方法的损坏名称,只是没有 F
后缀 - 这是为了允许我们将我们选择的任何 A
替换添加到末尾。 (我还删除了 yy
以减少输出中的噪音)
print(swift_demangle("$s4TEST3CarC3FooCAdA")!)
print(swift_demangle("$s4TEST3CarC3FooCAdB")!)
print(swift_demangle("$s4TEST3CarC3FooCAdC")!)
print(swift_demangle("$s4TEST3CarC3FooCAdD")!)
print(swift_demangle("$s4TEST3CarC3FooCAdE")!)
/*
TEST.Car.FooFooTEST
TEST.Car.FooFooCar
TEST.Car.FooFooTEST.Car
TEST.Car.FooFooFoo
TEST.Car.FooFooTEST.Car.Foo
*/
所以事实证明,当处理算法处理 Car
时,它还“记住”了 TEST.Car
的替代(因为它可能是名义类型),而不仅仅是 Car
自己。无论以后是否使用替换都会发生这种情况,可能是为了更容易进行分解 (?)
当您将代码更改为:
时,您也可以看到它的效果class Car
{
class Foo
{
func Foo() -> Car
{
fatalError("")
}
}
}
现在方法 Foo
的损坏名称是 $s6output3CarC3FooCAdCyF
,利用了 AC
.
作为心智模型,您可以将其视为与错位名称中的字母 C
以及 <number><identifier>
部分相关联的替代索引,如下所示:
$s4TEST3CarC3FooCADyyF
^ ^ ^ ^ ^
| | | | |
AA ABAC ADAE
第二种情况发生了类似的事情。 AB
是 TEST.TEST
,AD
是 TEST.TEST.Car
。