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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/native_handler.dart

Issue 11312203: "Reverting 14829-14832" (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 1 month 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
OLDNEW
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 6
7 import 'dart:uri'; 7 import 'dart:uri';
8 import 'dart2jslib.dart' hide SourceString; 8 import 'dart2jslib.dart' hide SourceString;
9 import 'elements/elements.dart'; 9 import 'elements/elements.dart';
10 import 'js_backend/js_backend.dart'; 10 import 'js_backend/js_backend.dart';
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 ClassElement cls, 169 ClassElement cls,
170 NativeEmitter nativeEmitter) { 170 NativeEmitter nativeEmitter) {
171 List<ClassElement> subtypes = nativeEmitter.subtypes[cls]; 171 List<ClassElement> subtypes = nativeEmitter.subtypes[cls];
172 if (subtypes == null) return false; 172 if (subtypes == null) return false;
173 for (ClassElement subtype in subtypes) { 173 for (ClassElement subtype in subtypes) {
174 if (subtype.lookupLocalMember(element.name) != null) return true; 174 if (subtype.lookupLocalMember(element.name) != null) return true;
175 } 175 }
176 return false; 176 return false;
177 } 177 }
178 178
179 final RegExp nativeRedirectionRegExp = new RegExp(r'^[a-zA-Z][a-zA-Z_$0-9]*$');
180
181 void handleSsaNative(SsaBuilder builder, Expression nativeBody) { 179 void handleSsaNative(SsaBuilder builder, Expression nativeBody) {
182 Compiler compiler = builder.compiler; 180 Compiler compiler = builder.compiler;
183 FunctionElement element = builder.work.element; 181 FunctionElement element = builder.work.element;
184 element.setNative(); 182 element.setNative();
185 NativeEmitter nativeEmitter = builder.emitter.nativeEmitter; 183 NativeEmitter nativeEmitter = builder.emitter.nativeEmitter;
186 // If what we're compiling is a getter named 'typeName' and the native 184 // If what we're compiling is a getter named 'typeName' and the native
187 // class is named 'DOMType', we generate a call to the typeNameOf 185 // class is named 'DOMType', we generate a call to the typeNameOf
188 // function attached on the isolate. 186 // function attached on the isolate.
189 // The DOM classes assume that their 'typeName' property, which is 187 // The DOM classes assume that their 'typeName' property, which is
190 // not a JS property on the DOM types, returns the type name. 188 // not a JS property on the DOM types, returns the type name.
(...skipping 16 matching lines...) Expand all
207 Element helper = builder.interceptors.getClosureConverter(); 205 Element helper = builder.interceptors.getClosureConverter();
208 builder.pushInvokeHelper2(helper, local, arity); 206 builder.pushInvokeHelper2(helper, local, arity);
209 HInstruction closure = builder.pop(); 207 HInstruction closure = builder.pop();
210 return closure; 208 return closure;
211 } 209 }
212 210
213 // Check which pattern this native method follows: 211 // Check which pattern this native method follows:
214 // 1) foo() native; hasBody = false, isRedirecting = false 212 // 1) foo() native; hasBody = false, isRedirecting = false
215 // 2) foo() native "bar"; hasBody = false, isRedirecting = true 213 // 2) foo() native "bar"; hasBody = false, isRedirecting = true
216 // 3) foo() native "return 42"; hasBody = true, isRedirecting = false 214 // 3) foo() native "return 42"; hasBody = true, isRedirecting = false
215 RegExp nativeRedirectionRegExp = const RegExp(r'^[a-zA-Z][a-zA-Z_$0-9]*$');
217 bool hasBody = false; 216 bool hasBody = false;
218 bool isRedirecting = false; 217 bool isRedirecting = false;
219 String nativeMethodName = element.name.slowToString(); 218 String nativeMethodName = element.name.slowToString();
220 if (nativeBody != null) { 219 if (nativeBody != null) {
221 LiteralString jsCode = nativeBody.asLiteralString(); 220 LiteralString jsCode = nativeBody.asLiteralString();
222 String str = jsCode.dartString.slowToString(); 221 String str = jsCode.dartString.slowToString();
223 if (nativeRedirectionRegExp.hasMatch(str)) { 222 if (nativeRedirectionRegExp.hasMatch(str)) {
224 nativeMethodName = str; 223 nativeMethodName = str;
225 isRedirecting = true; 224 isRedirecting = true;
226 nativeEmitter.addRedirectingMethod(element, nativeMethodName); 225 nativeEmitter.addRedirectingMethod(element, nativeMethodName);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 String parameters) { 332 String parameters) {
334 buffer.add(" if (Object.getPrototypeOf(this).hasOwnProperty"); 333 buffer.add(" if (Object.getPrototypeOf(this).hasOwnProperty");
335 buffer.add("('$methodName')) {\n"); 334 buffer.add("('$methodName')) {\n");
336 buffer.add(" $code"); 335 buffer.add(" $code");
337 buffer.add(" } else {\n"); 336 buffer.add(" } else {\n");
338 buffer.add(" return Object.prototype.$methodName.call(this"); 337 buffer.add(" return Object.prototype.$methodName.call(this");
339 buffer.add(parameters == '' ? '' : ', $parameters'); 338 buffer.add(parameters == '' ? '' : ', $parameters');
340 buffer.add(");\n"); 339 buffer.add(");\n");
341 buffer.add(" }\n"); 340 buffer.add(" }\n");
342 } 341 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698