Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 287db8b

Browse files
author
John Messerly
committed
implement function statements, assert
[email protected] Review URL: https://chromereviews.googleplex.com/145367013
1 parent 23aae00 commit 287db8b

File tree

9 files changed

+657
-188
lines changed

9 files changed

+657
-188
lines changed

lib/runtime/dart_runtime.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,10 @@ var dart;
142142
}
143143
dart.mixin = mixin;
144144

145+
function assert(condition) {
146+
// TODO(jmesserly): throw assertion error.
147+
if (!condition) throw 'assertion failed';
148+
}
149+
dart.assert = assert;
150+
145151
})(dart || (dart = {}));

lib/src/codegen/js_codegen.dart

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ var $_libraryName;
9292

9393
bool isPublic(String name) => !name.startsWith('_');
9494

95+
9596
/// Conversions that we don't handle end up here.
9697
@override
9798
void visitConversion(Conversion node) {
@@ -453,11 +454,8 @@ var $_libraryName;
453454
out.write('function ');
454455
}
455456

456-
out.write('$name(');
457-
var function = node.functionExpression;
458-
_visitNode(function.parameters);
459-
out.write(') ');
460-
function.body.accept(this);
457+
out.write('$name');
458+
node.functionExpression.accept(this);
461459

462460
if (!node.isGetter && !node.isSetter) {
463461
out.write('\n');
@@ -468,16 +466,34 @@ var $_libraryName;
468466

469467
@override
470468
void visitFunctionExpression(FunctionExpression node) {
471-
if (node.parent is ExpressionStatement) {
472-
out.write('/* Unimplemented function expr as statement: $node */');
469+
if (node.parent is FunctionDeclaration) {
470+
out.write('(');
471+
_visitNode(node.parameters);
472+
out.write(') ');
473+
node.body.accept(this);
474+
} else {
475+
out.write("(");
476+
_visitNode(node.parameters);
477+
out.write(") => ");
478+
var body = node.body;
479+
if (body is ExpressionFunctionBody) body = body.expression;
480+
body.accept(this);
481+
}
482+
}
483+
484+
@override
485+
void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
486+
var func = node.functionDeclaration;
487+
if (func.isGetter || func.isSetter) {
488+
out.write('/* Unimplemented function get/set statement: $node */');
473489
return;
474490
}
475-
out.write("(");
476-
_visitNode(node.parameters);
477-
out.write(") => ");
478-
var body = node.body;
479-
if (body is ExpressionFunctionBody) body = body.expression;
480-
body.accept(this);
491+
492+
var name = func.name.name;
493+
out.write("// Function $name: ${func.element.type}\n");
494+
out.write('function $name');
495+
func.functionExpression.accept(this);
496+
out.write('\n');
481497
}
482498

483499
/// Writes a simple identifier. This can handle implicit `this` as well as
@@ -553,7 +569,7 @@ var $_libraryName;
553569
@override
554570
void visitMethodInvocation(MethodInvocation node) {
555571
if (rules.isDynamicCall(node.methodName)) {
556-
_unimplemented(node);
572+
out.write('/* Unimplemented dynamic method call: $node */');
557573
return;
558574
}
559575

@@ -621,6 +637,12 @@ var $_libraryName;
621637
out.write(';\n');
622638
}
623639

640+
@override
641+
void visitAssertStatement(AssertStatement node) {
642+
// TODO(jmesserly): only emit in checked mode.
643+
_visitNode(node.condition, prefix: 'dart.assert(', suffix: ');\n');
644+
}
645+
624646
@override
625647
void visitReturnStatement(ReturnStatement node) {
626648
out.write('return');
@@ -817,7 +839,7 @@ var $_libraryName;
817839
// it should be assigned to a temp. Note that even simple identifier isn't
818840
// safe in the face of getters.
819841
if (node.target is! SimpleIdentifier) {
820-
_unimplemented(node);
842+
out.write('/* Unimplemented cascade on non-simple identifier: $node */');
821843
return;
822844
}
823845

@@ -1037,9 +1059,7 @@ var $_libraryName;
10371059
void visitDirective(Directive node) {}
10381060

10391061
@override
1040-
void visitNode(AstNode node) => _unimplemented(node);
1041-
1042-
void _unimplemented(AstNode node) {
1062+
void visitNode(AstNode node) {
10431063
out.write('/* Unimplemented ${node.runtimeType}: $node */');
10441064
}
10451065

test/codegen/expect/BenchmarkBase/BenchmarkBase.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ var BenchmarkBase;
4545
watch.start();
4646
let elapsed = 0;
4747
while (elapsed < timeMinimum) {
48-
/* Unimplemented MethodInvocation: f() */;
48+
/* Unimplemented dynamic method call: f() */;
4949
elapsed = watch.elapsedMilliseconds;
5050
iter++;
5151
}

test/codegen/expect/_internal/_internal.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ var _internal;
172172
let growable = opt$.growable === undefined ? true : opt$.growable;
173173
let result = null;
174174
if (growable) {
175-
result = /* Unimplemented CascadeExpression: new List<E>()..length = length */;
175+
result = /* Unimplemented cascade on non-simple identifier: new List<E>()..length = length */;
176176
}
177177
else {
178178
result = new dart_core.List(this.length);
@@ -256,7 +256,7 @@ var _internal;
256256
if (this._endOrLength !== null && this._endOrLength < end) end = this._endOrLength;
257257
let length = end - start;
258258
if (length < 0) length = 0;
259-
let result = growable ? (/* Unimplemented CascadeExpression: new List<E>()..length = length */) : new dart_core.List(length);
259+
let result = growable ? (/* Unimplemented cascade on non-simple identifier: new List<E>()..length = length */) : new dart_core.List(length);
260260
for (let i = 0; i < length; i++) {
261261
result[i] = this._iterable.elementAt(start + i);
262262
if (this._iterable.length < end) throw new dart_core.ConcurrentModificationError(this);
@@ -445,7 +445,8 @@ var _internal;
445445
this._iterator = _iterator;
446446
this._remaining = _remaining;
447447
super();
448-
/* Unimplemented AssertStatement: assert (_remaining is int && _remaining >= 0); */}
448+
dart.assert(/* Unimplemented IsExpression: _remaining is int */ && this._remaining >= 0);
449+
}
449450
moveNext() {
450451
this._remaining--;
451452
if (this._remaining >= 0) {
@@ -538,7 +539,8 @@ var _internal;
538539
this._iterator = _iterator;
539540
this._skipCount = _skipCount;
540541
super();
541-
/* Unimplemented AssertStatement: assert (_skipCount is int && _skipCount >= 0); */}
542+
dart.assert(/* Unimplemented IsExpression: _skipCount is int */ && this._skipCount >= 0);
543+
}
542544
moveNext() {
543545
for (let i = 0; i < this._skipCount; i++) this._iterator.moveNext();
544546
this._skipCount = 0;
@@ -1221,7 +1223,8 @@ var _internal;
12211223
}
12221224
}
12231225
static _dualPivotQuicksort(a, left, right, /* Unimplemented FunctionTypedFormalParameter: int compare(a, b) */) {
1224-
/* Unimplemented AssertStatement: assert (right - left > _INSERTION_SORT_THRESHOLD); */let sixth = ((right - left + 1) / 6).truncate();
1226+
dart.assert(right - left > _INSERTION_SORT_THRESHOLD);
1227+
let sixth = ((right - left + 1) / 6).truncate();
12251228
let index1 = left + sixth;
12261229
let index5 = right - sixth;
12271230
let index3 = ((left + right) / 2).truncate();

0 commit comments

Comments
 (0)