Example #1
0
static SymbolInfo *
createFunctionSymbol(uint32_t index, elf::Section &section, const char *name, uint32_t virtAddress, uint32_t size)
{
   auto symbol = new FunctionSymbol();
   symbol->index = index;
   symbol->name = name;
   symbol->size = size;

   if (section.header.type == elf::SHT_RPL_IMPORTS) {
      symbol->functionType = FunctionSymbol::Kernel;
      symbol->kernelFunction = findKernelFunction(section.msym, name);

      if (symbol->kernelFunction) {
         symbol->address = symbol->kernelFunction->vaddr;
      } else {
         symbol->address = virtAddress;

         if (symbol->address) {
            writeFunctionThunk(symbol->address, index);
         }
      }
   } else {
      symbol->functionType = FunctionSymbol::User;
      symbol->address = virtAddress;
   }

   return symbol;
}
Example #2
0
void QsCodeParser::quickifyFunction(ClassNode *quickClass, ClassNode *qtClass,
				     FunctionNode *func, bool onBlackList)
{
    if (func->metaness() == FunctionNode::Dtor)
	return;

    FunctionNode *kernelFunc = findKernelFunction(
	    QStringList() << quickClass->name(), func->name());

    QString quickName = func->name();
    if (func->metaness() == FunctionNode::Ctor)
	quickName = quickClass->name();
    FunctionNode *quickFunc = new FunctionNode(quickClass, quickName);
    quickFunc->setLocation(func->location());

    if (onBlackList) {
	quickFunc->setAccess(Node::Protected);
    }
    else {
	if (kernelFunc != 0 && func->numOverloads() == 1 &&
	     (func->parameters().count() == 0 ||
	      func->parameters().last().defaultValue().isEmpty())) {
	    kernelFunc->setAccess(Node::Private);
	}
        else {
	    if (func->metaness() == FunctionNode::Plain)
		quickFunc->setAccess(Node::Protected);
	}
    }

    quickFunc->setReturnType(cpp2qs.convertedDataType(qsTre,
						       func->returnType()));
    if (func->metaness() != FunctionNode::Slot)
	quickFunc->setMetaness(func->metaness());
    quickFunc->setVirtualness(FunctionNode::ImpureVirtual);
    quickFunc->setOverload(func->isOverload());

    QList<Parameter>::ConstIterator q = func->parameters().begin();
    while (q != func->parameters().end()) {
	QString dataType = cpp2qs.convertedDataType(qsTre, (*q).leftType(),
						     (*q).rightType());
	if (dataType.isEmpty()) {
	    dataType = "UNKNOWN";
	    quickFunc->setAccess(Node::Private);
	}
	Parameter param(dataType, "", (*q).name(),
			 (*q).defaultValue().isEmpty() ? "" : "undefined");
	quickFunc->addParameter(param);
	++q;
    }

    if (func->doc().isEmpty()) {
	if (func->parent() != (InnerNode *) qtClass) {
	    func = qtClass->findFunctionNode(func);
	    if (func != 0)
		setQtDoc(quickFunc, func->doc());
	}
    }
    else {
	setQtDoc(quickFunc, func->doc());
    }
}
Example #3
0
Node *QsCodeParser::processTopicCommand(const Doc& doc,
                                        const QString& command,
                                        const QString& arg)
{
    if (command == COMMAND_QUICKFN) {
	QStringList parentPath;
	FunctionNode *quickFunc = 0;
	FunctionNode *clone;

	if (makeFunctionNode(arg, &parentPath, &clone)) {
	    FunctionNode *kernelFunc = findKernelFunction(parentPath,
							   clone->name());
	    if (kernelFunc != 0)
		kernelFunc->setAccess(Node::Private);

	    quickFunc = qsTre->findFunctionNode(parentPath, clone);
	    if (quickFunc == 0 && kernelFunc != 0) {
		quickFunc = new FunctionNode(kernelFunc->parent(),
					      kernelFunc->name());
		quickFunc->setLocation(kernelFunc->location());
		quickFunc->setReturnType(clone->returnType());
		quickFunc->setParameters(clone->parameters());
	    }

	    if (quickFunc == 0) {
		doc.location().warning(tr("Cannot find '%1' specified with '\\%2'")
					.arg(arg).arg(command));
	    }
            else {
		quickFunc->setAccess(Node::Public);
		QStringList qtParams = quickFunc->parameterNames();
		quickFunc->borrowParameterNames(clone);
		QStringList quickParams = quickFunc->parameterNames();
		setQuickDoc(quickFunc, doc, qtParams, quickParams);
	    }
	    delete clone;
	}
        else {
	    doc.location().warning(tr("Cannot find '%1' specified with '\\%2'")
				    .arg(arg).arg(command));
	}
	return 0;
    }
    else if (nodeTypeMap.contains(command)) {
	QStringList subArgs = arg.split(" ");
	QString dataType;

	if (subArgs.count() == 3 && subArgs[1] == ":") {
	    dataType = subArgs[2];
	}
        else if (subArgs.count() != 1) {
	    doc.location().warning(tr("Invalid syntax in '\\%1'")
				    .arg(command));
	}

	QStringList path = subArgs[0].split(".");
	Node *quickNode = qsTre->findNode(path, nodeTypeMap[command]);
	if (quickNode == 0) {
	    doc.location().warning(tr("Cannot find '%1' specified with '\\%2'")
				    .arg(arg).arg(command));
	}
        else {
	    setQuickDoc(quickNode, doc);
	    if (quickNode->type() == Node::Class) {
		classesWithNoQuickDoc.remove(quickNode->name());
		if (doc.briefText().isEmpty())
		    doc.location().warning(tr("Missing '\\%1' for class '%2'")
					    .arg(COMMAND_BRIEF)
					    .arg(quickNode->name()));
	    }
            else if (quickNode->type() == Node::Property) {
		PropertyNode *quickProperty = (PropertyNode *) quickNode;
		if (quickProperty->dataType() == "Object") {
		    if (dataType.isEmpty()) {
			doc.location().warning(tr("Missing data type in '\\%1'"
						   " (assuming 'Object')")
						.arg(command));
		    }
                    else {
			quickProperty->setDataType(dataType);
		    }
		}
                else if (dataType != quickProperty->dataType()) {
		    doc.location().warning(tr("Ignored contradictory data type"
					       " in '\\%1'")
					    .arg(command));
		}
	    }
	}
	return 0;
    }
    else {
	return CppCodeParser::processTopicCommand(doc, command, arg);
    }
}