⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285934 in webkit


Ignore:
Timestamp:
Nov 17, 2021, 10:14:27 AM (5 years ago)
Author:
commit-queue@webkit.org
Message:

AX: Use ObjectIdentifier for AXID
https://bugs.webkit.org/show_bug.cgi?id=233248

Patch by Carlos Garcia Campos <cgarcia@igalia.com> on 2021-11-17
Reviewed by Andres Gonzalez.

  • accessibility/AXObjectCache.cpp:

(WebCore::AXObjectCache::setIsolatedTreeFocusedObject):
(WebCore::AXObjectCache::get):
(WebCore::AXObjectCache::cacheAndInitializeWrapper):
(WebCore::AXObjectCache::platformGenerateAXID const):
(WebCore::AXObjectCache::objectsForIDs const):
(WebCore::AXObjectCache::updateIsolatedTree):

  • accessibility/AXObjectCache.h:
  • accessibility/AccessibilityObject.h:
  • accessibility/AccessibilityObjectInterface.h:

(WebCore::AXCoreObject::detach):

  • accessibility/atspi/AccessibilityObjectAtspi.cpp:
  • accessibility/isolatedtree/AXIsolatedObject.cpp:

(WebCore::AXIsolatedObject::AXIsolatedObject):
(WebCore::AXIsolatedObject::associatedAXObject const):
(WebCore::AXIsolatedObject::detachFromParent):
(WebCore::AXIsolatedObject::isDetachedFromParent):
(WebCore::AXIsolatedObject::cellForColumnAndRow):
(WebCore::AXIsolatedObject::accessibilityHitTest const):
(WebCore::AXIsolatedObject::objectAttributeValue const):

  • accessibility/isolatedtree/AXIsolatedObject.h:
  • accessibility/isolatedtree/AXIsolatedTree.cpp:

(WebCore::AXIsolatedTree::nodeForID const):
(WebCore::AXIsolatedTree::idsForObjects const):
(WebCore::AXIsolatedTree::updateChildrenIDs):
(WebCore::AXIsolatedTree::generateSubtree):
(WebCore::AXIsolatedTree::createSubtree):
(WebCore::AXIsolatedTree::updateNode):
(WebCore::AXIsolatedTree::updateChildren):
(WebCore::AXIsolatedTree::removeSubtree):
(WebCore::AXIsolatedTree::applyPendingChanges):

  • accessibility/isolatedtree/AXIsolatedTree.h:

(WebCore::AXIsolatedTree::WTF_GUARDED_BY_LOCK):

  • accessibility/mac/WebAccessibilityObjectWrapperBase.mm:

(-[WebAccessibilityObjectWrapperBase attachAXObject:]):
(-[WebAccessibilityObjectWrapperBase attachIsolatedObject:]):
(-[WebAccessibilityObjectWrapperBase detach]):
(-[WebAccessibilityObjectWrapperBase detachIsolatedObject:]):

  • accessibility/win/AXObjectCacheWin.cpp:

(WebCore::AXObjectCache::platformGenerateAXID const):

Location:
trunk/Source/WebCore
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r285933 r285934  
     12021-11-17  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        AX: Use ObjectIdentifier for AXID
     4        https://bugs.webkit.org/show_bug.cgi?id=233248
     5
     6        Reviewed by Andres Gonzalez.
     7
     8        * accessibility/AXObjectCache.cpp:
     9        (WebCore::AXObjectCache::setIsolatedTreeFocusedObject):
     10        (WebCore::AXObjectCache::get):
     11        (WebCore::AXObjectCache::cacheAndInitializeWrapper):
     12        (WebCore::AXObjectCache::platformGenerateAXID const):
     13        (WebCore::AXObjectCache::objectsForIDs const):
     14        (WebCore::AXObjectCache::updateIsolatedTree):
     15        * accessibility/AXObjectCache.h:
     16        * accessibility/AccessibilityObject.h:
     17        * accessibility/AccessibilityObjectInterface.h:
     18        (WebCore::AXCoreObject::detach):
     19        * accessibility/atspi/AccessibilityObjectAtspi.cpp:
     20        * accessibility/isolatedtree/AXIsolatedObject.cpp:
     21        (WebCore::AXIsolatedObject::AXIsolatedObject):
     22        (WebCore::AXIsolatedObject::associatedAXObject const):
     23        (WebCore::AXIsolatedObject::detachFromParent):
     24        (WebCore::AXIsolatedObject::isDetachedFromParent):
     25        (WebCore::AXIsolatedObject::cellForColumnAndRow):
     26        (WebCore::AXIsolatedObject::accessibilityHitTest const):
     27        (WebCore::AXIsolatedObject::objectAttributeValue const):
     28        * accessibility/isolatedtree/AXIsolatedObject.h:
     29        * accessibility/isolatedtree/AXIsolatedTree.cpp:
     30        (WebCore::AXIsolatedTree::nodeForID const):
     31        (WebCore::AXIsolatedTree::idsForObjects const):
     32        (WebCore::AXIsolatedTree::updateChildrenIDs):
     33        (WebCore::AXIsolatedTree::generateSubtree):
     34        (WebCore::AXIsolatedTree::createSubtree):
     35        (WebCore::AXIsolatedTree::updateNode):
     36        (WebCore::AXIsolatedTree::updateChildren):
     37        (WebCore::AXIsolatedTree::removeSubtree):
     38        (WebCore::AXIsolatedTree::applyPendingChanges):
     39        * accessibility/isolatedtree/AXIsolatedTree.h:
     40        (WebCore::AXIsolatedTree::WTF_GUARDED_BY_LOCK):
     41        * accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
     42        (-[WebAccessibilityObjectWrapperBase attachAXObject:]):
     43        (-[WebAccessibilityObjectWrapperBase attachIsolatedObject:]):
     44        (-[WebAccessibilityObjectWrapperBase detach]):
     45        (-[WebAccessibilityObjectWrapperBase detachIsolatedObject:]):
     46        * accessibility/win/AXObjectCacheWin.cpp:
     47        (WebCore::AXObjectCache::platformGenerateAXID const):
     48
    1492021-11-17  Alan Bujtas  <zalan@apple.com>
    250
  • trunk/Source/WebCore/accessibility/AXLogger.cpp

    r280758 r285934  
    503503    stream.dumpProperty("wrapper", object.wrapper());
    504504
    505     stream.dumpProperty("parentObject", parent ? parent->objectID() : 0);
     505    stream.dumpProperty("parentObject", parent ? parent->objectID() : AXID());
    506506#if PLATFORM(COCOA)
    507507    stream.dumpProperty("remoteParentObject", object.remoteParentObject());
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r285399 r285934  
    125125using namespace HTMLNames;
    126126
    127 const AXID InvalidAXID = 0;
    128 
    129127// Post value change notifications for password fields or elements contained in password fields at a 40hz interval to thwart analysis of typing cadence
    130128static const Seconds accessibilityPasswordValueChangeNotificationInterval { 25_ms };
     
    419417
    420418    if (auto tree = AXIsolatedTree::treeForPageID(*m_pageID))
    421         tree->setFocusedNodeID(focus ? focus->objectID() : InvalidAXID);
     419        tree->setFocusedNodeID(focus ? focus->objectID() : AXID());
    422420}
    423421#endif
     
    429427       
    430428    AXID axID = m_widgetObjectMapping.get(widget);
    431     ASSERT(!HashTraits<AXID>::isDeletedValue(axID));
     429    ASSERT(!axID.isHashTableDeletedValue());
    432430    if (!axID)
    433431        return nullptr;
     
    442440   
    443441    AXID axID = m_renderObjectMapping.get(renderer);
    444     ASSERT(!HashTraits<AXID>::isDeletedValue(axID));
     442    ASSERT(!axID.isHashTableDeletedValue());
    445443    if (!axID)
    446444        return nullptr;
     
    454452        return nullptr;
    455453
    456     AXID renderID = node->renderer() ? m_renderObjectMapping.get(node->renderer()) : 0;
    457     ASSERT(!HashTraits<AXID>::isDeletedValue(renderID));
     454    AXID renderID = node->renderer() ? m_renderObjectMapping.get(node->renderer()) : AXID();
     455    ASSERT(!renderID.isHashTableDeletedValue());
    458456
    459457    AXID nodeID = m_nodeObjectMapping.get(node);
    460     ASSERT(!HashTraits<AXID>::isDeletedValue(nodeID));
     458    ASSERT(!nodeID.isHashTableDeletedValue());
    461459
    462460    if (node->renderer() && nodeID && !renderID) {
     
    612610    ASSERT(newObject);
    613611    AXID axID = getAXID(newObject);
    614     ASSERT(axID != InvalidAXID);
     612    ASSERT(axID.isValid());
    615613
    616614    WTF::switchOn(domObject,
     
    831829{
    832830    AXTRACE("AXObjectCache::remove");
    833     AXLOG(makeString("AXID ", axID));
     831    AXLOG(makeString("AXID ", axID.loggingString()));
    834832
    835833    if (!axID)
     
    896894AXID AXObjectCache::platformGenerateAXID() const
    897895{
    898     static AXID lastUsedID = 0;
    899 
    900     // Generate a new ID.
    901     AXID objID = lastUsedID;
     896    AXID objID;
    902897    do {
    903         ++objID;
    904     } while (!objID || HashTraits<AXID>::isDeletedValue(objID) || m_idsInUse.contains(objID));
    905 
    906     lastUsedID = objID;
    907 
     898        objID = AXID::generate();
     899    } while (!objID.isValid() || m_idsInUse.contains(objID));
    908900    return objID;
    909901}
     
    915907
    916908    return axIDs.map([this] (AXID axID) -> RefPtr<AXCoreObject> {
    917         ASSERT(axID != InvalidAXID);
     909        ASSERT(axID.isValid());
    918910        return objectFromAXID(axID);
    919911    });
     
    32733265    AXLOG(*this);
    32743266
    3275     if (!m_pageID || object.objectID() == InvalidAXID) {
     3267    if (!m_pageID || !object.objectID().isValid()) {
    32763268        AXLOG("No pageID or objectID");
    32773269        return;
     
    33533345    for (const auto& notification : notifications) {
    33543346        AXLOG(notification);
    3355         if (!notification.first || notification.first->objectID() == InvalidAXID)
     3347        if (!notification.first || !notification.first->objectID().isValid())
    33563348            continue;
    33573349
  • trunk/Source/WebCore/accessibility/AXObjectCache.h

    r285524 r285934  
    6161
    6262struct TextMarkerData {
    63     AXID axID { 0 };
     63    AXID axID;
    6464
    6565    Node* node { nullptr };
  • trunk/Source/WebCore/accessibility/AccessibilityObject.h

    r285632 r285934  
    829829    AccessibilityRole m_role { AccessibilityRole::Unknown };
    830830private:
    831     AXID m_id { 0 };
     831    AXID m_id;
    832832    OptionSet<AXAncestorFlag> m_ancestorFlags;
    833833    AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior };
  • trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h

    r285632 r285934  
    3737#include <variant>
    3838#include <wtf/HashSet.h>
     39#include <wtf/ObjectIdentifier.h>
    3940#include <wtf/RefCounted.h>
    4041
     
    9495struct ScrollRectToVisibleOptions;
    9596
    96 using AXID = size_t;
    97 extern const AXID InvalidAXID;
     97enum AXIDType { };
     98using AXID = ObjectIdentifier<AXIDType>;
    9899
    99100enum class AXAncestorFlag : uint8_t {
     
    15831584    detachWrapper(detachmentType);
    15841585    detachRemoteParts(detachmentType);
    1585     setObjectID(InvalidAXID);
     1586    setObjectID({ });
    15861587}
    15871588
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp

    r284675 r285934  
    440440            return g_variant_new_string(setlocale(LC_MESSAGES, nullptr));
    441441        if (!g_strcmp0(propertyName, "AccessibleId"))
    442             return g_variant_new_string(atspiObject->m_axObject ? String::number(atspiObject->m_axObject->objectID()).utf8().data() : "");
     442            return g_variant_new_string(atspiObject->m_axObject ? String::number(atspiObject->m_axObject->objectID().toUInt64()).utf8().data() : "");
    443443        if (!g_strcmp0(propertyName, "Parent"))
    444444            return atspiObject->parentReference();
  • trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp

    r285872 r285934  
    4545{
    4646    ASSERT(isMainThread());
    47     if (m_id != InvalidAXID)
    48         initializeAttributeData(object, parentID == InvalidAXID);
     47    if (m_id.isValid())
     48        initializeAttributeData(object, !parentID.isValid());
    4949    else {
    5050        // Should never happen under normal circumstances.
     
    439439    ASSERT(isMainThread());
    440440
    441     if (m_id == InvalidAXID)
     441    if (!m_id.isValid())
    442442        return nullptr;
    443443
     
    530530void AXIsolatedObject::detachFromParent()
    531531{
    532     m_parentID = InvalidAXID;
     532    m_parentID = { };
    533533}
    534534
     
    588588bool AXIsolatedObject::isDetachedFromParent()
    589589{
    590     if (parent() != InvalidAXID)
     590    if (parent().isValid())
    591591        return false;
    592592
     
    604604                return cell->objectID();
    605605        }
    606         return InvalidAXID;
     606        return { };
    607607    });
    608608
     
    811811        }
    812812
    813         return InvalidAXID;
     813        return { };
    814814    });
    815815
     
    831831    AXID nodeID = WTF::switchOn(value,
    832832        [] (AXID& typedValue) -> AXID { return typedValue; },
    833         [] (auto&) { return InvalidAXID; }
     833        [] (auto&) { return AXID(); }
    834834    );
    835835
  • trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h

    r285632 r285934  
    668668
    669669    RefPtr<AXIsolatedTree> m_cachedTree;
    670     AXID m_parentID { InvalidAXID };
    671     AXID m_id { InvalidAXID };
     670    AXID m_parentID;
     671    AXID m_id;
    672672    Vector<AXID> m_childrenIDs;
    673673    Vector<RefPtr<AXCoreObject>> m_children;
  • trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp

    r284998 r285934  
    147147        return nullptr;
    148148
    149     return axID != InvalidAXID ? m_readerThreadNodeMap.get(axID) : nullptr;
     149    return axID.isValid() ? m_readerThreadNodeMap.get(axID) : nullptr;
    150150}
    151151
     
    167167{
    168168    return objects.map([] (const RefPtr<AXCoreObject>& object) -> AXID {
    169         return object ? object->objectID() : InvalidAXID;
     169        return object ? object->objectID() : AXID();
    170170    });
    171171}
     
    176176    ASSERT(m_changeLogLock.isLocked());
    177177
    178     if (axID != InvalidAXID) {
     178    if (axID.isValid()) {
    179179        m_nodeMap.set(axID, childrenIDs);
    180180        m_pendingChildrenUpdates.append(std::make_pair(axID, WTFMove(childrenIDs)));
     
    187187    ASSERT(isMainThread());
    188188
    189     if (axObject.objectID() == InvalidAXID)
     189    if (!axObject.objectID().isValid())
    190190        return;
    191191
    192     auto object = createSubtree(axObject, axParent ? axParent->objectID() : InvalidAXID, attachWrapper);
     192    auto object = createSubtree(axObject, axParent ? axParent->objectID() : AXID(), attachWrapper);
    193193    Locker locker { m_changeLogLock };
    194194    if (!axParent)
    195195        setRootNode(object.ptr());
    196     else if (axParent->objectID() != InvalidAXID) // Need to check for the objectID of axParent again because it may have been detached while traversing the tree.
     196    else if (axParent->objectID().isValid()) // Need to check for the objectID of axParent again because it may have been detached while traversing the tree.
    197197        updateChildrenIDs(axParent->objectID(), axParent->childrenIDs());
    198198}
     
    204204
    205205    auto object = AXIsolatedObject::create(axObject, this, parentID);
    206     if (object->objectID() == InvalidAXID) {
     206    if (!object->objectID().isValid()) {
    207207        // Either the axObject has an invalid ID or something else went terribly wrong. Don't bother doing anything else.
    208208        ASSERT_NOT_REACHED();
     
    243243    AXID axID = axObject.objectID();
    244244    auto* axParent = axObject.parentObject();
    245     AXID parentID = axParent ? axParent->objectID() : InvalidAXID;
     245    AXID parentID = axParent ? axParent->objectID() : AXID();
    246246
    247247    auto newObject = AXIsolatedObject::create(axObject, this, parentID);
     
    317317        return false;
    318318    });
    319     if (!axAncestor || axAncestor->objectID() == InvalidAXID || iterator == m_nodeMap.end()) {
     319    if (!axAncestor || !axAncestor->objectID().isValid() || iterator == m_nodeMap.end()) {
    320320        // This update triggered before the isolated tree has been repopulated.
    321321        // Return here since there is nothing to update.
     
    366366    applyPendingChanges();
    367367    Locker locker { m_changeLogLock };
    368     AXLOG(makeString("focusedNodeID ", m_focusedNodeID));
     368    AXLOG(makeString("focusedNodeID ", m_focusedNodeID.loggingString()));
    369369    AXLOG("focused node:");
    370370    AXLOG(nodeForID(m_focusedNodeID));
     
    393393{
    394394    AXTRACE("AXIsolatedTree::setFocusedNodeID");
    395     AXLOG(makeString("axID ", axID));
     395    AXLOG(makeString("axID ", axID.loggingString()));
    396396    ASSERT(isMainThread());
    397397
     
    407407{
    408408    AXTRACE("AXIsolatedTree::removeNode");
    409     AXLOG(makeString("AXID ", axID));
     409    AXLOG(makeString("AXID ", axID.loggingString()));
    410410    ASSERT(isMainThread());
    411411
     
    418418{
    419419    AXTRACE("AXIsolatedTree::removeSubtree");
    420     AXLOG(makeString("Removing subtree for axID ", axID));
     420    AXLOG(makeString("Removing subtree for axID ", axID.loggingString()));
    421421    ASSERT(isMainThread());
    422422
     
    424424    while (removals.size()) {
    425425        AXID axID = removals.takeLast();
    426         if (axID == InvalidAXID)
     426        if (!axID.isValid())
    427427            continue;
    428428
     
    450450
    451451    if (m_pendingFocusedNodeID != m_focusedNodeID) {
    452         AXLOG(makeString("focusedNodeID ", m_focusedNodeID, " pendingFocusedNodeID ", m_pendingFocusedNodeID));
    453 
    454         if (m_focusedNodeID != InvalidAXID) {
     452        AXLOG(makeString("focusedNodeID ", m_focusedNodeID.loggingString(), " pendingFocusedNodeID ", m_pendingFocusedNodeID.loggingString()));
     453
     454        if (m_focusedNodeID.isValid()) {
    455455            // Set the old focused object's IsFocused property to false.
    456456            AXPropertyMap propertyMap;
     
    463463    while (m_pendingNodeRemovals.size()) {
    464464        auto axID = m_pendingNodeRemovals.takeLast();
    465         AXLOG(makeString("removing axID ", axID));
     465        AXLOG(makeString("removing axID ", axID.loggingString()));
    466466        if (auto object = nodeForID(axID)) {
    467467            object->detach(AccessibilityDetachmentType::ElementDestroyed);
     
    472472    while (m_pendingSubtreeRemovals.size()) {
    473473        auto axID = m_pendingSubtreeRemovals.takeLast();
    474         AXLOG(makeString("removing subtree axID ", axID));
     474        AXLOG(makeString("removing subtree axID ", axID.loggingString()));
    475475        if (auto object = nodeForID(axID)) {
    476476            object->detach(AccessibilityDetachmentType::ElementDestroyed);
     
    482482    for (const auto& item : m_pendingAppends) {
    483483        AXID axID = item.isolatedObject->objectID();
    484         AXLOG(makeString("appending axID ", axID));
    485         if (axID == InvalidAXID)
     484        AXLOG(makeString("appending axID ", axID.loggingString()));
     485        if (!axID.isValid())
    486486            continue;
    487487
     
    519519
    520520    for (auto& update : m_pendingChildrenUpdates) {
    521         AXLOG(makeString("updating children for axID ", update.first));
     521        AXLOG(makeString("updating children for axID ", update.first.loggingString()));
    522522        if (auto object = nodeForID(update.first))
    523523            object->m_childrenIDs = WTFMove(update.second);
  • trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h

    r285686 r285934  
    324324
    325325struct AXPropertyChange {
    326     AXID axID { InvalidAXID }; // ID of the object whose properties changed.
     326    AXID axID; // ID of the object whose properties changed.
    327327    AXPropertyMap properties; // Changed properties.
    328328};
     
    408408    Vector<AXID> m_pendingSubtreeRemovals WTF_GUARDED_BY_LOCK(m_changeLogLock); // Nodes whose subtrees are to be removed from the tree.
    409409    Vector<std::pair<AXID, Vector<AXID>>> m_pendingChildrenUpdates WTF_GUARDED_BY_LOCK(m_changeLogLock);
    410     AXID m_pendingFocusedNodeID WTF_GUARDED_BY_LOCK(m_changeLogLock) { InvalidAXID };
    411     AXID m_focusedNodeID { InvalidAXID };
     410    AXID m_pendingFocusedNodeID WTF_GUARDED_BY_LOCK(m_changeLogLock);
     411    AXID m_focusedNodeID;
    412412    Lock m_changeLogLock;
    413413};
  • trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm

    r285904 r285934  
    291291- (void)attachAXObject:(AXCoreObject*)axObject
    292292{
    293     ASSERT(axObject && (_identifier == InvalidAXID || _identifier == axObject->objectID()));
     293    ASSERT(axObject && (!_identifier.isValid() || _identifier == axObject->objectID()));
    294294    m_axObject = axObject;
    295     if (_identifier == InvalidAXID)
     295    if (!_identifier.isValid())
    296296        _identifier = m_axObject->objectID();
    297297}
     
    300300- (void)attachIsolatedObject:(AXCoreObject*)isolatedObject
    301301{
    302     ASSERT(isolatedObject && (_identifier == InvalidAXID || _identifier == isolatedObject->objectID()));
     302    ASSERT(isolatedObject && (!_identifier.isValid() || _identifier == isolatedObject->objectID()));
    303303    m_isolatedObject = isolatedObject;
    304     if (_identifier == InvalidAXID)
     304    if (!_identifier.isValid())
    305305        _identifier = m_isolatedObject->objectID();
    306306}
     
    310310{
    311311    ASSERT(isMainThread());
    312     _identifier = InvalidAXID;
     312    _identifier = { };
    313313    m_axObject = nullptr;
    314314}
     
    317317- (void)detachIsolatedObject:(AccessibilityDetachmentType)detachmentType
    318318{
    319     ASSERT_UNUSED(detachmentType, detachmentType == AccessibilityDetachmentType::ElementChanged ? _identifier != InvalidAXID && m_axObject : true);
     319    ASSERT_UNUSED(detachmentType, detachmentType == AccessibilityDetachmentType::ElementChanged ? _identifier.isValid() && m_axObject : true);
    320320    m_isolatedObject = nullptr;
    321321}
  • trunk/Source/WebCore/accessibility/win/AXObjectCacheWin.cpp

    r285399 r285934  
    121121    ASSERT(obj->objectID() <= std::numeric_limits<LONG>::max());
    122122
    123     NotifyWinEvent(msaaEvent, page->chrome().platformPageClient(), OBJID_CLIENT, -static_cast<LONG>(obj->objectID()));
     123    NotifyWinEvent(msaaEvent, page->chrome().platformPageClient(), OBJID_CLIENT, -static_cast<LONG>(obj->objectID().toUInt64()));
    124124}
    125125
     
    149149AXID AXObjectCache::platformGenerateAXID() const
    150150{
    151     static AXID lastUsedID = 0;
     151    static LONG lastUsedID = 0;
    152152
    153153    // Generate a new ID. Windows accessibility relies on a positive AXID,
    154154    // ranging from 1 to LONG_MAX.
    155     AXID objID = lastUsedID;
     155    LONG currentID = lastUsedID;
     156    AXID objID;
    156157    do {
    157         ++objID;
    158         objID %= std::numeric_limits<LONG>::max();
    159     } while (objID == 0 || HashTraits<AXID>::isDeletedValue(objID) || m_idsInUse.contains(objID));
     158        objID = makeObjectIdentifier<AXID>(++currentID);
     159    } while (!objID.isValid() || m_idsInUse.contains(objID));
    160160
    161     ASSERT(objID >= 1 && objID <= std::numeric_limits<LONG>::max());
     161    ASSERT(objID.isValid() && objID.toUInt64() <= std::numeric_limits<LONG>::max());
    162162
    163     lastUsedID = objID;
     163    lastUsedID = currentID;
    164164
    165165    return objID;
Note: See TracChangeset for help on using the changeset viewer.