static Array get_frame_args_with_ref(const ActRec* ar) { int numNonVariadic = ar->func()->numNonVariadicParams(); int numArgs = ar->numArgs(); PackedArrayInit retArray(numArgs); auto local = reinterpret_cast<TypedValue*>( uintptr_t(ar) - sizeof(TypedValue) ); int i = 0; // The function's formal parameters are on the stack for (; i < numArgs && i < numNonVariadic; ++i) { retArray.appendWithRef(tvAsCVarRef(local)); --local; } if (i < numArgs) { // If there are still args that haven't been accounted for, they have // either been ... : if (ar->func()->hasVariadicCaptureParam()) { // ... shuffled into a packed array stored in the variadic capture // param on the stack for (ArrayIter iter(tvAsCVarRef(local)); iter; ++iter) { retArray.appendWithRef(iter.secondRef()); } } else { // ... or moved into the ExtraArgs datastructure. for (; i < numArgs; ++i) { retArray.appendWithRef( tvAsCVarRef(ar->getExtraArg(i - numNonVariadic))); } } } return retArray.toArray(); }
boost::any StringCache::createValue(IndexReaderPtr reader, EntryPtr key) { EntryPtr entry(key); String field(entry->field); Collection<String> retArray(Collection<String>::newInstance(reader->maxDoc())); TermDocsPtr termDocs(reader->termDocs()); TermEnumPtr termEnum(reader->terms(newLucene<Term>(field))); LuceneException finally; try { do { TermPtr term(termEnum->term()); if (!term || term->field() != field) break; String termval(term->text()); termDocs->seek(termEnum); while (termDocs->next()) retArray[termDocs->doc()] = termval; } while (termEnum->next()); } catch (LuceneException& e) { finally = e; } termDocs->close(); termEnum->close(); finally.throwException(); return retArray; }
boost::any StringIndexCache::createValue(IndexReaderPtr reader, EntryPtr key) { EntryPtr entry(key); String field(entry->field); Collection<int32_t> retArray(Collection<int32_t>::newInstance(reader->maxDoc())); Collection<String> mterms(Collection<String>::newInstance(reader->maxDoc() + 1)); TermDocsPtr termDocs(reader->termDocs()); TermEnumPtr termEnum(reader->terms(newLucene<Term>(field))); int32_t t = 0; // current term number // an entry for documents that have no terms in this field should a document with no terms be at // top or bottom? This puts them at the top - if it is changed, FieldDocSortedHitQueue needs to // change as well. mterms[t++] = L""; LuceneException finally; try { do { TermPtr term(termEnum->term()); if (!term || term->field() != field || t >= mterms.size() ) break; // store term text mterms[t] = term->text(); termDocs->seek(termEnum); while (termDocs->next()) retArray[termDocs->doc()] = t; ++t; } while (termEnum->next()); } catch (LuceneException& e) { finally = e; } termDocs->close(); termEnum->close(); finally.throwException(); if (t == 0) { // if there are no terms, make the term array have a single null entry mterms = Collection<String>::newInstance(1); } else if (t < mterms.size()) { // if there are less terms than documents, trim off the dead array space mterms.resize(t); } return newLucene<StringIndex>(retArray, mterms); }
static Array get_frame_args_with_ref(const ActRec* ar) { int numParams = ar->func()->numParams(); int numArgs = ar->numArgs(); PackedArrayInit retArray(numArgs); auto local = reinterpret_cast<TypedValue*>( uintptr_t(ar) - sizeof(TypedValue) ); for (int i = 0; i < numArgs; ++i) { if (i < numParams) { // This corresponds to one of the function's formal parameters, so it's // on the stack. retArray.appendWithRef(tvAsCVarRef(local)); --local; } else { // This is not a formal parameter, so it's in the ExtraArgs. retArray.appendWithRef(tvAsCVarRef(ar->getExtraArg(i - numParams))); } } return retArray.toArray(); }
boost::any ByteCache::createValue(IndexReaderPtr reader, EntryPtr key) { EntryPtr entry(key); String field(entry->field); ByteParserPtr parser(VariantUtils::get<ByteParserPtr>(entry->custom)); if (!parser) return FieldCachePtr(_wrapper)->getBytes(reader, field, FieldCache::DEFAULT_BYTE_PARSER()); Collection<uint8_t> retArray(Collection<uint8_t>::newInstance(reader->maxDoc())); TermDocsPtr termDocs(reader->termDocs()); TermEnumPtr termEnum(reader->terms(newLucene<Term>(field))); LuceneException finally; try { do { TermPtr term(termEnum->term()); if (!term || term->field() != field) break; uint8_t termval = parser->parseByte(term->text()); termDocs->seek(termEnum); while (termDocs->next()) retArray[termDocs->doc()] = termval; } while (termEnum->next()); } catch (StopFillCacheException&) { } catch (LuceneException& e) { finally = e; } termDocs->close(); termEnum->close(); finally.throwException(); return retArray; }