// for callbacks that are passed to the binding layer, callbacks that are
// invoked from JS already run in the proper scope.
function makeCallback(cb) {
- if (typeof cb !== 'function') {
+ if (cb === undefined) {
return rethrow();
}
+ if (typeof cb !== 'function') {
+ throw new TypeError('callback must be a function');
+ }
+
return function() {
return cb.apply(null, arguments);
};
--- /dev/null
+var common = require('../common');
+var assert = require('assert');
+var fs = require('fs');
+
+function test(cb) {
+ return function() {
+ // fs.stat() calls makeCallback() on its second argument
+ fs.stat(__filename, cb);
+ };
+}
+
+// Verify the case where a callback function is provided
+assert.doesNotThrow(test(function() {}));
+
+// Passing undefined calls rethrow() internally, which is fine
+assert.doesNotThrow(test(undefined));
+
+// Anything else should throw
+assert.throws(test(null));
+assert.throws(test(true));
+assert.throws(test(false));
+assert.throws(test(1));
+assert.throws(test(0));
+assert.throws(test('foo'));
+assert.throws(test(/foo/));
+assert.throws(test([]));
+assert.throws(test({}));