| 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 #library('native'); | 5 #library('native'); |
| 6 #import('dart:uri'); | 6 #import('dart:uri'); |
| 7 #import('leg.dart'); | 7 #import('leg.dart'); |
| 8 #import('elements/elements.dart'); | 8 #import('elements/elements.dart'); |
| 9 #import('scanner/scannerlib.dart'); | 9 #import('scanner/scannerlib.dart'); |
| 10 #import('ssa/ssa.dart'); | 10 #import('ssa/ssa.dart'); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 element.setNative(); | 197 element.setNative(); |
| 198 NativeEmitter nativeEmitter = compiler.emitter.nativeEmitter; | 198 NativeEmitter nativeEmitter = compiler.emitter.nativeEmitter; |
| 199 // If what we're compiling is a getter named 'typeName' and the native | 199 // If what we're compiling is a getter named 'typeName' and the native |
| 200 // class is named 'DOMType', we generate a call to the typeNameOf | 200 // class is named 'DOMType', we generate a call to the typeNameOf |
| 201 // function attached on the isolate. | 201 // function attached on the isolate. |
| 202 // The DOM classes assume that their 'typeName' property, which is | 202 // The DOM classes assume that their 'typeName' property, which is |
| 203 // not a JS property on the DOM types, returns the type name. | 203 // not a JS property on the DOM types, returns the type name. |
| 204 if (element.name == const SourceString('typeName') | 204 if (element.name == const SourceString('typeName') |
| 205 && element.isGetter() | 205 && element.isGetter() |
| 206 && nativeEmitter.toNativeName(element.enclosingElement) == 'DOMType') { | 206 && nativeEmitter.toNativeName(element.enclosingElement) == 'DOMType') { |
| 207 Element element = compiler.findHelper(const SourceString('getTypeNameOf')); | 207 Element methodElement = |
| 208 HStatic method = new HStatic(element); | 208 compiler.findHelper(const SourceString('getTypeNameOf')); |
| 209 HStatic method = new HStatic(methodElement); |
| 209 builder.add(method); | 210 builder.add(method); |
| 210 builder.push(new HInvokeStatic(Selector.INVOCATION_1, | 211 builder.push(new HInvokeStatic(Selector.INVOCATION_1, |
| 211 <HInstruction>[method, builder.localsHandler.readThis()])); | 212 <HInstruction>[method, builder.localsHandler.readThis()])); |
| 212 return; | 213 return; |
| 213 } | 214 } |
| 214 | 215 |
| 215 HInstruction convertDartClosure(Element parameter) { | 216 HInstruction convertDartClosure(Element parameter) { |
| 216 HInstruction local = builder.localsHandler.readLocal(parameter); | 217 HInstruction local = builder.localsHandler.readLocal(parameter); |
| 217 // TODO(ngeoffray): by better analyzing the function type and | 218 // TODO(ngeoffray): by better analyzing the function type and |
| 218 // its formal parameters, we could pass a method with a defined arity. | 219 // its formal parameters, we could pass a method with a defined arity. |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 } | 306 } |
| 306 | 307 |
| 307 void generateMethodWithPrototypeCheckForElement(Compiler compiler, | 308 void generateMethodWithPrototypeCheckForElement(Compiler compiler, |
| 308 StringBuffer buffer, | 309 StringBuffer buffer, |
| 309 FunctionElement element, | 310 FunctionElement element, |
| 310 String code, | 311 String code, |
| 311 String parameters) { | 312 String parameters) { |
| 312 String methodName; | 313 String methodName; |
| 313 Namer namer = compiler.namer; | 314 Namer namer = compiler.namer; |
| 314 if (element.kind == ElementKind.FUNCTION) { | 315 if (element.kind == ElementKind.FUNCTION) { |
| 315 FunctionParameters parameters = element.computeParameters(compiler); | 316 FunctionParameters computedParameters = |
| 317 element.computeParameters(compiler); |
| 316 methodName = namer.instanceMethodName( | 318 methodName = namer.instanceMethodName( |
| 317 element.getLibrary(), element.name, parameters.parameterCount); | 319 element.getLibrary(), element.name, computedParameters.parameterCount); |
| 318 } else if (element.kind == ElementKind.GETTER) { | 320 } else if (element.kind == ElementKind.GETTER) { |
| 319 methodName = namer.getterName(element.getLibrary(), element.name); | 321 methodName = namer.getterName(element.getLibrary(), element.name); |
| 320 } else if (element.kind == ElementKind.SETTER) { | 322 } else if (element.kind == ElementKind.SETTER) { |
| 321 methodName = namer.setterName(element.getLibrary(), element.name); | 323 methodName = namer.setterName(element.getLibrary(), element.name); |
| 322 } else { | 324 } else { |
| 323 compiler.internalError('unexpected kind: "${element.kind}"', | 325 compiler.internalError('unexpected kind: "${element.kind}"', |
| 324 element: element); | 326 element: element); |
| 325 } | 327 } |
| 326 | 328 |
| 327 generateMethodWithPrototypeCheck( | 329 generateMethodWithPrototypeCheck( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 341 String parameters) { | 343 String parameters) { |
| 342 buffer.add(" if (Object.getPrototypeOf(this).hasOwnProperty"); | 344 buffer.add(" if (Object.getPrototypeOf(this).hasOwnProperty"); |
| 343 buffer.add("('$methodName')) {\n"); | 345 buffer.add("('$methodName')) {\n"); |
| 344 buffer.add(" $code"); | 346 buffer.add(" $code"); |
| 345 buffer.add(" } else {\n"); | 347 buffer.add(" } else {\n"); |
| 346 buffer.add(" return Object.prototype.$methodName.call(this"); | 348 buffer.add(" return Object.prototype.$methodName.call(this"); |
| 347 buffer.add(parameters == '' ? '' : ', $parameters'); | 349 buffer.add(parameters == '' ? '' : ', $parameters'); |
| 348 buffer.add(");\n"); | 350 buffer.add(");\n"); |
| 349 buffer.add(" }\n"); | 351 buffer.add(" }\n"); |
| 350 } | 352 } |
| OLD | NEW |