support throttle like calls as partial calls

This commit is contained in:
Erik Krogh Kristensen
2020-10-16 10:41:15 +02:00
parent a92a701c35
commit b3d5f9c4dd
5 changed files with 92 additions and 0 deletions

View File

@@ -1379,6 +1379,48 @@ module PartialInvokeNode {
}
}
/**
* A partial call that behaves like a throttle call, like `require("call-limit")(fs, limit)` or `_.memoize`.
* Seen as a partial invocation that binds no arguments.
*/
private class ThrottleLikePartialCall extends PartialInvokeNode::Range, DataFlow::CallNode {
int callbackIndex;
ThrottleLikePartialCall() {
callbackIndex = 0 and
(
this = LodashUnderscore::member(["throttle", "debounce", "once", "memoize"]).getACall()
or
this =
DataFlow::moduleImport(["call-limit", "lodash.debounce", "lodash.throttle", "debounce"])
.getACall()
)
or
callbackIndex = 1 and
(
this = LodashUnderscore::member(["after", "before"]).getACall()
or
// not jQuery: https://github.com/cowboy/jquery-throttle-debounce
this = DataFlow::globalVarRef("$").getAMemberCall(["throttle", "debounce"])
)
or
callbackIndex = -1 and
this = DataFlow::moduleMember("throttle-debounce", ["debounce", "throttle"]).getACall()
}
override DataFlow::SourceNode getBoundFunction(DataFlow::Node callback, int boundArgs) {
(
callbackIndex >= 0 and
callback = getArgument(callbackIndex)
or
callbackIndex = -1 and
callback = getLastArgument()
) and
boundArgs = 0 and
result = this
}
}
/**
* A partial call through `ramda.partial`.
*/

View File

@@ -32,10 +32,18 @@
| partial.js:5:15:5:24 | "tainted1" | partial.js:15:15:15:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:21:15:21:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:27:15:27:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:34:15:34:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:41:15:41:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:47:15:47:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:53:15:53:15 | x |
| partial.js:6:15:6:24 | "tainted2" | partial.js:10:15:10:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:16:15:16:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:22:15:22:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:28:15:28:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:35:15:35:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:42:15:42:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:48:15:48:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:54:15:54:15 | y |
| promises.js:2:16:2:24 | "tainted" | promises.js:7:16:7:18 | val |
| promises.js:2:16:2:24 | "tainted" | promises.js:38:32:38:32 | v |
| promises.js:11:22:11:31 | "resolved" | promises.js:19:20:19:20 | v |

View File

@@ -33,10 +33,18 @@
| partial.js:5:15:5:24 | "tainted1" | partial.js:15:15:15:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:21:15:21:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:27:15:27:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:34:15:34:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:41:15:41:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:47:15:47:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:53:15:53:15 | x |
| partial.js:6:15:6:24 | "tainted2" | partial.js:10:15:10:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:16:15:16:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:22:15:22:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:28:15:28:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:35:15:35:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:42:15:42:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:48:15:48:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:54:15:54:15 | y |
| promises.js:2:16:2:24 | "tainted" | promises.js:7:16:7:18 | val |
| promises.js:2:16:2:24 | "tainted" | promises.js:38:32:38:32 | v |
| promises.js:11:22:11:31 | "resolved" | promises.js:19:20:19:20 | v |

View File

@@ -38,10 +38,18 @@
| partial.js:5:15:5:24 | "tainted1" | partial.js:15:15:15:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:21:15:21:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:27:15:27:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:34:15:34:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:41:15:41:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:47:15:47:15 | x |
| partial.js:5:15:5:24 | "tainted1" | partial.js:53:15:53:15 | x |
| partial.js:6:15:6:24 | "tainted2" | partial.js:10:15:10:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:16:15:16:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:22:15:22:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:28:15:28:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:35:15:35:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:42:15:42:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:48:15:48:15 | y |
| partial.js:6:15:6:24 | "tainted2" | partial.js:54:15:54:15 | y |
| promises.js:2:16:2:24 | "tainted" | promises.js:7:16:7:18 | val |
| promises.js:2:16:2:24 | "tainted" | promises.js:38:32:38:32 | v |
| promises.js:11:22:11:31 | "resolved" | promises.js:19:20:19:20 | v |

View File

@@ -28,3 +28,29 @@ function f4(x, y) {
let sink2 = y;
}
R.partial(f4, [source1])(source2);
const limit = require('call-limit')
function f5(x, y) {
let sink1 = x;
let sink2 = y;
}
const limited = limit(f5, 5)
limited(source1, source2);
function f6(x, y) {
let sink1 = x;
let sink2 = y;
}
_.throttle(f6, 100)(source1, source2);
function f7(x, y) {
let sink1 = x;
let sink2 = y;
}
_.after(3, f7)(source1, source2);
function f8(x, y) {
let sink1 = x;
let sink2 = y;
}
require("throttle-debounce").debounce(1000, false, f8)(source1, source2);