BOOL NullTypeHandlerBase::DeleteProperty(DynamicObject* instance, PropertyId propertyId, PropertyOperationFlags flags) { // Check numeric propertyId only if objectArray is available ScriptContext* scriptContext = instance->GetScriptContext(); uint32 indexVal; if (instance->HasObjectArray() && scriptContext->IsNumericPropertyId(propertyId, &indexVal)) { return DynamicTypeHandler::DeleteItem(instance, indexVal, flags); } return true; }
PropertyQueryFlags HeapArgumentsObject::HasPropertyQuery(PropertyId id, _Inout_opt_ PropertyValueInfo* info) { ScriptContext *scriptContext = GetScriptContext(); // Try to get a numbered property that maps to an actual argument. uint32 index; if (scriptContext->IsNumericPropertyId(id, &index) && index < this->HeapArgumentsObject::GetNumberOfArguments()) { return HeapArgumentsObject::HasItemQuery(index); } return DynamicObject::HasPropertyQuery(id, info); }
BOOL NullTypeHandlerBase::GetProperty(DynamicObject* instance, Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) { // Check numeric propertyId only if objectArray is available uint32 indexVal; ScriptContext* scriptContext = instance->GetScriptContext(); if (instance->HasObjectArray() && scriptContext->IsNumericPropertyId(propertyId, &indexVal)) { return DynamicTypeHandler::GetItem(instance, originalInstance, indexVal, value, requestContext); } *value = requestContext->GetMissingPropertyResult(); return false; }
BOOL NullTypeHandlerBase::HasProperty(DynamicObject* instance, PropertyId propertyId, __out_opt bool *noRedecl) { // Check numeric propertyId only if objectArray is available uint32 indexVal; ScriptContext* scriptContext = instance->GetScriptContext(); if (noRedecl != nullptr) { *noRedecl = false; } if (instance->HasObjectArray() && scriptContext->IsNumericPropertyId(propertyId, &indexVal)) { return DynamicTypeHandler::HasItem(instance, indexVal); } return false; }
BOOL HeapArgumentsObject::SetProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) { // Try to set a numbered property that maps to an actual argument. ScriptContext *scriptContext = GetScriptContext(); uint32 index; if (scriptContext->IsNumericPropertyId(propertyId, &index) && index < this->HeapArgumentsObject::GetNumberOfArguments()) { if (this->SetItemAt(index, value)) { return true; } } // TODO: In strict mode, "callee" and "caller" cannot be set. // length is also set in the dynamic object return DynamicObject::SetProperty(propertyId, value, flags, info); }
PropertyQueryFlags HeapArgumentsObject::GetPropertyQuery(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) { ScriptContext *scriptContext = GetScriptContext(); // Try to get a numbered property that maps to an actual argument. uint32 index; if (scriptContext->IsNumericPropertyId(propertyId, &index) && index < this->HeapArgumentsObject::GetNumberOfArguments()) { if (this->GetItemAt(index, value, requestContext)) { return PropertyQueryFlags::Property_Found; } } if (JavascriptConversion::PropertyQueryFlagsToBoolean(DynamicObject::GetPropertyQuery(originalInstance, propertyId, value, info, requestContext))) { // Property has been pre-set and not deleted. Use it. return PropertyQueryFlags::Property_Found; } *value = requestContext->GetMissingPropertyResult(); return PropertyQueryFlags::Property_NotFound; }