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

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

Issue 237583014: JS templates (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: cleanup Created 6 years, 8 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
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 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 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 // specializations. 348 // specializations.
349 } 349 }
350 350
351 void potentiallyConvertDartClosuresToJs( 351 void potentiallyConvertDartClosuresToJs(
352 List<jsAst.Statement> statements, 352 List<jsAst.Statement> statements,
353 FunctionElement member, 353 FunctionElement member,
354 List<jsAst.Parameter> stubParameters) { 354 List<jsAst.Parameter> stubParameters) {
355 FunctionSignature parameters = member.functionSignature; 355 FunctionSignature parameters = member.functionSignature;
356 Element converter = 356 Element converter =
357 compiler.findHelper('convertDartClosureToJS'); 357 compiler.findHelper('convertDartClosureToJS');
358 String closureConverter = backend.namer.isolateAccess(converter); 358 jsAst.Expression closureConverter = backend.namer.elementAccess(converter);
359 Set<String> stubParameterNames = new Set<String>.from(
360 stubParameters.map((param) => param.name));
361 parameters.forEachParameter((ParameterElement parameter) { 359 parameters.forEachParameter((ParameterElement parameter) {
362 String name = parameter.name; 360 String name = parameter.name;
363 // If [name] is not in [stubParameters], then the parameter is an optional 361 // If [name] is not in [stubParameters], then the parameter is an optional
364 // parameter that was not provided for this stub. 362 // parameter that was not provided for this stub.
365 for (jsAst.Parameter stubParameter in stubParameters) { 363 for (jsAst.Parameter stubParameter in stubParameters) {
366 if (stubParameter.name == name) { 364 if (stubParameter.name == name) {
367 DartType type = parameter.type.unalias(compiler); 365 DartType type = parameter.type.unalias(compiler);
368 if (type is FunctionType) { 366 if (type is FunctionType) {
369 // The parameter type is a function type either directly or through 367 // The parameter type is a function type either directly or through
370 // typedef(s). 368 // typedef(s).
371 FunctionType functionType = type; 369 FunctionType functionType = type;
372 int arity = functionType.computeArity(); 370 int arity = functionType.computeArity();
373 statements.add( 371 statements.add(
374 js('$name = $closureConverter($name, $arity)').toStatement()); 372 js.statement('# = #(#, $arity)',
373 [name, closureConverter, name]));
375 break; 374 break;
376 } 375 }
377 } 376 }
378 } 377 }
379 }); 378 });
380 } 379 }
381 380
382 List<jsAst.Statement> generateParameterStubStatements( 381 List<jsAst.Statement> generateParameterStubStatements(
383 Element member, 382 Element member,
384 bool isInterceptedMethod, 383 bool isInterceptedMethod,
(...skipping 26 matching lines...) Expand all
411 410
412 if (isInterceptedMethod) { 411 if (isInterceptedMethod) {
413 receiver = argumentsBuffer[0]; 412 receiver = argumentsBuffer[0];
414 arguments = argumentsBuffer.sublist(1, 413 arguments = argumentsBuffer.sublist(1,
415 indexOfLastOptionalArgumentInParameters + 1); 414 indexOfLastOptionalArgumentInParameters + 1);
416 } else { 415 } else {
417 receiver = js('this'); 416 receiver = js('this');
418 arguments = argumentsBuffer.sublist(0, 417 arguments = argumentsBuffer.sublist(0,
419 indexOfLastOptionalArgumentInParameters + 1); 418 indexOfLastOptionalArgumentInParameters + 1);
420 } 419 }
421 statements.add(new jsAst.Return(receiver[target](arguments))); 420 //statements.add(new jsAst.Return(receiver[target](arguments)));
floitsch 2014/04/22 16:11:18 dead code.
sra1 2014/04/23 02:33:50 Done.
421 statements.add(
422 js.statement('return #.#(#)', [receiver, target, arguments]));
422 423
423 return statements; 424 return statements;
424 } 425 }
425 426
426 bool isSupertypeOfNativeClass(Element element) { 427 bool isSupertypeOfNativeClass(Element element) {
427 if (element.isTypeVariable()) { 428 if (element.isTypeVariable()) {
428 compiler.internalError(element, "Is check for type variable."); 429 compiler.internalError(element, "Is check for type variable.");
429 return false; 430 return false;
430 } 431 }
431 if (element.computeType(compiler).unalias(compiler) is FunctionType) { 432 if (element.computeType(compiler).unalias(compiler) is FunctionType) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 // If the native emitter has been asked to take care of the 471 // If the native emitter has been asked to take care of the
471 // noSuchMethod handlers, we do that now. 472 // noSuchMethod handlers, we do that now.
472 if (handleNoSuchMethod) { 473 if (handleNoSuchMethod) {
473 emitter.nsmEmitter.emitNoSuchMethodHandlers(addProperty); 474 emitter.nsmEmitter.emitNoSuchMethodHandlers(addProperty);
474 } 475 }
475 } 476 }
476 477
477 // If we have any properties to add to Object.prototype, we run 478 // If we have any properties to add to Object.prototype, we run
478 // through them and add them using defineProperty. 479 // through them and add them using defineProperty.
479 if (!objectProperties.isEmpty) { 480 if (!objectProperties.isEmpty) {
480 jsAst.Expression init = 481 jsAst.Expression init = js('''
481 js.fun(['table'], 482 (function(table) {
482 new jsAst.ForIn( 483 for(var key in table)
483 new jsAst.VariableDeclarationList( 484 $defPropName(Object.prototype, key, table[key]);
floitsch 2014/04/22 16:11:18 We could make defPropAccess a template, and thus a
sra1 2014/04/23 02:33:50 Done.
484 [new jsAst.VariableInitialization( 485 })(#)''',
485 new jsAst.VariableDeclaration('key'), 486 new jsAst.ObjectInitializer(objectProperties));
486 null)]),
487 js('table'),
488 new jsAst.ExpressionStatement(
489 js('$defPropName(Object.prototype, key, table[key])'))))(
490 new jsAst.ObjectInitializer(objectProperties));
491 487
492 if (emitter.compiler.enableMinification) targetBuffer.add(';'); 488 if (emitter.compiler.enableMinification) targetBuffer.add(';');
493 targetBuffer.add(jsAst.prettyPrint( 489 targetBuffer.add(jsAst.prettyPrint(
494 new jsAst.ExpressionStatement(init), compiler)); 490 new jsAst.ExpressionStatement(init), compiler));
495 targetBuffer.add('\n'); 491 targetBuffer.add('\n');
496 } 492 }
497 493
498 targetBuffer.add(nativeBuffer); 494 targetBuffer.add(nativeBuffer);
499 targetBuffer.add('\n'); 495 targetBuffer.add('\n');
500 } 496 }
501 } 497 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698