| OLD | NEW |
| 1 // Copyright (c) 2012, 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 part of js_backend; | 5 part of js_backend; |
| 6 | 6 |
| 7 class NativeEmitter { | 7 class NativeEmitter { |
| 8 | 8 |
| 9 CodeEmitterTask emitter; | 9 CodeEmitterTask emitter; |
| 10 CodeBuffer nativeBuffer; | 10 CodeBuffer nativeBuffer; |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 } | 154 } |
| 155 | 155 |
| 156 void potentiallyConvertDartClosuresToJs(List<js.Statement> statements, | 156 void potentiallyConvertDartClosuresToJs(List<js.Statement> statements, |
| 157 FunctionElement member, | 157 FunctionElement member, |
| 158 List<js.Parameter> stubParameters) { | 158 List<js.Parameter> stubParameters) { |
| 159 FunctionSignature parameters = member.computeSignature(compiler); | 159 FunctionSignature parameters = member.computeSignature(compiler); |
| 160 Element converter = | 160 Element converter = |
| 161 compiler.findHelper(const SourceString('convertDartClosureToJS')); | 161 compiler.findHelper(const SourceString('convertDartClosureToJS')); |
| 162 String closureConverter = backend.namer.isolateAccess(converter); | 162 String closureConverter = backend.namer.isolateAccess(converter); |
| 163 Set<String> stubParameterNames = new Set<String>.from( | 163 Set<String> stubParameterNames = new Set<String>.from( |
| 164 stubParameters.mappedBy((param) => param.name)); | 164 stubParameters.map((param) => param.name)); |
| 165 parameters.forEachParameter((Element parameter) { | 165 parameters.forEachParameter((Element parameter) { |
| 166 String name = parameter.name.slowToString(); | 166 String name = parameter.name.slowToString(); |
| 167 // If [name] is not in [stubParameters], then the parameter is an optional | 167 // If [name] is not in [stubParameters], then the parameter is an optional |
| 168 // parameter that was not provided for this stub. | 168 // parameter that was not provided for this stub. |
| 169 for (js.Parameter stubParameter in stubParameters) { | 169 for (js.Parameter stubParameter in stubParameters) { |
| 170 if (stubParameter.name == name) { | 170 if (stubParameter.name == name) { |
| 171 DartType type = parameter.computeType(compiler).unalias(compiler); | 171 DartType type = parameter.computeType(compiler).unalias(compiler); |
| 172 if (type is FunctionType) { | 172 if (type is FunctionType) { |
| 173 // The parameter type is a function type either directly or through | 173 // The parameter type is a function type either directly or through |
| 174 // typedef(s). | 174 // typedef(s). |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 List<js.Parameter> parameters) { | 248 List<js.Parameter> parameters) { |
| 249 return js.if_( | 249 return js.if_( |
| 250 js.use('Object').dot('getPrototypeOf') | 250 js.use('Object').dot('getPrototypeOf') |
| 251 .callWith([js.use('this')]) | 251 .callWith([js.use('this')]) |
| 252 .dot('hasOwnProperty').callWith([js.string(methodName)]), | 252 .dot('hasOwnProperty').callWith([js.string(methodName)]), |
| 253 body, | 253 body, |
| 254 js.return_( | 254 js.return_( |
| 255 js.use('Object').dot('prototype').dot(methodName).dot('call') | 255 js.use('Object').dot('prototype').dot(methodName).dot('call') |
| 256 .callWith( | 256 .callWith( |
| 257 <js.Expression>[js.use('this')]..addAll( | 257 <js.Expression>[js.use('this')]..addAll( |
| 258 parameters.mappedBy((param) => js.use(param.name)))))); | 258 parameters.map((param) => js.use(param.name)))))); |
| 259 } | 259 } |
| 260 | 260 |
| 261 js.Block generateMethodBodyWithPrototypeCheckForElement( | 261 js.Block generateMethodBodyWithPrototypeCheckForElement( |
| 262 FunctionElement element, | 262 FunctionElement element, |
| 263 js.Block body, | 263 js.Block body, |
| 264 List<js.Parameter> parameters) { | 264 List<js.Parameter> parameters) { |
| 265 ElementKind kind = element.kind; | 265 ElementKind kind = element.kind; |
| 266 if (kind != ElementKind.FUNCTION && | 266 if (kind != ElementKind.FUNCTION && |
| 267 kind != ElementKind.GETTER && | 267 kind != ElementKind.GETTER && |
| 268 kind != ElementKind.SETTER) { | 268 kind != ElementKind.SETTER) { |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 new js.ExpressionStatement( | 399 new js.ExpressionStatement( |
| 400 new js.VariableDeclarationList(initializations))); | 400 new js.VariableDeclarationList(initializations))); |
| 401 } | 401 } |
| 402 | 402 |
| 403 // [table] is a list of lists, each inner list of the form: | 403 // [table] is a list of lists, each inner list of the form: |
| 404 // [dynamic-dispatch-tag, tags-of-classes-implementing-dispatch-tag] | 404 // [dynamic-dispatch-tag, tags-of-classes-implementing-dispatch-tag] |
| 405 // E.g. | 405 // E.g. |
| 406 // [['Node', 'Text|HTMLElement|HTMLDivElement|...'], ...] | 406 // [['Node', 'Text|HTMLElement|HTMLDivElement|...'], ...] |
| 407 js.Expression table = | 407 js.Expression table = |
| 408 new js.ArrayInitializer.from( | 408 new js.ArrayInitializer.from( |
| 409 preorderDispatchClasses.mappedBy((cls) => | 409 preorderDispatchClasses.map((cls) => |
| 410 new js.ArrayInitializer.from([ | 410 new js.ArrayInitializer.from([ |
| 411 js.string(toNativeTag(cls)), | 411 js.string(toNativeTag(cls)), |
| 412 tagDefns[cls]]))); | 412 tagDefns[cls]]))); |
| 413 | 413 |
| 414 // $.dynamicSetMetadata(table); | 414 // $.dynamicSetMetadata(table); |
| 415 statements.add( | 415 statements.add( |
| 416 new js.ExpressionStatement( | 416 new js.ExpressionStatement( |
| 417 new js.Call( | 417 new js.Call( |
| 418 new js.VariableUse(dynamicSetMetadataName), | 418 new js.VariableUse(dynamicSetMetadataName), |
| 419 [table]))); | 419 [table]))); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 if (emitter.compiler.enableMinification) targetBuffer.add(';'); | 537 if (emitter.compiler.enableMinification) targetBuffer.add(';'); |
| 538 targetBuffer.add(js.prettyPrint( | 538 targetBuffer.add(js.prettyPrint( |
| 539 new js.ExpressionStatement(init), compiler)); | 539 new js.ExpressionStatement(init), compiler)); |
| 540 targetBuffer.add('\n'); | 540 targetBuffer.add('\n'); |
| 541 } | 541 } |
| 542 | 542 |
| 543 targetBuffer.add(nativeBuffer); | 543 targetBuffer.add(nativeBuffer); |
| 544 targetBuffer.add('\n'); | 544 targetBuffer.add('\n'); |
| 545 } | 545 } |
| 546 } | 546 } |
| OLD | NEW |