ASFUNCTIONBODY(ASObject,propertyIsEnumerable) { assert_and_throw(argslen==1); multiname name; name.name_type=multiname::NAME_STRING; name.name_s=args[0]->toString(); name.ns.push_back(nsNameAndKind("",NAMESPACE)); name.isAttribute=false; unsigned int index = 0; if (obj->is<Array>()) // propertyIsEnumerable(index) isn't mentioned in the ECMA specs but is tested for { Array* a = static_cast<Array*>(obj); if (a->isValidMultiname(name,index)) { return abstract_b(index < (unsigned int)a->size()); } } if(obj->getClass()) { ASObject* proto = obj->getClass()->prototype.getPtr(); if (proto->hasPropertyByMultiname(name, true)) return abstract_b(false); } if (obj->hasPropertyByMultiname(name,true)) return abstract_b(true); return abstract_b(false); }
ASFUNCTIONBODY(ASObject,hasOwnProperty) { assert_and_throw(argslen==1); multiname name; name.name_type=multiname::NAME_STRING; name.name_s=args[0]->toString(); name.ns.push_back(nsNameAndKind("",NAMESPACE)); name.isAttribute=false; if(obj->getClass()) { ASObject* proto = obj->getClass()->prototype.getPtr(); if (proto != obj && proto->hasPropertyByMultiname(name, true)) return abstract_b(false); } bool ret=obj->hasPropertyByMultiname(name, true); return abstract_b(ret); }
// Conversion to ASObject ASObject* ExtVariant::getASObject() const { ASObject* asobj; switch(getType()) { case EV_STRING: asobj = Class<ASString>::getInstanceS(getString().c_str()); break; case EV_INT32: asobj = abstract_i(getInt()); break; case EV_DOUBLE: asobj = abstract_d(getDouble()); break; case EV_BOOLEAN: asobj = abstract_b(getBoolean()); break; case EV_OBJECT: { ExtObject* objValue = getObject(); ExtVariant* property; uint32_t count; // We are converting an array, so lets set indexes if(objValue->getType() == ExtObject::EO_ARRAY) { asobj = Class<Array>::getInstanceS(); count = objValue->getLength(); static_cast<Array*>(asobj)->resize(count); for(uint32_t i = 0; i < count; i++) { property = objValue->getProperty(i); assert(property); static_cast<Array*>(asobj)->set(i, _MR(property->getASObject())); delete property; } } // We are converting an object, so lets set variables else { asobj = Class<ASObject>::getInstanceS(); ExtIdentifier** ids; uint32_t count; std::stringstream conv; if(objValue != NULL && objValue->enumerate(&ids, &count)) { for(uint32_t i = 0; i < count; i++) { property = objValue->getProperty(*ids[i]); if(ids[i]->getType() == ExtIdentifier::EI_STRING) { asobj->setVariableByQName(ids[i]->getString(), "", property->getASObject(), DYNAMIC_TRAIT); } else { conv.str(""); conv << ids[i]->getInt(); if(asobj->hasPropertyByMultiname(QName(conv.str(),""),true,true)) { LOG(LOG_NOT_IMPLEMENTED,"ExtVariant::getASObject: duplicate property " << conv.str()); continue; } asobj->setVariableByQName(conv.str().c_str(), "", property->getASObject(), DYNAMIC_TRAIT); } delete property; delete ids[i]; } } delete ids; } if(objValue != NULL) delete objValue; } break; case EV_NULL: asobj = getSys()->getNullRef(); break; case EV_VOID: default: asobj = getSys()->getUndefinedRef(); break; } return asobj; }