Merge: Parallelization phase improvement
authorJean Privat <jean@pryen.org>
Sat, 25 Apr 2015 02:18:54 +0000 (09:18 +0700)
committerJean Privat <jean@pryen.org>
Sat, 25 Apr 2015 02:18:54 +0000 (09:18 +0700)
Adds the support of methods with return value

If you use `is threaded` on a method with a return, it will instead return you a custom instance of `Thread` class on which you can use the method `join` to retrieve the return of the annotated method. `join` waits for the method to end before returning.If you want to make sure that the method has done his work before trying to retrieve it's return value, you can check it with the boolean `is_done`

Pull-Request: #1278
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Jean Privat <jean@pryen.org>

1  2 
src/frontend/parallelization_phase.nit

@@@ -36,17 -36,12 +36,12 @@@ private class ParallelizationPhas
                if nat.n_atid.n_id.text != "threaded" then return
  
                if not nmethdef isa AMethPropdef then
 -                      toolcontext.error(nmethdef.location, "Syntax error: only a method can be threaded.")
 +                      toolcontext.error(nat.location, "Syntax Error: only a method can be threaded.")
                        return
                end
  
                #TODO: check for self calls
  
-               if nmethdef.n_signature.n_type != null then
-                       toolcontext.error(nat.location, "Error: functions not supported yet.")
-                       return
-               end
                # Get the module associated with this method
                var amod = nmethdef.parent.parent
                assert amod isa AModule
                        classname += nmethdef.n_methid.as(AIdMethid).n_id.text
                end
  
+               # Handle methods with a return value
+               var has_rvalue = nmethdef.n_signature.n_type != null
+               var vtype = ""
+               if has_rvalue then
+                       vtype = "redef type E: " + nmethdef.n_signature.n_type.n_id.text
+               end
+               # create a return type
+               var n_id = new TClassid
+               n_id.text = classname
+               var n_type = new AType
+               n_type.n_id = n_id
+               nmethdef.n_signature.n_type = n_type
  
                var params = new Array[String]
                # case if the method has parameters
@@@ -82,6 -89,8 +89,8 @@@ var {{{param.n_id.text}}} : {{{param.n_
  class {{{classname}}}
        super Thread
  
+       {{{vtype}}}
        {{{params.join("\n")}}}
        redef fun main do
        end
@@@ -102,11 -111,12 +111,12 @@@ en
                mainfun.n_block = nmethdef.n_block
  
                # Add "return null" to the end of the `main` function
-               var s_nullreturn = "return null"
-               var nullreturn = toolcontext.parse_something(s_nullreturn)
-               assert nullreturn isa AExpr
-               mainfun.n_block.as(ABlockExpr).n_expr.add(nullreturn)
+               if not has_rvalue then
+                       var s_nullreturn = "return null"
+                       var nullreturn = toolcontext.parse_something(s_nullreturn)
+                       assert nullreturn isa AExpr
+                       mainfun.n_block.as(ABlockExpr).n_expr.add(nullreturn)
+               end
  
                # Create new body for the annotated fun
                var s_newbody : String
                        s_newbody ="""
  var thread = new {{{classname}}}({{{init_params.join(",")}}})
  thread.start
+ return thread
  """
                else
                        s_newbody = """
  var thread = new {{{classname}}}
  thread.start
+ return thread
  """
                end