// E4X 13.3.1, page 66 // this = argv[0] (ignored) // arg1 = argv[1] // argN = argv[argc] Atom QNameClass::call(int argc, Atom* argv) { if (argc == 1) { AvmCore* core = this->core(); if (core->isObject(argv[1]) && AvmCore::istype(argv[1], core->traits.qName_itraits)) return argv[1]; } return construct (argc, argv); }
// E4X 13.3.2, page 67 Atom QNameClass::construct(int argc, Atom* argv) { AvmCore* core = this->core(); if (argc == 0) return (new (core->GetGC(), ivtable()->getExtraSize()) QNameObject(this, undefinedAtom))->atom(); if (argc == 1) { if (core->isObject(argv[1]) && AvmCore::istype(argv[1], core->traits.qName_itraits)) return argv[1]; return (new (core->GetGC(), ivtable()->getExtraSize()) QNameObject(this, argv[1]))->atom(); } else { Atom a = argv[1]; if (a == undefinedAtom) { // ns undefined same as unspecified return (new (core->GetGC(), ivtable()->getExtraSize()) QNameObject(this, argv[2]))->atom(); } else { Namespace* ns; if (AvmCore::isNull(a)) ns = NULL; // It's important to preserve the incoming namespace because it's type // may not be public. I.E... // namespace ns; // q = new QName(ns, "name"); // ns is a NS_PackageInternal ns // If we ever use this QName as a multiname, we need to preserve the exact ns else if (core->isNamespace(a)) ns = core->atomToNamespace(a); else ns = core->newNamespace (a); return (new (core->GetGC(), ivtable()->getExtraSize()) QNameObject(this, ns, argv[2]))->atom(); } } }