From ea1e8c70ebc6e7e5777e42aff112f7ca872295ce Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 29 Apr 2002 21:23:30 +0000 Subject: [PATCH] Make the range insert operation return an iterator, even though the STL range insert doesn't git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2413 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ValueHolder.h | 8 ++++---- lib/VMCore/ValueHolderImpl.h | 14 +++++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/llvm/ValueHolder.h b/include/llvm/ValueHolder.h index af08212b015..a69c7b60717 100644 --- a/include/llvm/ValueHolder.h +++ b/include/llvm/ValueHolder.h @@ -118,14 +118,14 @@ public: iterator insert(iterator Pos, ValueSubclass *Inst); // ValueHolder::insert - This method inserts the specified _range_ of values - // before the 'Pos' iterator. This currently only works for vector - // iterators... + // before the 'Pos' iterator, returning a new iterator that points to the + // first item inserted. *This currently only works for vector iterators...* // // FIXME: This is not generic so that the code does not have to be around // to be used... is this ok? // - void insert(iterator Pos, // Where to insert - iterator First, iterator Last); // Vector to read insts from + iterator insert(iterator Pos, // Where to insert + iterator First, iterator Last); // Vector to read insts from }; #endif diff --git a/lib/VMCore/ValueHolderImpl.h b/lib/VMCore/ValueHolderImpl.h index cbc3e5f5588..3eb7e754569 100644 --- a/lib/VMCore/ValueHolderImpl.h +++ b/lib/VMCore/ValueHolderImpl.h @@ -172,12 +172,18 @@ ValueHolder // to be used... is this ok? // template -void ValueHolder -::insert(iterator Pos, // Where to insert +ValueHolder::iterator +ValueHolder +::insert(iterator Pos, // Where to insert iterator First, iterator Last) { // Vector to read insts from + // Since the vector range insert operation doesn't return an updated iterator, + // we have to convert the iterator to and index and back to assure that it + // cannot get invalidated. Gross hack, but effective. + // + unsigned Offset = Pos-begin(); + // Check to make sure that the values are not already in some valueholder... - for (iterator X = First; X != Last; ++X) { assert((*X)->getParent() == 0 && "Cannot insert into valueholder, value already has a parent!"); @@ -192,6 +198,8 @@ void ValueHolder for (;First != Last; ++First) if ((*First)->hasName()) Parent->getSymbolTableSure()->insert(*First); + + return begin()+Offset; } #endif