Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix isAlien to properly identify built-in functions. Partially fixes #18244 #123

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion _base/lang.js
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ define(["./kernel", "../has", "../sniff"], function(dojo, has){
// summary:
// Returns true if it is a built-in function or some other kind of
// oddball that *should* report as a function but doesn't
return it && !lang.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
return !!it && lang.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use Boolean(it) instead of !!it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've never heard that rule before. The current syntax is terser.

I have a more basic objection though. The function no longer does what it says. The summary (emphasis added) is

Returns true if it is a built-in function or some other kind of oddball that should report as a function but doesn't

Now you've changed it to only report things that do report as functions. Why is that?

Also, the ticket (https://bugs.dojotoolkit.org/ticket/18244) says something about _toArray(), but you haven't changed anything with toArray().

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think Boolean() is the preferred syntax for TS and ES6, but I agree that it doesn't really matter here, and !! is far more commonly used in Dojo 1.x.

I agree with the other points made. I was trying to figure out if the intent was really to change the second condition to be the opposite of what it is today, or if the real issue is to just make it be guaranteed to be truthy?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Judging from the text in https://bugs.dojotoolkit.org/ticket/18244, and also by @mlabrec's initial comment to this PR "Also made the function return bool for falsy arguments.", I think the main point was to change the !isFunction() to isFunction().

And I assume that's because the bug/PR author didn't carefully read the spec for what isAlien() is supposed to do. It's called isAlien(), not isNativeOrNormalFunction().

},

extend: function(ctor, props){
Expand Down
17 changes: 17 additions & 0 deletions tests/unit/_base/lang.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,23 @@ define([
assert.isFalse(lang.isString([]));
},

'.isAlien': function () {
assert.isTrue(lang.isAlien(isNaN));
assert.isTrue(lang.isAlien({}.toString));
assert.isFalse(lang.isAlien(function () {}));
assert.isFalse(lang.isAlien(function () {/* [native code] */}));
assert.isFalse(lang.isAlien({}));
assert.isFalse(lang.isAlien(''));
assert.isFalse(lang.isAlien(0));
assert.isFalse(lang.isAlien(NaN));
assert.isFalse(lang.isAlien(null));
assert.isFalse(lang.isAlien(undefined));
if(typeof window != "undefined"){
assert.isTrue(lang.isAlien(window.atob));
assert.isFalse(lang.isAlien(window));
}
},

'.partial': function () {
var scope = { foo: 'bar' };
var st1;
Expand Down