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

Side by Side Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart

Issue 1288013002: dart2js cps: Handle native functions, getters, and setters. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address comments. Created 5 years, 4 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
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/dart_types.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 dart2js.ir_builder_task; 5 library dart2js.ir_builder_task;
6 6
7 import '../closure.dart' as closurelib; 7 import '../closure.dart' as closurelib;
8 import '../closure.dart' hide ClosureScope; 8 import '../closure.dart' hide ClosureScope;
9 import '../constants/expressions.dart'; 9 import '../constants/expressions.dart';
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 assert(definition.arguments.tail.isEmpty); 394 assert(definition.arguments.tail.isEmpty);
395 initialValue = visit(definition.arguments.head); 395 initialValue = visit(definition.arguments.head);
396 } else { 396 } else {
397 assert(definition is ast.Identifier); 397 assert(definition is ast.Identifier);
398 } 398 }
399 irBuilder.declareLocalVariable(element, initialValue: initialValue); 399 irBuilder.declareLocalVariable(element, initialValue: initialValue);
400 } 400 }
401 return null; 401 return null;
402 } 402 }
403 403
404 static final RegExp nativeRedirectionRegExp =
405 new RegExp(r'^[a-zA-Z][a-zA-Z_$0-9]*$');
406
404 // Build(Return(e), C) = C'[InvokeContinuation(return, x)] 407 // Build(Return(e), C) = C'[InvokeContinuation(return, x)]
405 // where (C', x) = Build(e, C) 408 // where (C', x) = Build(e, C)
406 // 409 //
407 // Return without a subexpression is translated as if it were return null. 410 // Return without a subexpression is translated as if it were return null.
408 ir.Primitive visitReturn(ast.Return node) { 411 visitReturn(ast.Return node) {
409 assert(irBuilder.isOpen); 412 assert(irBuilder.isOpen);
410 assert(invariant(node, node.beginToken.value != 'native')); 413 SourceInformation source = sourceInformationBuilder.buildReturn(node);
411 irBuilder.buildReturn( 414 if (node.beginToken.value == 'native') {
412 value: build(node.expression), 415 FunctionElement function = irBuilder.state.currentElement;
413 sourceInformation: sourceInformationBuilder.buildReturn(node)); 416 assert(function.isNative);
414 return null; 417 ast.Node nativeBody = node.expression;
418 if (nativeBody != null) {
419 ast.LiteralString jsCode = nativeBody.asLiteralString();
420 String javaScriptCode = jsCode.dartString.slowToString();
421 assert(invariant(nativeBody,
422 !nativeRedirectionRegExp.hasMatch(javaScriptCode),
423 message: "Deprecated syntax, use @JSName('name') instead."));
424 assert(invariant(nativeBody,
425 function.functionSignature.parameterCount == 0,
426 message: 'native "..." syntax is restricted to '
427 'functions with zero parameters.'));
428 irBuilder.buildNativeFunctionBody(function, javaScriptCode);
429 } else {
430 irBuilder.buildRedirectingNativeFunctionBody(function, source);
431 }
432 } else {
433 irBuilder.buildReturn(
434 value: build(node.expression),
435 sourceInformation: source);
436 }
415 } 437 }
416 438
417 visitSwitchStatement(ast.SwitchStatement node) { 439 visitSwitchStatement(ast.SwitchStatement node) {
418 assert(irBuilder.isOpen); 440 assert(irBuilder.isOpen);
419 // We do not handle switch statements with continue to labeled cases. 441 // We do not handle switch statements with continue to labeled cases.
420 for (ast.SwitchCase switchCase in node.cases) { 442 for (ast.SwitchCase switchCase in node.cases) {
421 for (ast.Node labelOrCase in switchCase.labelsAndCases) { 443 for (ast.Node labelOrCase in switchCase.labelsAndCases) {
422 if (labelOrCase is ast.Label) { 444 if (labelOrCase is ast.Label) {
423 LabelDefinition definition = elements.getLabelDefinition(labelOrCase); 445 LabelDefinition definition = elements.getLabelDefinition(labelOrCase);
424 if (definition != null && definition.isContinueTarget) { 446 if (definition != null && definition.isContinueTarget) {
(...skipping 1849 matching lines...) Expand 10 before | Expand all | Expand 10 after
2274 return _backend.getStringInterpolationHelper(); 2296 return _backend.getStringInterpolationHelper();
2275 } 2297 }
2276 2298
2277 FunctionElement get throwTypeErrorHelper => _backend.getThrowTypeError(); 2299 FunctionElement get throwTypeErrorHelper => _backend.getThrowTypeError();
2278 2300
2279 ClassElement get nullClass => _compiler.nullClass; 2301 ClassElement get nullClass => _compiler.nullClass;
2280 2302
2281 DartType unaliasType(DartType type) => type.unalias(_compiler); 2303 DartType unaliasType(DartType type) => type.unalias(_compiler);
2282 2304
2283 TypeMask getTypeMaskForForeign(NativeBehavior behavior) { 2305 TypeMask getTypeMaskForForeign(NativeBehavior behavior) {
2306 if (behavior == null) {
2307 return _backend.dynamicType;
2308 }
2284 return TypeMaskFactory.fromNativeBehavior(behavior, _compiler); 2309 return TypeMaskFactory.fromNativeBehavior(behavior, _compiler);
2285 } 2310 }
2286 2311
2287 FieldElement locateSingleField(Selector selector, TypeMask type) { 2312 FieldElement locateSingleField(Selector selector, TypeMask type) {
2288 return _compiler.world.locateSingleField(selector, type); 2313 return _compiler.world.locateSingleField(selector, type);
2289 } 2314 }
2315
2316 Element get closureConverter {
2317 return _backend.getClosureConverter();
2318 }
2319
2320 void addNativeMethod(FunctionElement function) {
2321 _backend.emitter.nativeEmitter.nativeMethods.add(function);
2322 }
2290 } 2323 }
2291 2324
2292 /// IR builder specific to the JavaScript backend, coupled to the [JsIrBuilder]. 2325 /// IR builder specific to the JavaScript backend, coupled to the [JsIrBuilder].
2293 class JsIrBuilderVisitor extends IrBuilderVisitor { 2326 class JsIrBuilderVisitor extends IrBuilderVisitor {
2294 JavaScriptBackend get backend => compiler.backend; 2327 JavaScriptBackend get backend => compiler.backend;
2295 2328
2296 /// Result of closure conversion for the current body of code. 2329 /// Result of closure conversion for the current body of code.
2297 /// 2330 ///
2298 /// Will be initialized upon entering the body of a function. 2331 /// Will be initialized upon entering the body of a function.
2299 /// It is computed by the [ClosureTranslator]. 2332 /// It is computed by the [ClosureTranslator].
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after
3347 if (compiler.backend.isForeign(function)) { 3380 if (compiler.backend.isForeign(function)) {
3348 return handleForeignCode(node, function, argumentList, callStructure); 3381 return handleForeignCode(node, function, argumentList, callStructure);
3349 } else { 3382 } else {
3350 return irBuilder.buildStaticFunctionInvocation(function, callStructure, 3383 return irBuilder.buildStaticFunctionInvocation(function, callStructure,
3351 translateStaticArguments(argumentList, function, callStructure), 3384 translateStaticArguments(argumentList, function, callStructure),
3352 sourceInformation: 3385 sourceInformation:
3353 sourceInformationBuilder.buildCall(node, node.selector)); 3386 sourceInformationBuilder.buildCall(node, node.selector));
3354 } 3387 }
3355 } 3388 }
3356 } 3389 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/dart_types.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698