void Initialize( lua_State *state ) { lua_interface = static_cast<GarrysMod::Lua::ILuaInterface *>( LUA ); INetworkStringTableContainer *networkstringtable = global::engine_loader.GetInterface<INetworkStringTableContainer>( INTERFACENAME_NETWORKSTRINGTABLESERVER ); if( networkstringtable == nullptr ) LUA->ThrowError( "unable to get INetworkStringTableContainer" ); downloads = networkstringtable->FindTable( "downloadables" ); if( downloads == nullptr ) LUA->ThrowError( "missing \"downloadables\" string table" ); SymbolFinder symfinder; IsValidFileForTransfer = reinterpret_cast<IsValidFileForTransfer_t>( symfinder.ResolveOnBinary( global::engine_lib.c_str( ), IsValidFileForTransfer_sig, IsValidFileForTransfer_siglen ) ); if( IsValidFileForTransfer == nullptr ) LUA->ThrowError( "unable to sigscan for CNetChan::IsValidFileForTransfer" ); LUA->PushCFunction( EnableFileValidation ); LUA->SetField( -2, "EnableFileValidation" ); }
static QSharedPointer<FunctionDeclDefLink> findLinkHelper(QSharedPointer<FunctionDeclDefLink> link, CppRefactoringChanges changes) { QSharedPointer<FunctionDeclDefLink> noResult; const Snapshot &snapshot = changes.snapshot(); // find the matching decl/def symbol Symbol *target = 0; SymbolFinder finder; if (FunctionDefinitionAST *funcDef = link->sourceDeclaration->asFunctionDefinition()) { QList<Declaration *> nameMatch, argumentCountMatch, typeMatch; finder.findMatchingDeclaration(LookupContext(link->sourceDocument, snapshot), funcDef->symbol, &typeMatch, &argumentCountMatch, &nameMatch); if (!typeMatch.isEmpty()) target = typeMatch.first(); } else if (link->sourceDeclaration->asSimpleDeclaration()) { target = finder.findMatchingDefinition(link->sourceFunctionDeclarator->symbol, snapshot, true); } if (!target) return noResult; // parse the target file to get the linked decl/def const QString targetFileName = QString::fromUtf8( target->fileName(), target->fileNameLength()); CppRefactoringFileConstPtr targetFile = changes.fileNoEditor(targetFileName); if (!targetFile->isValid()) return noResult; DeclarationAST *targetParent = 0; FunctionDeclaratorAST *targetFuncDecl = 0; DeclaratorAST *targetDeclarator = 0; if (!findDeclOrDef(targetFile->cppDocument(), target->line(), target->column(), &targetParent, &targetDeclarator, &targetFuncDecl)) return noResult; // the parens are necessary for finding good places for changes if (!targetFuncDecl->lparen_token || !targetFuncDecl->rparen_token) return noResult; QTC_ASSERT(targetFuncDecl->symbol, return noResult); // if the source and target argument counts differ, something is wrong QTC_ASSERT(targetFuncDecl->symbol->argumentCount() == link->sourceFunction->argumentCount(), return noResult); int targetStart, targetEnd; declDefLinkStartEnd(targetFile, targetParent, targetFuncDecl, &targetStart, &targetEnd); QString targetInitial = targetFile->textOf( targetFile->startOf(targetParent), targetEnd); targetFile->lineAndColumn(targetStart, &link->targetLine, &link->targetColumn); link->targetInitial = targetInitial; link->targetFile = targetFile; link->targetFunction = targetFuncDecl->symbol; link->targetFunctionDeclarator = targetFuncDecl; link->targetDeclaration = targetParent; return link; }
static void Initialize( GarrysMod::Lua::ILuaBase *LUA ) { lua = LUA; SymbolFinder symfinder; AddOrUpdateFile_original = reinterpret_cast<AddOrUpdateFile_t>( symfinder.ResolveOnBinary( server_lib.c_str( ), AddOrUpdateFile_sym, AddOrUpdateFile_symlen ) ); if( AddOrUpdateFile_original == nullptr ) LUA->ThrowError( "failed to find GModDataPack::AddOrUpdateFile" ); if( !Hook( AddOrUpdateFile_original, &GModDataPackProxy::AddOrUpdateFile ) ) LUA->ThrowError( "failed to hook GModDataPack::AddOrUpdateFile" ); }