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

Side by Side Diff: frog/evaluator.dart

Issue 9107067: Work in progress: changes to interpretation (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: work in progress Created 8 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | frog/frog_options.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart 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 file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 5
6 #import('file_system.dart'); 6 #import('file_system.dart');
7 #import('lang.dart'); 7 #import('lang.dart');
8 8
9 interface JsEvaluator { 9 interface JsEvaluator {
10 var eval(String source); 10 var eval(String source);
11 } 11 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 } 71 }
72 72
73 var eval(String dart) { 73 var eval(String dart) {
74 var source = new SourceFile("_ifrog_", dart); 74 var source = new SourceFile("_ifrog_", dart);
75 world.gen.writer = new CodeWriter(); 75 world.gen.writer = new CodeWriter();
76 76
77 var code; 77 var code;
78 var parsed = new Parser(source, throwOnIncomplete: true, 78 var parsed = new Parser(source, throwOnIncomplete: true,
79 optionalSemicolons: true).evalUnit(); 79 optionalSemicolons: true).evalUnit();
80 var method = new MethodMember("_ifrog_dummy", _lib.topType, null); 80 var method = new MethodMember("_ifrog_dummy", _lib.topType, null);
81 var methGen = new MethodGenerator(method, null); 81 var methGen = new MethodGenerator(method);
82 82
83 if (parsed is ExpressionStatement) { 83 if (parsed is ExpressionStatement) {
84 var body = parsed.body; 84 var body = parsed.body;
85 // Auto-declare variables that haven't been declared yet, so users can 85 // Auto-declare variables that haven't been declared yet, so users can
86 // write "a = 1" rather than "var a = 1" 86 // write "a = 1" rather than "var a = 1"
87 if (body is BinaryExpression && body.op.kind == TokenKind.ASSIGN && 87 if (body is BinaryExpression && body.op.kind == TokenKind.ASSIGN &&
88 body.x is VarExpression) { 88 body.x is VarExpression) {
89 _ensureVariableDefined(body.x.dynamic.name); 89 _ensureVariableDefined(body.x.dynamic.name);
90 } 90 }
91 code = body.visit(methGen).code; 91 code = body.visit(methGen).code;
92 92
93 } else if (parsed is VariableDefinition) { 93 } else if (parsed is VariableDefinition) {
94 var assignments = <Statement>[]; 94 var assignments = <Statement>[];
95 zip(parsed.names, parsed.values, (name, value) { 95 zip(parsed.names, parsed.values, (name, value) {
96 _ensureVariableDefined(name, parsed.modifiers, parsed.type); 96 _ensureVariableDefined(name, parsed.modifiers, parsed.type);
97 var expr = new BinaryExpression( 97 var expr = new BinaryExpression(
98 new Token.fake(TokenKind.ASSIGN, parsed.span), 98 new Token.fake(TokenKind.ASSIGN, parsed.span),
99 new VarExpression(name, name.span), value, parsed.span); 99 new VarExpression(name, name.span), value, parsed.span);
100 new ExpressionStatement(expr, parsed.span).visit(methGen); 100 new ExpressionStatement(expr, parsed.span).visit(methGen);
101 }); 101 });
102 code = methGen.writer.text; 102 code = methGen.writer.text;
103 103
104 } else if (parsed is FunctionDefinition) { 104 } else if (parsed is FunctionDefinition) {
105 var methodName = parsed.name.name; 105 var methodName = parsed.name.name;
106 _removeMember(methodName); 106 _removeMember(methodName);
107 _lib.topType.addMethod(methodName, parsed); 107 _lib.topType.addMethod(methodName, parsed);
108 MethodMember definedMethod = _lib.topType.getMember(methodName); 108 MethodMember definedMethod = _lib.topType.getMember(methodName);
109 definedMethod.resolve(); 109 definedMethod.resolve();
110 var definedMethGen = new MethodGenerator(definedMethod, null); 110 new MethodSpecializer(definedMethod).run();
111 definedMethGen.run(); 111 definedMethod.generator.writeDefinition(world.gen.writer, null);
112 definedMethGen.writeDefinition(world.gen.writer, null);
113 code = world.gen.writer.text; 112 code = world.gen.writer.text;
114 } else if (parsed is TypeDefinition) { 113 } else if (parsed is TypeDefinition) {
115 _removeMember(parsed.name.name); 114 _removeMember(parsed.name.name);
116 parsed.visit(new _LibraryVisitor(_lib)); 115 parsed.visit(new _LibraryVisitor(_lib));
117 var type = _lib.findTypeByName(parsed.name.name); 116 var type = _lib.findTypeByName(parsed.name.name);
118 type.resolve(); 117 type.resolve();
119 world.gen.markTypeUsed(type); 118 world.gen.markTypeUsed(type);
120 world.gen.writeType(type); 119 world.gen.writeType(type);
121 code = '${world.gen.writer.text}; undefined'; 120 code = '${world.gen.writer.text}; undefined';
122 } else { 121 } else {
123 parsed.visit(methGen); 122 parsed.visit(methGen);
124 code = methGen.writer.text; 123 code = methGen.writer.text;
125 } 124 }
126 125
127 world.gen.writer = new CodeWriter(); 126 world.gen.writer = new CodeWriter();
128 world.gen.writeAllDynamicStubs([world.coreimpl, world.corelib, _lib]); 127 world.gen.writeAllDynamicStubs([world.coreimpl, world.corelib, _lib]);
129 128
130 return this._jsEvaluator.eval('${world.gen.writer.text}; $code'); 129 return this._jsEvaluator.eval('${world.gen.writer.text}; $code');
131 } 130 }
132 } 131 }
OLDNEW
« no previous file with comments | « no previous file | frog/frog_options.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698