2.3.名称(Names)
AVM中的名称由一个非限定的名称(unqualified name)和一个/多个名称空间(namespace)组合来表示。统称multinames(复合名称?)。multiname实体通常包括一个名称索引(name index)、一个名称空间(namespace)/名称空间集索引(namespace set index)。有些multiname可以在运行时解析名称/名称空间。对象的属性由一个简单的QName命名(名称和名称空间对)。其他类型的multiname用于在运行时解析属性。RTQName, RTQNameL, MultinameL都是运行时multiname。
2.3.1.QName(Qualified Name,限定名称)
最简单的multiname。一个名称只关联一个名称空间,因此QName是限定名称。QName实体包含一个名称索引,后跟名称空间索引。名称索引是字符串常量池(string constant pool)的索引,名称空间索引是名称空间常量池(namespace constant pool)的索引。
QName通常用来表示变量名称,以及类型说明(type annotation)。
public var s:String;
这段代码生成了两个QName实体。一个是变量(public名称空间,名称s),一个是类型String(public名称空间,名称String)。
2.3.2.RTQName(Runtime Qualified Name,运行时限定名称)
这是运行时的QName,名称空间直到运行时才确定。RTQName实体只有一个名称索引,这个索引是字符串常量池的索引。名称空间在运行时确定。RTQName是操作码的操作数,所以栈上至少应该有一个名称空间值供RTQName使用。所以当RTQName被使用时,栈顶的值将被弹出,RTQName使用该值作为名称空间。
RTQName通常用于编译时名称空间不确定的限定名称(qualified names)。
var ns = getANamespace();
x = ns::r;
这段代码生成了一个ns::r的RTQName实体。名称为r,代码将把ns值压入栈中。
2.3.3.RTQNameL(Runtime Qualified Name Late,延迟运行时限定名称)
这也是运行时QName,名称和名称空间都在运行时确定。RTQNameL是操作码的操作数,因此需要一个名称和一个名称空间值在栈中。栈中名称值必须是String类型的,名称空间值必须是Namespace类型的。
RTQNameL通常用于编译时名称和名称空间都不确定的限定名称。
var x = getAName();
var ns = getANamespace();
w = ns::[x];
这段代码将会在常量池中生成ns::[x]的一个RTQNameL实体。它既没有名称,也没有名称空间,但是代码会把ns和x的值压入到栈中。
2.3.4.Multiname(Multiple Namespace Name,多名称空间名称)
这是个包含一个名称和一个名称空间集的multiname。名称空间集表示名称空间的集合。Multiname实体包含一个名称索引,后跟名称空间集索引。名称索引是字符串常量池的索引,名称空间集索引是名称空间常量池索引。
Multiname通常用于非限定名称。所有的开放名称空间都可用于这个multiname。
use namespace t;
trace(f);
这段代码生成了f的一个multiname实体。它包含一个名称f,一个包含所有开发名称空间的名称空间集(public名称空间,名称空间t,其他任何该上下文下的private或internal名称空间)。
2.3.5.MultinameL(Multiple Namespace Name Late,延迟多名称空间名称)
这是个运行时multiname,名称在运行时确定。名称空间集表示名称空间的集合。MultinameL实体有多个名称空间集索引。名称空间集索引是名称空间集常量池的索引。MultinameL是操作码的操作数,因此栈中必须有名称。栈中的名称值必须是String类型。
MultinameL通常用于编译时名称不确定的非限定名称。
use namespace t;
trace(o[x]);
这段代码生成一个MultinameL实体。没有名称,但会有个包含所有该上下文下的开放名称空间的名称空间集。代码将会把x值压入栈中,这个值也用于名称。
2.3.6.解析multiname
通常,解析multi name的搜索顺序是对象的声明trait(declared traits)、动态属性(dynamic properties)、原型链(prototype chain)。
动态属性和原型链的搜索只有当multiname包含public名称空间时才会发生(动态属性总是位于public名称空间,若试图添加一个非public属性,将会抛出运行时错误)。
如果multiname是QName的任何一种类型,QName将会解析为名称相同、名称空间相同的属性,不然,这个QName在这个对象上解析不成功。
如果multiname包含名称空间集,就会搜索这个对象与multiname名称相同、名称空间跟该名称空间集中所有名称空间都匹配的属性。如果匹配了多个属性,将会抛出TypeError,这个multiname的指向是不清楚的。如果没有匹配,这个multiname在这个对象上解析不成功。