| OLD | NEW |
| 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 Loading... |
| 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 } |
| OLD | NEW |