Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(504)

Unified Diff: frog/leg/ssa/codegen.dart

Issue 9666006: Support for "a is Function". (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « frog/leg/ssa/closure.dart ('k') | frog/tests/leg/src/mock_compiler.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/leg/ssa/codegen.dart
===================================================================
--- frog/leg/ssa/codegen.dart (revision 5320)
+++ frog/leg/ssa/codegen.dart (working copy)
@@ -942,6 +942,29 @@
endExpression(JSPrecedence.EQUALITY_PRECEDENCE);
}
+ void checkFunction(HInstruction input, Element element) {
+ beginExpression(JSPrecedence.LOGICAL_OR_PRECEDENCE);
+ beginExpression(JSPrecedence.EQUALITY_PRECEDENCE);
+ buffer.add('typeof ');
+ use(input, JSPrecedence.PREFIX_PRECEDENCE);
+ buffer.add(" === 'function'");
+ endExpression(JSPrecedence.EQUALITY_PRECEDENCE);
+ buffer.add(" || ");
+ beginExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE);
+ checkObject(input, '===');
+ buffer.add(" && ");
+ checkType(input, element);
+ endExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE);
+ endExpression(JSPrecedence.LOGICAL_OR_PRECEDENCE);
+ }
+
+ void checkType(HInstruction input, Element element) {
+ buffer.add('!!');
+ use(input, JSPrecedence.MEMBER_PRECEDENCE);
+ buffer.add('.');
+ buffer.add(compiler.namer.operatorIs(element));
+ }
+
void visitIs(HIs node) {
Element element = node.typeExpression;
compiler.registerIsCheck(element);
@@ -964,6 +987,8 @@
checkNum(input, '===');
} else if (element == coreLibrary.find(const SourceString('bool'))) {
checkBool(input, '===');
+ } else if (element == coreLibrary.find(const SourceString('Function'))) {
+ checkFunction(input, element);
} else if (element == coreLibrary.find(const SourceString('int'))) {
beginExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE);
checkNum(input, '===');
@@ -994,10 +1019,7 @@
} else {
beginExpression(precedence);
}
- buffer.add('!!');
- use(input, JSPrecedence.MEMBER_PRECEDENCE);
- buffer.add('.');
- buffer.add(compiler.namer.operatorIs(node.typeExpression));
+ checkType(input, node.typeExpression);
if (element.isClass() && (element.dynamic.isNative()
|| isSupertypeOfNativeClass(element))) {
buffer.add(' || ');
« no previous file with comments | « frog/leg/ssa/closure.dart ('k') | frog/tests/leg/src/mock_compiler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698