| 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 #include "vm/object.h" | 5 #include "vm/object.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/become.h" | 10 #include "vm/become.h" |
| (...skipping 6860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6871 // return (#contextParameter[1]).+( | 6871 // return (#contextParameter[1]).+( |
| 6872 // let final dynamic #t1 = #contextParameter[2] in | 6872 // let final dynamic #t1 = #contextParameter[2] in |
| 6873 // let final dynamic #t2 = #contextParameter[2] = #t1.+(1) in | 6873 // let final dynamic #t2 = #contextParameter[2] = #t1.+(1) in |
| 6874 // #t1 | 6874 // #t1 |
| 6875 // ); | 6875 // ); |
| 6876 // } | 6876 // } |
| 6877 // | 6877 // |
| 6878 // Converted closure functions are used in VM Closure instances that represent | 6878 // Converted closure functions are used in VM Closure instances that represent |
| 6879 // the results of evaluation of [MakeClosure] primitive operations. | 6879 // the results of evaluation of [MakeClosure] primitive operations. |
| 6880 // | 6880 // |
| 6881 // Internally, converted closure functins are represented with the same Closure | 6881 // Internally, converted closure functions are represented with the same Closure |
| 6882 // class as implicit closure functions (that are used for dealing with | 6882 // class as implicit closure functions (that are used for dealing with |
| 6883 // tear-offs). The Closure class instances have two fields, one for the | 6883 // tear-offs). The Closure class instances have two fields, one for the |
| 6884 // function, and one for the captured context. Implicit closure functions have | 6884 // function, and one for the captured context. Implicit closure functions have |
| 6885 // pre-defined shape of the context: it's a single variable that is used as | 6885 // pre-defined shape of the context: it's a single variable that is used as |
| 6886 // 'this'. Converted closure functions use the context field to store the | 6886 // 'this'. Converted closure functions use the context field to store the |
| 6887 // vector of captured variables that will be supplied as the first argument | 6887 // vector of captured variables that will be supplied as the first argument |
| 6888 // during invocation. | 6888 // during invocation. |
| 6889 // | 6889 // |
| 6890 // The top-level functions used in converted closure functions are generated | 6890 // The top-level functions used in converted closure functions are generated |
| 6891 // during a front-end transformation in Kernel. Those functions have some | 6891 // during a front-end transformation in Kernel. Those functions have some |
| 6892 // common properties: | 6892 // common properties: |
| 6893 // * they expect the captured context to be passed as the first argument, | 6893 // * they expect the captured context to be passed as the first argument, |
| 6894 // * the first argument should be of [Vector] type (index-based storage), | 6894 // * the first argument should be of [Vector] type (index-based storage), |
| 6895 // * they retrieve the captured variables from [Vector] explicitly, so they | 6895 // * they retrieve the captured variables from [Vector] explicitly, so they |
| 6896 // don't need the variables from the context to be put into their current | 6896 // don't need the variables from the context to be put into their current |
| 6897 // scope. | 6897 // scope. |
| 6898 // | 6898 // |
| 6899 // During closure-conversion pass in Kernel, the contexts are generated | 6899 // During closure-conversion pass in Kernel, the contexts are generated |
| 6900 // explicitly and are represented as [Vector]s. Then they are paired together | 6900 // explicitly and are represented as [Vector]s. Then they are paired together |
| 6901 // with the top-level functions to form a closure. When the closure, created | 6901 // with the top-level functions to form a closure. When the closure, created |
| 6902 // this way, is invoked, it should receive the [Vector] as the first argument, | 6902 // this way, is invoked, it should receive the [Vector] as the first argument, |
| 6903 // and take the rest of the arguments from the invocation. | 6903 // and take the rest of the arguments from the invocation. |
| 6904 // | 6904 // |
| 6905 // Converted cosure functions in VM follow same discipline as implicit closure | 6905 // Converted closure functions in VM follow same discipline as implicit closure |
| 6906 // functions, because they are similar in many ways. For further deatils, please | 6906 // functions, because they are similar in many ways. For further deatils, please |
| 6907 // refer to the following methods: | 6907 // refer to the following methods: |
| 6908 // -> Function::ConvertedClosureFunction | 6908 // -> Function::ConvertedClosureFunction |
| 6909 // -> StreamingFlowGraphBuilder::BuildGraphOfConvertedClosureFunction | 6909 // -> StreamingFlowGraphBuilder::BuildGraphOfConvertedClosureFunction |
| 6910 // -> StreamingFlowGraphBuilder::BuildGraph (small change that calls | 6910 // -> StreamingFlowGraphBuilder::BuildGraph (small change that calls |
| 6911 // BuildGraphOfConvertedClosureFunction) | 6911 // BuildGraphOfConvertedClosureFunction) |
| 6912 // -> StreamingFlowGraphBuilder::BuildClosureCreation (converted closure | 6912 // -> StreamingFlowGraphBuilder::BuildClosureCreation (converted closure |
| 6913 // functions are created here) | 6913 // functions are created here) |
| 6914 // | 6914 // |
| 6915 // Function::ConvertedClosureFunction method follows the logic of | 6915 // Function::ConvertedClosureFunction method follows the logic of |
| (...skipping 15608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22524 } | 22524 } |
| 22525 return UserTag::null(); | 22525 return UserTag::null(); |
| 22526 } | 22526 } |
| 22527 | 22527 |
| 22528 const char* UserTag::ToCString() const { | 22528 const char* UserTag::ToCString() const { |
| 22529 const String& tag_label = String::Handle(label()); | 22529 const String& tag_label = String::Handle(label()); |
| 22530 return tag_label.ToCString(); | 22530 return tag_label.ToCString(); |
| 22531 } | 22531 } |
| 22532 | 22532 |
| 22533 } // namespace dart | 22533 } // namespace dart |
| OLD | NEW |