InvokeSetPtr lookupInvokeSet(ObjectPtr callable, const vector<TypePtr> &argsKey) { if (!invokeTablesInitialized) initInvokeTables(); int h = objectHash(callable) + objectVectorHash(argsKey); h &= (invokeTable.size() - 1); vector<InvokeSetPtr> &bucket = invokeTable[h]; for (unsigned i = 0; i < bucket.size(); ++i) { InvokeSetPtr invokeSet = bucket[i]; if (objectEquals(invokeSet->callable, callable) && objectVectorEquals(invokeSet->argsKey, argsKey)) { return invokeSet; } } OverloadPtr interface = callableInterface(callable); const vector<OverloadPtr> &overloads = callableOverloads(callable); InvokeSetPtr invokeSet = new InvokeSet(callable, argsKey, interface, overloads); bucket.push_back(invokeSet); return invokeSet; }
InvokeSet* lookupInvokeSet(ObjectPtr callable, llvm::ArrayRef<TypePtr> argsKey) { if (!invokeTablesInitialized) initInvokeTables(); int h = objectHash(callable) + objectVectorHash(argsKey); h &= (invokeTable.size() - 1); llvm::SmallVector<InvokeSet*, 2> &bucket = invokeTable[h]; for (unsigned i = 0; i < bucket.size(); ++i) { InvokeSet* invokeSet = bucket[i]; if (objectEquals(invokeSet->callable, callable) && objectVectorEquals(invokeSet->argsKey, argsKey)) { return invokeSet; } } OverloadPtr interface = callableInterface(callable); llvm::ArrayRef<OverloadPtr> overloads = callableOverloads(callable); InvokeSet* invokeSet = new InvokeSet(callable, argsKey, interface, overloads); invokeSet->shouldLog = shouldLogCallable(callable); bucket.push_back(invokeSet); return invokeSet; }