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

Side by Side Diff: pkg/dartino_compiler/lib/src/codegen_visitor.dart

Issue 1659163007: Rename fletch -> dartino (Closed) Base URL: https://github.com/dartino/sdk.git@master
Patch Set: address comments Created 4 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE.md file. 3 // BSD-style license that can be found in the LICENSE.md file.
4 4
5 library fletchc.codegen_visitor; 5 library dartino_compiler.codegen_visitor;
6 6
7 import 'package:compiler/src/resolution/semantic_visitor.dart'; 7 import 'package:compiler/src/resolution/semantic_visitor.dart';
8 8
9 import 'package:compiler/src/resolution/operators.dart' show 9 import 'package:compiler/src/resolution/operators.dart' show
10 AssignmentOperator, 10 AssignmentOperator,
11 BinaryOperator, 11 BinaryOperator,
12 IncDecOperator, 12 IncDecOperator,
13 UnaryOperator; 13 UnaryOperator;
14 14
15 import 'package:compiler/src/constants/expressions.dart' show 15 import 'package:compiler/src/constants/expressions.dart' show
(...skipping 19 matching lines...) Expand all
35 import 'package:compiler/src/elements/elements.dart'; 35 import 'package:compiler/src/elements/elements.dart';
36 import 'package:compiler/src/tree/tree.dart'; 36 import 'package:compiler/src/tree/tree.dart';
37 import 'package:compiler/src/universe/call_structure.dart' show 37 import 'package:compiler/src/universe/call_structure.dart' show
38 CallStructure; 38 CallStructure;
39 import 'package:compiler/src/universe/selector.dart' show 39 import 'package:compiler/src/universe/selector.dart' show
40 Selector; 40 Selector;
41 import 'package:compiler/src/diagnostics/spannable.dart' show 41 import 'package:compiler/src/diagnostics/spannable.dart' show
42 Spannable; 42 Spannable;
43 import 'package:compiler/src/dart_types.dart'; 43 import 'package:compiler/src/dart_types.dart';
44 44
45 import 'fletch_context.dart'; 45 import 'dartino_context.dart';
46 46
47 import 'fletch_backend.dart'; 47 import 'dartino_backend.dart';
48 48
49 import 'fletch_constants.dart' show 49 import 'dartino_constants.dart' show
50 FletchClassConstant, 50 DartinoClassConstant,
51 FletchClassInstanceConstant; 51 DartinoClassInstanceConstant;
52 52
53 import 'fletch_function_builder.dart' show 53 import 'dartino_function_builder.dart' show
54 FletchFunctionBuilder; 54 DartinoFunctionBuilder;
55 55
56 import 'fletch_class_builder.dart' show 56 import 'dartino_class_builder.dart' show
57 FletchClassBuilder; 57 DartinoClassBuilder;
58 58
59 import 'fletch_selector.dart'; 59 import 'dartino_selector.dart';
60 60
61 import '../fletch_system.dart'; 61 import '../dartino_system.dart';
62 62
63 import 'closure_environment.dart'; 63 import 'closure_environment.dart';
64 64
65 import '../incremental/fletchc_incremental.dart' show 65 import '../incremental/dartino_compiler_incremental.dart' show
66 IncrementalCompilationFailed; // TODO(ahe): Remove this import. 66 IncrementalCompilationFailed; // TODO(ahe): Remove this import.
67 67
68 import 'fletch_registry.dart' show 68 import 'dartino_registry.dart' show
69 ClosureKind, 69 ClosureKind,
70 FletchRegistry; 70 DartinoRegistry;
71 71
72 import 'package:compiler/src/diagnostics/diagnostic_listener.dart' show 72 import 'package:compiler/src/diagnostics/diagnostic_listener.dart' show
73 DiagnosticMessage; 73 DiagnosticMessage;
74 74
75 import 'package:compiler/src/diagnostics/messages.dart' show 75 import 'package:compiler/src/diagnostics/messages.dart' show
76 MessageKind; 76 MessageKind;
77 77
78 import 'package:compiler/src/constants/values.dart' show 78 import 'package:compiler/src/constants/values.dart' show
79 ConstantValue; 79 ConstantValue;
80 80
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 InitializerBulkMixin, 235 InitializerBulkMixin,
236 BaseImplementationOfStaticsMixin, 236 BaseImplementationOfStaticsMixin,
237 BaseImplementationOfLocalsMixin, 237 BaseImplementationOfLocalsMixin,
238 SetIfNullBulkMixin 238 SetIfNullBulkMixin
239 implements SemanticSendVisitor, SemanticDeclarationVisitor { 239 implements SemanticSendVisitor, SemanticDeclarationVisitor {
240 // A literal int can have up to 31 bits of information (32 minus sign). 240 // A literal int can have up to 31 bits of information (32 minus sign).
241 static const int LITERAL_INT_MAX = 0x3FFFFFFF; 241 static const int LITERAL_INT_MAX = 0x3FFFFFFF;
242 static const int MAX_INT64 = (1 << 63) - 1; 242 static const int MAX_INT64 = (1 << 63) - 1;
243 static const int MIN_INT64 = -(1 << 63); 243 static const int MIN_INT64 = -(1 << 63);
244 244
245 final FletchContext context; 245 final DartinoContext context;
246 246
247 final ClosureEnvironment closureEnvironment; 247 final ClosureEnvironment closureEnvironment;
248 248
249 final ExecutableElement element; 249 final ExecutableElement element;
250 250
251 final FletchFunctionBuilder functionBuilder; 251 final DartinoFunctionBuilder functionBuilder;
252 252
253 final Map<Element, LocalValue> scope = <Element, LocalValue>{}; 253 final Map<Element, LocalValue> scope = <Element, LocalValue>{};
254 254
255 final Map<Node, JumpInfo> jumpInfo = <Node, JumpInfo>{}; 255 final Map<Node, JumpInfo> jumpInfo = <Node, JumpInfo>{};
256 256
257 // Stack of try blocks (inner-most first), in the lexical scope. 257 // Stack of try blocks (inner-most first), in the lexical scope.
258 Link<TryBlock> tryBlockStack = const Link<TryBlock>(); 258 Link<TryBlock> tryBlockStack = const Link<TryBlock>();
259 259
260 VisitState visitState; 260 VisitState visitState;
261 BytecodeLabel trueLabel; 261 BytecodeLabel trueLabel;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 int allocateConstantFromNode(Node node, {TreeElements elements}) { 325 int allocateConstantFromNode(Node node, {TreeElements elements}) {
326 ConstantExpression expression = compileConstant( 326 ConstantExpression expression = compileConstant(
327 node, 327 node,
328 elements: elements, 328 elements: elements,
329 isConst: false); 329 isConst: false);
330 return functionBuilder.allocateConstant( 330 return functionBuilder.allocateConstant(
331 context.getConstantValue(expression)); 331 context.getConstantValue(expression));
332 } 332 }
333 333
334 int allocateConstantClassInstance(int classId) { 334 int allocateConstantClassInstance(int classId) {
335 var constant = new FletchClassInstanceConstant(classId); 335 var constant = new DartinoClassInstanceConstant(classId);
336 context.markConstantUsed(constant); 336 context.markConstantUsed(constant);
337 return functionBuilder.allocateConstant(constant); 337 return functionBuilder.allocateConstant(constant);
338 } 338 }
339 339
340 int allocateStringConstant(String string) { 340 int allocateStringConstant(String string) {
341 return functionBuilder.allocateConstant( 341 return functionBuilder.allocateConstant(
342 context.backend.constantSystem.createString( 342 context.backend.constantSystem.createString(
343 new DartString.literal(string))); 343 new DartString.literal(string)));
344 } 344 }
345 345
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 /// various kinds of implicit or explicit closurizations that can occur. 415 /// various kinds of implicit or explicit closurizations that can occur.
416 void registerClosurization(FunctionElement element, ClosureKind kind); 416 void registerClosurization(FunctionElement element, ClosureKind kind);
417 417
418 int compileLazyFieldInitializer(FieldElement field); 418 int compileLazyFieldInitializer(FieldElement field);
419 419
420 void invokeMethod(Node node, Selector selector) { 420 void invokeMethod(Node node, Selector selector) {
421 registerDynamicUse(selector); 421 registerDynamicUse(selector);
422 String symbol = context.getSymbolFromSelector(selector); 422 String symbol = context.getSymbolFromSelector(selector);
423 int id = context.getSymbolId(symbol); 423 int id = context.getSymbolId(symbol);
424 int arity = selector.argumentCount; 424 int arity = selector.argumentCount;
425 int fletchSelector = FletchSelector.encodeMethod(id, arity); 425 int dartinoSelector = DartinoSelector.encodeMethod(id, arity);
426 assembler.invokeMethod(fletchSelector, arity, selector.name); 426 assembler.invokeMethod(dartinoSelector, arity, selector.name);
427 } 427 }
428 428
429 void invokeGetter(Node node, Name name) { 429 void invokeGetter(Node node, Name name) {
430 registerDynamicUse(new Selector.getter(name)); 430 registerDynamicUse(new Selector.getter(name));
431 String symbol = context.mangleName(name); 431 String symbol = context.mangleName(name);
432 int id = context.getSymbolId(symbol); 432 int id = context.getSymbolId(symbol);
433 int fletchSelector = FletchSelector.encodeGetter(id); 433 int dartinoSelector = DartinoSelector.encodeGetter(id);
434 assembler.invokeMethod(fletchSelector, 0); 434 assembler.invokeMethod(dartinoSelector, 0);
435 } 435 }
436 436
437 void invokeSetter(Node node, Name name) { 437 void invokeSetter(Node node, Name name) {
438 registerDynamicUse(new Selector.setter(name)); 438 registerDynamicUse(new Selector.setter(name));
439 String symbol = context.mangleName(name); 439 String symbol = context.mangleName(name);
440 int id = context.getSymbolId(symbol); 440 int id = context.getSymbolId(symbol);
441 int fletchSelector = FletchSelector.encodeSetter(id); 441 int dartinoSelector = DartinoSelector.encodeSetter(id);
442 assembler.invokeMethod(fletchSelector, 1); 442 assembler.invokeMethod(dartinoSelector, 1);
443 } 443 }
444 444
445 void invokeFactory(Node node, int constId, int arity) { 445 void invokeFactory(Node node, int constId, int arity) {
446 assembler.invokeFactory(constId, arity); 446 assembler.invokeFactory(constId, arity);
447 } 447 }
448 448
449 void invokeStatic(Node node, int constId, int arity) { 449 void invokeStatic(Node node, int constId, int arity) {
450 assembler.invokeStatic(constId, arity); 450 assembler.invokeStatic(constId, arity);
451 } 451 }
452 452
(...skipping 21 matching lines...) Expand all
474 assembler.dup(); 474 assembler.dup();
475 int constId = allocateConstantFromNode(caseMatch.expression); 475 int constId = allocateConstantFromNode(caseMatch.expression);
476 assembler.loadConst(constId); 476 assembler.loadConst(constId);
477 // For debugging, ignore the equality checks in connection 477 // For debugging, ignore the equality checks in connection
478 // with case matches by not associating the calls with 478 // with case matches by not associating the calls with
479 // any node. 479 // any node.
480 invokeMethod(null, new Selector.binaryOperator('==')); 480 invokeMethod(null, new Selector.binaryOperator('=='));
481 assembler.branchIfTrue(ifTrue); 481 assembler.branchIfTrue(ifTrue);
482 } 482 }
483 483
484 FletchFunctionBase requireFunction(FunctionElement element) { 484 DartinoFunctionBase requireFunction(FunctionElement element) {
485 // TODO(johnniwinther): More precise use. 485 // TODO(johnniwinther): More precise use.
486 registerStaticUse(new StaticUse.foreignUse(element)); 486 registerStaticUse(new StaticUse.foreignUse(element));
487 return context.backend.getFunctionForElement(element); 487 return context.backend.getFunctionForElement(element);
488 } 488 }
489 489
490 FletchFunctionBase requireConstructorInitializer( 490 DartinoFunctionBase requireConstructorInitializer(
491 ConstructorElement constructor) { 491 ConstructorElement constructor) {
492 assert(constructor.isGenerativeConstructor); 492 assert(constructor.isGenerativeConstructor);
493 registerInstantiatedClass(constructor.enclosingClass); 493 registerInstantiatedClass(constructor.enclosingClass);
494 registerStaticUse(new StaticUse.foreignUse(constructor)); 494 registerStaticUse(new StaticUse.foreignUse(constructor));
495 return context.backend.getConstructorInitializerFunction(constructor); 495 return context.backend.getConstructorInitializerFunction(constructor);
496 } 496 }
497 497
498 void doStaticFunctionInvoke( 498 void doStaticFunctionInvoke(
499 Node node, 499 Node node,
500 FletchFunctionBase function, 500 DartinoFunctionBase function,
501 NodeList arguments, 501 NodeList arguments,
502 CallStructure callStructure, 502 CallStructure callStructure,
503 {bool factoryInvoke: false}) { 503 {bool factoryInvoke: false}) {
504 if (function.isInstanceMember) loadThis(); 504 if (function.isInstanceMember) loadThis();
505 FunctionSignature signature = function.signature; 505 FunctionSignature signature = function.signature;
506 int functionId; 506 int functionId;
507 int arity; 507 int arity;
508 if (signature.hasOptionalParameters && 508 if (signature.hasOptionalParameters &&
509 signature.optionalParametersAreNamed) { 509 signature.optionalParametersAreNamed) {
510 if (FletchBackend.isExactParameterMatch(signature, callStructure)) { 510 if (DartinoBackend.isExactParameterMatch(signature, callStructure)) {
511 functionId = function.functionId; 511 functionId = function.functionId;
512 } else if (callStructure.signatureApplies(signature)) { 512 } else if (callStructure.signatureApplies(signature)) {
513 // TODO(ajohnsen): Inline parameter stub? 513 // TODO(ajohnsen): Inline parameter stub?
514 FletchFunctionBase stub = context.backend.createParameterStub( 514 DartinoFunctionBase stub = context.backend.createParameterStub(
515 function, 515 function,
516 callStructure.callSelector); 516 callStructure.callSelector);
517 functionId = stub.functionId; 517 functionId = stub.functionId;
518 } else { 518 } else {
519 doUnresolved(function.name); 519 doUnresolved(function.name);
520 return; 520 return;
521 } 521 }
522 for (Node argument in arguments) { 522 for (Node argument in arguments) {
523 visitForValue(argument); 523 visitForValue(argument);
524 } 524 }
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 assembler.pop(); 935 assembler.pop();
936 assembler.loadLiteralTrue(); 936 assembler.loadLiteralTrue();
937 return; 937 return;
938 } 938 }
939 939
940 if (type.isTypedef) { 940 if (type.isTypedef) {
941 // TODO(ajohnsen): This only matches with the number of arguments, not 941 // TODO(ajohnsen): This only matches with the number of arguments, not
942 // the actual argument types. 942 // the actual argument types.
943 TypedefType typedefType = type; 943 TypedefType typedefType = type;
944 int arity = typedefType.element.functionSignature.parameterCount; 944 int arity = typedefType.element.functionSignature.parameterCount;
945 int fletchSelector = context.toFletchIsSelector( 945 int dartinoSelector = context.toDartinoIsSelector(
946 context.backend.compiler.coreClasses.functionClass, arity); 946 context.backend.compiler.coreClasses.functionClass, arity);
947 assembler.invokeTest(fletchSelector, 0); 947 assembler.invokeTest(dartinoSelector, 0);
948 return; 948 return;
949 } 949 }
950 950
951 if (!type.isInterfaceType) { 951 if (!type.isInterfaceType) {
952 assembler.pop(); 952 assembler.pop();
953 generateUnimplementedError( 953 generateUnimplementedError(
954 diagnosticLocation, "Unhandled type test for $type."); 954 diagnosticLocation, "Unhandled type test for $type.");
955 return; 955 return;
956 } 956 }
957 957
958 Element element = type.element; 958 Element element = type.element;
959 int fletchSelector = context.toFletchIsSelector(element); 959 int dartinoSelector = context.toDartinoIsSelector(element);
960 assembler.invokeTest(fletchSelector, 0); 960 assembler.invokeTest(dartinoSelector, 0);
961 } 961 }
962 962
963 void doIs( 963 void doIs(
964 Node node, 964 Node node,
965 Node expression, 965 Node expression,
966 DartType type, 966 DartType type,
967 // TODO(ahe): Remove [diagnosticLocation] when callIsSelector does not 967 // TODO(ahe): Remove [diagnosticLocation] when callIsSelector does not
968 // require it. 968 // require it.
969 Spannable diagnosticLocation) { 969 Spannable diagnosticLocation) {
970 visitForValue(expression); 970 visitForValue(expression);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 visitForValue(argument); 1017 visitForValue(argument);
1018 } 1018 }
1019 generateIdentical(node); 1019 generateIdentical(node);
1020 } 1020 }
1021 1021
1022 void handleStaticFunctionGet( 1022 void handleStaticFunctionGet(
1023 Send node, 1023 Send node,
1024 MethodElement function, 1024 MethodElement function,
1025 _) { 1025 _) {
1026 registerClosurization(function, ClosureKind.tearOff); 1026 registerClosurization(function, ClosureKind.tearOff);
1027 FletchFunctionBase target = requireFunction(function); 1027 DartinoFunctionBase target = requireFunction(function);
1028 FletchClassBuilder classBuilder = 1028 DartinoClassBuilder classBuilder =
1029 context.backend.createTearoffClass(target); 1029 context.backend.createTearoffClass(target);
1030 assert(classBuilder.fields == 0); 1030 assert(classBuilder.fields == 0);
1031 int constId = allocateConstantClassInstance(classBuilder.classId); 1031 int constId = allocateConstantClassInstance(classBuilder.classId);
1032 assembler.loadConst(constId); 1032 assembler.loadConst(constId);
1033 applyVisitState(); 1033 applyVisitState();
1034 } 1034 }
1035 1035
1036 void doMainCall(Send node, NodeList arguments) { 1036 void doMainCall(Send node, NodeList arguments) {
1037 FunctionElement function = context.compiler.mainFunction; 1037 FunctionElement function = context.compiler.mainFunction;
1038 if (function.isMalformed) { 1038 if (function.isMalformed) {
(...skipping 20 matching lines...) Expand all
1059 int argumentCount = 0; 1059 int argumentCount = 0;
1060 for (Node argument in arguments) { 1060 for (Node argument in arguments) {
1061 if (argumentCount == parameterCount) break; 1061 if (argumentCount == parameterCount) break;
1062 visitForValue(argument); 1062 visitForValue(argument);
1063 argumentCount++; 1063 argumentCount++;
1064 } 1064 }
1065 for (int i = argumentCount; i < parameterCount; i++) { 1065 for (int i = argumentCount; i < parameterCount; i++) {
1066 assembler.loadLiteralNull(); 1066 assembler.loadLiteralNull();
1067 } 1067 }
1068 1068
1069 FletchFunctionBase base = requireFunction(function); 1069 DartinoFunctionBase base = requireFunction(function);
1070 int constId = functionBuilder.allocateConstantFromFunction(base.functionId); 1070 int constId = functionBuilder.allocateConstantFromFunction(base.functionId);
1071 invokeStatic(node, constId, parameterCount); 1071 invokeStatic(node, constId, parameterCount);
1072 } 1072 }
1073 1073
1074 void doStaticallyBoundInvoke( 1074 void doStaticallyBoundInvoke(
1075 Send node, 1075 Send node,
1076 MethodElement element, 1076 MethodElement element,
1077 NodeList arguments, 1077 NodeList arguments,
1078 CallStructure callStructure) { 1078 CallStructure callStructure) {
1079 if (checkCompileError(element)) return; 1079 if (checkCompileError(element)) return;
1080 if (element.declaration == context.compiler.identicalFunction) { 1080 if (element.declaration == context.compiler.identicalFunction) {
1081 doIdenticalCall(node, arguments); 1081 doIdenticalCall(node, arguments);
1082 return; 1082 return;
1083 } 1083 }
1084 if (element.isExternal) { 1084 if (element.isExternal) {
1085 // Patch known functions directly. 1085 // Patch known functions directly.
1086 if (element == context.backend.fletchExternalInvokeMain) { 1086 if (element == context.backend.dartinoExternalInvokeMain) {
1087 doMainCall(node, arguments); 1087 doMainCall(node, arguments);
1088 return; 1088 return;
1089 } else if (element == context.backend.fletchExternalCoroutineChange) { 1089 } else if (element == context.backend.dartinoExternalCoroutineChange) {
1090 for (Node argument in arguments) { 1090 for (Node argument in arguments) {
1091 visitForValue(argument); 1091 visitForValue(argument);
1092 } 1092 }
1093 assembler.coroutineChange(); 1093 assembler.coroutineChange();
1094 return; 1094 return;
1095 } 1095 }
1096 // TODO(ajohnsen): Define a known set of external functions we allow 1096 // TODO(ajohnsen): Define a known set of external functions we allow
1097 // calls to? 1097 // calls to?
1098 } 1098 }
1099 FletchFunctionBase target = requireFunction(element); 1099 DartinoFunctionBase target = requireFunction(element);
1100 doStaticFunctionInvoke(node, target, arguments, callStructure); 1100 doStaticFunctionInvoke(node, target, arguments, callStructure);
1101 } 1101 }
1102 1102
1103 void handleStaticFunctionInvoke( 1103 void handleStaticFunctionInvoke(
1104 Send node, 1104 Send node,
1105 MethodElement element, 1105 MethodElement element,
1106 NodeList arguments, 1106 NodeList arguments,
1107 CallStructure callStructure, 1107 CallStructure callStructure,
1108 _) { 1108 _) {
1109 doStaticallyBoundInvoke( 1109 doStaticallyBoundInvoke(
1110 node, element.declaration, arguments, callStructure); 1110 node, element.declaration, arguments, callStructure);
1111 applyVisitState(); 1111 applyVisitState();
1112 } 1112 }
1113 1113
1114 void visitSuperMethodInvoke( 1114 void visitSuperMethodInvoke(
1115 Send node, 1115 Send node,
1116 MethodElement element, 1116 MethodElement element,
1117 NodeList arguments, 1117 NodeList arguments,
1118 CallStructure callStructure, 1118 CallStructure callStructure,
1119 _) { 1119 _) {
1120 doStaticallyBoundInvoke(node, element, arguments, callStructure); 1120 doStaticallyBoundInvoke(node, element, arguments, callStructure);
1121 applyVisitState(); 1121 applyVisitState();
1122 } 1122 }
1123 1123
1124 void doSuperCall(Node node, FunctionElement function) { 1124 void doSuperCall(Node node, FunctionElement function) {
1125 registerStaticUse(new StaticUse.foreignUse(function)); 1125 registerStaticUse(new StaticUse.foreignUse(function));
1126 int arity = function.functionSignature.parameterCount + 1; 1126 int arity = function.functionSignature.parameterCount + 1;
1127 FletchFunctionBase base = requireFunction(function); 1127 DartinoFunctionBase base = requireFunction(function);
1128 int constId = functionBuilder.allocateConstantFromFunction(base.functionId); 1128 int constId = functionBuilder.allocateConstantFromFunction(base.functionId);
1129 invokeStatic(node, constId, arity); 1129 invokeStatic(node, constId, arity);
1130 } 1130 }
1131 1131
1132 void visitSuperGetterGet( 1132 void visitSuperGetterGet(
1133 Send node, 1133 Send node,
1134 FunctionElement getter, 1134 FunctionElement getter,
1135 _) { 1135 _) {
1136 loadThis(); 1136 loadThis();
1137 doSuperCall(node, getter); 1137 doSuperCall(node, getter);
1138 applyVisitState(); 1138 applyVisitState();
1139 } 1139 }
1140 1140
1141 void visitSuperMethodGet( 1141 void visitSuperMethodGet(
1142 Send node, 1142 Send node,
1143 MethodElement method, 1143 MethodElement method,
1144 _) { 1144 _) {
1145 registerClosurization(method, ClosureKind.superTearOff); 1145 registerClosurization(method, ClosureKind.superTearOff);
1146 loadThis(); 1146 loadThis();
1147 FletchFunctionBase target = requireFunction(method); 1147 DartinoFunctionBase target = requireFunction(method);
1148 FletchClassBuilder classBuilder = 1148 DartinoClassBuilder classBuilder =
1149 context.backend.createTearoffClass(target); 1149 context.backend.createTearoffClass(target);
1150 assert(classBuilder.fields == 1); 1150 assert(classBuilder.fields == 1);
1151 int constId = functionBuilder.allocateConstantFromClass( 1151 int constId = functionBuilder.allocateConstantFromClass(
1152 classBuilder.classId); 1152 classBuilder.classId);
1153 assembler.allocate(constId, classBuilder.fields); 1153 assembler.allocate(constId, classBuilder.fields);
1154 applyVisitState(); 1154 applyVisitState();
1155 } 1155 }
1156 1156
1157 void visitSuperSetterSet( 1157 void visitSuperSetterSet(
1158 SendSet node, 1158 SendSet node,
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 FunctionElement function, 1272 FunctionElement function,
1273 _) { 1273 _) {
1274 loadThis(); 1274 loadThis();
1275 doSuperCall(node, function); 1275 doSuperCall(node, function);
1276 applyVisitState(); 1276 applyVisitState();
1277 } 1277 }
1278 1278
1279 int computeFieldIndex(FieldElement field) { 1279 int computeFieldIndex(FieldElement field) {
1280 ClassElement classElement = element.enclosingClass; 1280 ClassElement classElement = element.enclosingClass;
1281 int fieldIndex; 1281 int fieldIndex;
1282 FletchClassBuilder classBuilder; 1282 DartinoClassBuilder classBuilder;
1283 do { 1283 do {
1284 // We need to find the mixin application of the class, where the field 1284 // We need to find the mixin application of the class, where the field
1285 // is stored. Iterate until it's found. 1285 // is stored. Iterate until it's found.
1286 classBuilder = context.backend.registerClassElement(classElement); 1286 classBuilder = context.backend.registerClassElement(classElement);
1287 classElement = classElement.implementation; 1287 classElement = classElement.implementation;
1288 int i = 0; 1288 int i = 0;
1289 classElement.forEachInstanceField((_, FieldElement member) { 1289 classElement.forEachInstanceField((_, FieldElement member) {
1290 if (member == field) { 1290 if (member == field) {
1291 assert(fieldIndex == null); 1291 assert(fieldIndex == null);
1292 fieldIndex = i; 1292 fieldIndex = i;
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 1451
1452 void visitDynamicPropertyGet( 1452 void visitDynamicPropertyGet(
1453 Send node, 1453 Send node,
1454 Node receiver, 1454 Node receiver,
1455 Name name, 1455 Name name,
1456 _) { 1456 _) {
1457 if (name.text == "runtimeType") { 1457 if (name.text == "runtimeType") {
1458 // TODO(ahe): Implement runtimeType. 1458 // TODO(ahe): Implement runtimeType.
1459 generateUnimplementedError( 1459 generateUnimplementedError(
1460 node, 1460 node,
1461 "'runtimeType' isn't supported in Fletch. See https://goo.gl/ELH6Zc"); 1461 "'runtimeType' isn't supported in Dartino. See https://goo.gl/ELH6Zc") ;
1462 applyVisitState(); 1462 applyVisitState();
1463 return; 1463 return;
1464 } 1464 }
1465 visitForValue(receiver); 1465 visitForValue(receiver);
1466 invokeGetter(node, name); 1466 invokeGetter(node, name);
1467 applyVisitState(); 1467 applyVisitState();
1468 } 1468 }
1469 1469
1470 void visitIfNotNullDynamicPropertyGet( 1470 void visitIfNotNullDynamicPropertyGet(
1471 Send node, 1471 Send node,
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
1694 } 1694 }
1695 ClassElement literalClass = 1695 ClassElement literalClass =
1696 context.backend.mapImplementation.implementation; 1696 context.backend.mapImplementation.implementation;
1697 ConstructorElement constructor = literalClass.lookupConstructor(""); 1697 ConstructorElement constructor = literalClass.lookupConstructor("");
1698 if (constructor == null) { 1698 if (constructor == null) {
1699 internalError(literalClass, "Failed to lookup default map constructor"); 1699 internalError(literalClass, "Failed to lookup default map constructor");
1700 return; 1700 return;
1701 } 1701 }
1702 // The default constructor is a redirecting factory constructor. Follow it. 1702 // The default constructor is a redirecting factory constructor. Follow it.
1703 constructor = constructor.effectiveTarget; 1703 constructor = constructor.effectiveTarget;
1704 FletchFunctionBase function = requireFunction(constructor.declaration); 1704 DartinoFunctionBase function = requireFunction(constructor.declaration);
1705 doStaticFunctionInvoke( 1705 doStaticFunctionInvoke(
1706 node, 1706 node,
1707 function, 1707 function,
1708 new NodeList.empty(), 1708 new NodeList.empty(),
1709 CallStructure.NO_ARGS, 1709 CallStructure.NO_ARGS,
1710 factoryInvoke: true); 1710 factoryInvoke: true);
1711 1711
1712 Selector selector = new Selector.indexSet(); 1712 Selector selector = new Selector.indexSet();
1713 for (Node element in node.entries) { 1713 for (Node element in node.entries) {
1714 assembler.dup(); 1714 assembler.dup();
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
2216 // TODO(ahe): It seems suboptimal that each throw is followed by a pop. 2216 // TODO(ahe): It seems suboptimal that each throw is followed by a pop.
2217 generateThrow(node); 2217 generateThrow(node);
2218 } 2218 }
2219 assembler.pop(); 2219 assembler.pop();
2220 } 2220 }
2221 2221
2222 void callConstructor(Node node, 2222 void callConstructor(Node node,
2223 ConstructorElement constructor, 2223 ConstructorElement constructor,
2224 NodeList arguments, 2224 NodeList arguments,
2225 CallStructure callStructure) { 2225 CallStructure callStructure) {
2226 FletchFunctionBase function = requireConstructorInitializer(constructor); 2226 DartinoFunctionBase function = requireConstructorInitializer(constructor);
2227 doStaticFunctionInvoke(node, function, arguments, callStructure); 2227 doStaticFunctionInvoke(node, function, arguments, callStructure);
2228 } 2228 }
2229 2229
2230 void doConstConstructorInvoke(ConstantExpression constant) { 2230 void doConstConstructorInvoke(ConstantExpression constant) {
2231 var value = context.getConstantValue(constant); 2231 var value = context.getConstantValue(constant);
2232 context.markConstantUsed(value); 2232 context.markConstantUsed(value);
2233 int constId = functionBuilder.allocateConstant(value); 2233 int constId = functionBuilder.allocateConstant(value);
2234 assembler.loadConst(constId); 2234 assembler.loadConst(constId);
2235 } 2235 }
2236 2236
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
2300 constructor, 2300 constructor,
2301 type, 2301 type,
2302 implementation.effectiveTarget, 2302 implementation.effectiveTarget,
2303 null, 2303 null,
2304 arguments, 2304 arguments,
2305 callStructure, 2305 callStructure,
2306 null); 2306 null);
2307 return; 2307 return;
2308 } 2308 }
2309 // TODO(ahe): Remove ".declaration" when issue 23135 is fixed. 2309 // TODO(ahe): Remove ".declaration" when issue 23135 is fixed.
2310 FletchFunctionBase function = requireFunction(constructor.declaration); 2310 DartinoFunctionBase function = requireFunction(constructor.declaration);
2311 doStaticFunctionInvoke( 2311 doStaticFunctionInvoke(
2312 node, function, arguments, callStructure, factoryInvoke: true); 2312 node, function, arguments, callStructure, factoryInvoke: true);
2313 applyVisitState(); 2313 applyVisitState();
2314 } 2314 }
2315 2315
2316 void visitConstructorIncompatibleInvoke( 2316 void visitConstructorIncompatibleInvoke(
2317 NewExpression node, 2317 NewExpression node,
2318 ConstructorElement constructor, 2318 ConstructorElement constructor,
2319 InterfaceType type, 2319 InterfaceType type,
2320 NodeList arguments, 2320 NodeList arguments,
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
2410 ConstructorElement constructor, 2410 ConstructorElement constructor,
2411 InterfaceType type, 2411 InterfaceType type,
2412 NodeList arguments, 2412 NodeList arguments,
2413 CallStructure callStructure, 2413 CallStructure callStructure,
2414 _) { 2414 _) {
2415 doUnresolved(node.send.toString()); 2415 doUnresolved(node.send.toString());
2416 applyVisitState(); 2416 applyVisitState();
2417 } 2417 }
2418 2418
2419 void doStaticGetterGet(Send node, FunctionElement getter) { 2419 void doStaticGetterGet(Send node, FunctionElement getter) {
2420 if (getter == context.backend.fletchExternalNativeError) { 2420 if (getter == context.backend.dartinoExternalNativeError) {
2421 assembler.loadSlot(0); 2421 assembler.loadSlot(0);
2422 return; 2422 return;
2423 } 2423 }
2424 2424
2425 if (getter.isDeferredLoaderGetter) { 2425 if (getter.isDeferredLoaderGetter) {
2426 generateUnimplementedError(node, "Deferred loading is not supported."); 2426 generateUnimplementedError(node, "Deferred loading is not supported.");
2427 return; 2427 return;
2428 } 2428 }
2429 2429
2430 FletchFunctionBase base = requireFunction(getter); 2430 DartinoFunctionBase base = requireFunction(getter);
2431 int constId = functionBuilder.allocateConstantFromFunction(base.functionId); 2431 int constId = functionBuilder.allocateConstantFromFunction(base.functionId);
2432 invokeStatic(node, constId, 0); 2432 invokeStatic(node, constId, 0);
2433 } 2433 }
2434 2434
2435 void handleStaticGetterGet(Send node, FunctionElement getter, _) { 2435 void handleStaticGetterGet(Send node, FunctionElement getter, _) {
2436 doStaticGetterGet(node, getter); 2436 doStaticGetterGet(node, getter);
2437 applyVisitState(); 2437 applyVisitState();
2438 } 2438 }
2439 2439
2440 void handleStaticGetterInvoke( 2440 void handleStaticGetterInvoke(
2441 Send node, 2441 Send node,
2442 FunctionElement getter, 2442 FunctionElement getter,
2443 NodeList arguments, 2443 NodeList arguments,
2444 CallStructure callStructure, 2444 CallStructure callStructure,
2445 _) { 2445 _) {
2446 doStaticGetterGet(node, getter); 2446 doStaticGetterGet(node, getter);
2447 for (Node argument in arguments) { 2447 for (Node argument in arguments) {
2448 visitForValue(argument); 2448 visitForValue(argument);
2449 } 2449 }
2450 invokeMethod(node, callStructure.callSelector); 2450 invokeMethod(node, callStructure.callSelector);
2451 applyVisitState(); 2451 applyVisitState();
2452 } 2452 }
2453 2453
2454 void handleStaticSetterSet( 2454 void handleStaticSetterSet(
2455 Send node, 2455 Send node,
2456 FunctionElement setter, 2456 FunctionElement setter,
2457 Node rhs, 2457 Node rhs,
2458 _) { 2458 _) {
2459 visitForValue(rhs); 2459 visitForValue(rhs);
2460 FletchFunctionBase base = requireFunction(setter); 2460 DartinoFunctionBase base = requireFunction(setter);
2461 int constId = functionBuilder.allocateConstantFromFunction(base.functionId); 2461 int constId = functionBuilder.allocateConstantFromFunction(base.functionId);
2462 invokeStatic(node, constId, 1); 2462 invokeStatic(node, constId, 1);
2463 applyVisitState(); 2463 applyVisitState();
2464 } 2464 }
2465 2465
2466 /** 2466 /**
2467 * Load the captured variables of [function], expressed in [info]. 2467 * Load the captured variables of [function], expressed in [info].
2468 * 2468 *
2469 * If [function] captures itself, its field index is returned. 2469 * If [function] captures itself, its field index is returned.
2470 */ 2470 */
(...skipping 28 matching lines...) Expand all
2499 } 2499 }
2500 2500
2501 void visitFunctionExpression(FunctionExpression node) { 2501 void visitFunctionExpression(FunctionExpression node) {
2502 FunctionElement function = elements[node]; 2502 FunctionElement function = elements[node];
2503 2503
2504 // If the closure captures itself, thisClosureIndex is the field-index in 2504 // If the closure captures itself, thisClosureIndex is the field-index in
2505 // the closure. 2505 // the closure.
2506 int thisClosureIndex = pushCapturedVariables(function); 2506 int thisClosureIndex = pushCapturedVariables(function);
2507 bool needToStoreThisReference = thisClosureIndex >= 0; 2507 bool needToStoreThisReference = thisClosureIndex >= 0;
2508 2508
2509 FletchClassBuilder classBuilder = context.backend.createClosureClass( 2509 DartinoClassBuilder classBuilder = context.backend.createClosureClass(
2510 function, 2510 function,
2511 closureEnvironment); 2511 closureEnvironment);
2512 int classConstant = functionBuilder.allocateConstantFromClass( 2512 int classConstant = functionBuilder.allocateConstantFromClass(
2513 classBuilder.classId); 2513 classBuilder.classId);
2514 2514
2515 // NOTE: Currently we emit a storeField instruction in case a closure 2515 // NOTE: Currently we emit a storeField instruction in case a closure
2516 // captures itself. Changing fields makes it a mutable object. 2516 // captures itself. Changing fields makes it a mutable object.
2517 // We can therefore not allocate the object with `immutable = true`. 2517 // We can therefore not allocate the object with `immutable = true`.
2518 // TODO(fletchc-team): Could we restrict this limitation. 2518 // TODO(dartino_compiler-team): Could we restrict this limitation.
2519 bool immutable = !closureEnvironment.closures[function].free.any( 2519 bool immutable = !closureEnvironment.closures[function].free.any(
2520 closureEnvironment.shouldBeBoxed) && !needToStoreThisReference; 2520 closureEnvironment.shouldBeBoxed) && !needToStoreThisReference;
2521 2521
2522 assembler.allocate( 2522 assembler.allocate(
2523 classConstant, classBuilder.fields, immutable: immutable); 2523 classConstant, classBuilder.fields, immutable: immutable);
2524 2524
2525 if (needToStoreThisReference) { 2525 if (needToStoreThisReference) {
2526 assert(!immutable); 2526 assert(!immutable);
2527 assembler.dup(); 2527 assembler.dup();
2528 assembler.storeField(thisClosureIndex); 2528 assembler.storeField(thisClosureIndex);
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
3055 3055
3056 // Pop exception slot. 3056 // Pop exception slot.
3057 assembler.pop(); 3057 assembler.pop();
3058 } 3058 }
3059 3059
3060 void doUnresolved(String name) { 3060 void doUnresolved(String name) {
3061 var constString = context.backend.constantSystem.createString( 3061 var constString = context.backend.constantSystem.createString(
3062 new DartString.literal(name)); 3062 new DartString.literal(name));
3063 context.markConstantUsed(constString); 3063 context.markConstantUsed(constString);
3064 assembler.loadConst(functionBuilder.allocateConstant(constString)); 3064 assembler.loadConst(functionBuilder.allocateConstant(constString));
3065 FunctionElement function = context.backend.fletchUnresolved; 3065 FunctionElement function = context.backend.dartinoUnresolved;
3066 FletchFunctionBase base = requireFunction(function); 3066 DartinoFunctionBase base = requireFunction(function);
3067 int constId = functionBuilder.allocateConstantFromFunction(base.functionId); 3067 int constId = functionBuilder.allocateConstantFromFunction(base.functionId);
3068 assembler.invokeStatic(constId, 1); 3068 assembler.invokeStatic(constId, 1);
3069 } 3069 }
3070 3070
3071 bool checkCompileError(Element element) { 3071 bool checkCompileError(Element element) {
3072 DiagnosticMessage message = 3072 DiagnosticMessage message =
3073 context.compiler.elementsWithCompileTimeErrors[element]; 3073 context.compiler.elementsWithCompileTimeErrors[element];
3074 if (message != null) { 3074 if (message != null) {
3075 doCompileError(message); 3075 doCompileError(message);
3076 return true; 3076 return true;
3077 } 3077 }
3078 return false; 3078 return false;
3079 } 3079 }
3080 3080
3081 String formatError(DiagnosticMessage diagnosticMessage) { 3081 String formatError(DiagnosticMessage diagnosticMessage) {
3082 return diagnosticMessage.message.computeMessage(); 3082 return diagnosticMessage.message.computeMessage();
3083 } 3083 }
3084 3084
3085 3085
3086 void doCompileError(DiagnosticMessage errorMessage) { 3086 void doCompileError(DiagnosticMessage errorMessage) {
3087 FunctionElement function = context.backend.fletchCompileError; 3087 FunctionElement function = context.backend.dartinoCompileError;
3088 FletchFunctionBase base = requireFunction(function); 3088 DartinoFunctionBase base = requireFunction(function);
3089 int constId = functionBuilder.allocateConstantFromFunction(base.functionId); 3089 int constId = functionBuilder.allocateConstantFromFunction(base.functionId);
3090 String errorString = formatError(errorMessage); 3090 String errorString = formatError(errorMessage);
3091 ConstantValue stringConstant = 3091 ConstantValue stringConstant =
3092 context.backend.constantSystem.createString( 3092 context.backend.constantSystem.createString(
3093 new DartString.literal(errorString)); 3093 new DartString.literal(errorString));
3094 int messageConstId = functionBuilder.allocateConstant(stringConstant); 3094 int messageConstId = functionBuilder.allocateConstant(stringConstant);
3095 context.markConstantUsed(stringConstant); 3095 context.markConstantUsed(stringConstant);
3096 assembler.loadConst(messageConstId); 3096 assembler.loadConst(messageConstId);
3097 registerInstantiatedClass(context.backend.stringImplementation); 3097 registerInstantiatedClass(context.backend.stringImplementation);
3098 assembler.invokeStatic(constId, 1); 3098 assembler.invokeStatic(constId, 1);
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
3238 3238
3239 void applyInitializers(FunctionExpression initializers, _) { 3239 void applyInitializers(FunctionExpression initializers, _) {
3240 internalError(initializers, "[applyInitializers] isn't implemented."); 3240 internalError(initializers, "[applyInitializers] isn't implemented.");
3241 } 3241 }
3242 3242
3243 void applyParameters(NodeList parameters, _) { 3243 void applyParameters(NodeList parameters, _) {
3244 internalError(parameters, "[applyParameters] isn't implemented."); 3244 internalError(parameters, "[applyParameters] isn't implemented.");
3245 } 3245 }
3246 } 3246 }
3247 3247
3248 abstract class FletchRegistryMixin { 3248 abstract class DartinoRegistryMixin {
3249 FletchRegistry get registry; 3249 DartinoRegistry get registry;
3250 FletchContext get context; 3250 DartinoContext get context;
3251 3251
3252 void registerDynamicUse(Selector selector) { 3252 void registerDynamicUse(Selector selector) {
3253 registry.registerDynamicUse(selector); 3253 registry.registerDynamicUse(selector);
3254 } 3254 }
3255 3255
3256 void registerStaticUse(StaticUse staticUse) { 3256 void registerStaticUse(StaticUse staticUse) {
3257 registry.registerStaticUse(staticUse); 3257 registry.registerStaticUse(staticUse);
3258 } 3258 }
3259 3259
3260 void registerInstantiatedClass(ClassElement klass) { 3260 void registerInstantiatedClass(ClassElement klass) {
(...skipping 16 matching lines...) Expand all
3277 // is a getter. This happens for both named and unnamed. 3277 // is a getter. This happens for both named and unnamed.
3278 registerStaticUse(new StaticUse.foreignUse(element)); 3278 registerStaticUse(new StaticUse.foreignUse(element));
3279 } 3279 }
3280 registry.registerClosurization(element, kind); 3280 registry.registerClosurization(element, kind);
3281 } 3281 }
3282 3282
3283 int compileLazyFieldInitializer(FieldElement field) { 3283 int compileLazyFieldInitializer(FieldElement field) {
3284 return context.backend.compileLazyFieldInitializer(field, registry); 3284 return context.backend.compileLazyFieldInitializer(field, registry);
3285 } 3285 }
3286 } 3286 }
OLDNEW
« no previous file with comments | « pkg/dartino_compiler/lib/src/closure_environment.dart ('k') | pkg/dartino_compiler/lib/src/console_print.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698