Finalizer for closures.
authorJean Privat <jean@pryen.org>
Sat, 24 Jan 2009 04:50:43 +0000 (23:50 -0500)
committerJean Privat <jean@pryen.org>
Sat, 24 Jan 2009 04:50:43 +0000 (23:50 -0500)
Closure calls can accept a closure defintion performed if the closure breaks or returns.

src/syntax/mmbuilder.nit
src/syntax/typing.nit
tests/sav/base_closure8.sav [new file with mode: 0644]
tests/sav/base_closure8_alt1.sav [new file with mode: 0644]
tests/sav/base_closure8_alt2.sav [new file with mode: 0644]
tests/sav/base_closure8_alt3.sav [new file with mode: 0644]

index 6a03fde..5f7e0a0 100644 (file)
@@ -1182,6 +1182,12 @@ redef class AClosureDecl
                if sig.return_type != null and n_kwbreak != null then
                        v.error(self, "Syntax Error: A break bloc cannot have a return value.")
                end
+
+               # Add the finalizer to the closure signature
+               var finalize_sig = new MMSignature(new Array[MMType], null, null)
+               var finalizer_clos = new MMClosure(finalize_sig, false)
+               sig.closures.add(finalizer_clos)
+
                var clos = new MMClosure(sig, n_kwbreak != null)
                v.signature_builder = old_signature_builder
                old_signature_builder.closure_decls.add(self)
index d0c5a50..362f802 100644 (file)
@@ -1276,6 +1276,9 @@ redef class AClosureCallExpr
                var va = variable
                var sig = va.closure.signature
                var args = process_signature(v, sig, n_id.to_symbol, n_args.to_a)
+               if closure_defs != null then
+                       process_closures(v, sig, n_id.to_symbol, closure_defs)
+               end
                if args == null then return
                _prop = null
                _prop_signature = sig
diff --git a/tests/sav/base_closure8.sav b/tests/sav/base_closure8.sav
new file mode 100644 (file)
index 0000000..75d9528
--- /dev/null
@@ -0,0 +1,11 @@
+0
+[1
+2
+[3
+4
+5
+]3
+6
+]1
+7
+8
diff --git a/tests/sav/base_closure8_alt1.sav b/tests/sav/base_closure8_alt1.sav
new file mode 100644 (file)
index 0000000..121bfe7
--- /dev/null
@@ -0,0 +1,10 @@
+0
+[1
+2
+[3
+4
+!3
+6
+]1
+7
+8
diff --git a/tests/sav/base_closure8_alt2.sav b/tests/sav/base_closure8_alt2.sav
new file mode 100644 (file)
index 0000000..b57cfdd
--- /dev/null
@@ -0,0 +1,10 @@
+0
+[1
+2
+[3
+4
+]3
+6
+]1
+7
+8
diff --git a/tests/sav/base_closure8_alt3.sav b/tests/sav/base_closure8_alt3.sav
new file mode 100644 (file)
index 0000000..5ee2929
--- /dev/null
@@ -0,0 +1,8 @@
+0
+[1
+2
+[3
+4
+!3
+!1
+8