ASTNode* Intersect::staticResolution(StaticContext *context) { XPath2MemoryManager *mm = context->getMemoryManager(); if(!sortAdded_) { sortAdded_ = true; // Wrap ourselves in a document order sort ASTNode *result = new (mm) XQDocumentOrder(this, mm); result->setLocationInfo(this); return result->staticResolution(context); } for(VectorOfASTNodes::iterator i = _args.begin(); i != _args.end(); ++i) { SequenceType *seqType = new (mm) SequenceType(new (mm) SequenceType::ItemType(SequenceType::ItemType::TEST_NODE), SequenceType::STAR); seqType->setLocationInfo(this); *i = new (mm) XQTreatAs(*i, seqType, mm); (*i)->setLocationInfo(this); *i = (*i)->staticResolution(context); } return this; }
ASTNode* XQFunctionCall::staticResolution(StaticContext *context) { if(uri_ == 0) { if(prefix_ == 0 || *prefix_ == 0) { uri_ = context->getDefaultFuncNS(); } else { uri_ = context->getUriBoundToPrefix(prefix_, this); } } ASTNode *result = context->lookUpFunction(uri_, name_, *args_, this); if(result == 0) { XMLBuffer buf; buf.set(X("A function called {")); buf.append(uri_); buf.append(X("}")); buf.append(name_); buf.append(X(" with ")); XPath2Utils::numToBuf(args_ ? (unsigned int)args_->size() : 0, buf); buf.append(X(" arguments is not defined [err:XPST0017]")); XQThrow(StaticErrorException, X("XQFunctionCall::staticResolution"), buf.getRawBuffer()); } // Our arguments don't belong to us anymore for(VectorOfASTNodes::iterator i = args_->begin(); i != args_->end(); ++i) { *i = 0; } // Release this object this->release(); return result->staticResolution(context); }
ASTNode* FunctionZeroOrOne::staticResolution(StaticContext *context) { XPath2MemoryManager *mm = context->getMemoryManager(); SequenceType *seqType = new (mm) SequenceType(new (mm) SequenceType::ItemType(SequenceType::ItemType::TEST_ANYTHING), SequenceType::QUESTION_MARK); seqType->setLocationInfo(this); ASTNode *result = new (mm) XQTreatAs(_args.front(), seqType, mm, err_FORG0003); result->setLocationInfo(this); return result->staticResolution(context); }