         locals (:locals env)
         locals (if name (assoc locals name {:name mname}) locals)
         menv (if (> (count meths) 1) (assoc env :context :expr) env)
-        methods (map #(analyze-fn-method menv locals %) meths)]
+        methods (map #(analyze-fn-method menv locals %) meths)
+        max-fixed-arity (apply max (map :fixed-arity methods))]
     ;;(assert (= 1 (count methods)) "Arity overloading not yet supported")
     ;;todo - validate unique arities, at most one variadic, variadic takes max required args
-    {:env env :op :fn :name mname :methods methods}))
+    {:env env :op :fn :name mname :methods methods :max-fixed-arity max-fixed-arity}))
 
 (defmethod parse 'do
   [op env [_ & exprs] _]

        recur-frame {:names (vec (map munge params)) :flag (atom nil)}
        block (binding [*recur-frame* recur-frame]
                (analyze-block (assoc env :context :return :locals locals) body))]
    (merge {:env env :variadic variadic :params (map munge params) :gthis gthis :recurs @(:flag recur-frame)} block)))

(defmethod parse 'fn*
  [op env [_ & args] name]

                                                         (str "," (comma-sep (take pcnt maxparams)))) ");")))))
        (println "}")
        (println "throw('Invalid arity: ' + arguments.length);")
        (println "};")
        (println (str "return " name ";"))
        (println "})()")))
    (emit-fn-postfix name max-fixed-arity)))

(defmethod emit :do
  [{:keys [statements ret env]}]
