]> granicus.if.org Git - vim/commitdiff
updated for version 7.0054 v7.0054
authorBram Moolenaar <Bram@vim.org>
Mon, 28 Feb 2005 22:48:19 +0000 (22:48 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 28 Feb 2005 22:48:19 +0000 (22:48 +0000)
runtime/doc/todo.txt
src/eval.c
src/proto/ex_cmds2.pro
src/proto/misc1.pro

index 95df8bc92a44c966688da895c43afa260c92cc4f..a1c487de2eb13c95256ce9815aff23a328230157 100644 (file)
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Feb 27
+*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Feb 28
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -30,38 +30,8 @@ be worked on, but only if you sponsor Vim development.  See |sponsor|.
                                                        *known-bugs*
 -------------------- Known bugs and current work -----------------------
 
-Win32 gettimeofday():
-Or use QueryPerformanceCounter() and QueryPerformanceFrequency()
-int gettimeofday (struct timeval *tv, void* tz)
-     {
-     union {
-     LONG_LONG ns100; /*time since 1 Jan 1601 in 100ns units */
-     FILETIME ft;
-     } now;
-    >
-     GetSystemTimeAsFileTime (&now.ft);
-     tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
-     tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);
-     return (0);
-     } 
-Or use GetSystemTime().
-Or:
-  unsigned long Ticks = 0;
-  unsigned long Sec =0;
-  unsigned long Usec = 0;
-  Ticks = timeGetTime();
-
-  Sec = Ticks/1000;
-  Usec = (Ticks - (Sec*1000))*1000;
-  tp->tv_sec = Sec;
-  tp->tv_usec = Usec;
-
-Test11 sometimes fails.  Must be a problem with fork() and pipes.
-
-'sw' is sometimes 8 when using :vimgrep.
-
-Mingw can use setjmp()?  Move code from os_unix.c to common file, adjust
-#ifdefs.  Try with example from Michaelis.
+Mingw code to catch out-of-stack error doesn't work.  See MINGW_TRY in
+regexp.c.  Try with example from Michaelis.
 
 Russian helpfile doesn't show up correctly when 'encoding' is koi8-r.
 (Vassily Ragosin 2005 Feb 16)
index 5840cc5ad4dec4f2bf7ed29202637011bca66333..bde12e56e16615f7d2ccd050a5839221a4db479b 100644 (file)
@@ -607,6 +607,18 @@ static int function_exists __ARGS((char_u *name));
 static int builtin_function __ARGS((char_u *name));
 #ifdef FEAT_PROFILE
 static void func_do_profile __ARGS((ufunc_T *fp));
+static void prof_sort_list __ARGS((FILE *fd, ufunc_T **sorttab, int st_len, char *title, int prefer_self));
+static void prof_func_line __ARGS((FILE *fd, int count, proftime_T *total, proftime_T *self, int prefer_self));
+static int
+# ifdef __BORLANDC__
+    _RTLENTRYF
+# endif
+       prof_total_cmp __ARGS((const void *s1, const void *s2));
+static int
+# ifdef __BORLANDC__
+    _RTLENTRYF
+# endif
+       prof_self_cmp __ARGS((const void *s1, const void *s2));
 #endif
 static int script_autoload __ARGS((char_u *name));
 static char_u *autoload_name __ARGS((char_u *name));
@@ -16125,8 +16137,12 @@ func_dump_profile(fd)
     int                todo;
     ufunc_T    *fp;
     int                i;
+    ufunc_T    **sorttab;
+    int                st_len = 0;
 
     todo = func_hashtab.ht_used;
+    sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo));
+
     for (hi = func_hashtab.ht_array; todo > 0; ++hi)
     {
        if (!HASHITEM_EMPTY(hi))
@@ -16135,6 +16151,9 @@ func_dump_profile(fd)
            fp = HI2UF(hi);
            if (fp->uf_profiling)
            {
+               if (sorttab != NULL)
+                   sorttab[st_len++] = fp;
+
                if (fp->uf_name[0] == K_SPECIAL)
                    fprintf(fd, "FUNCTION  <SNR>%s()\n", fp->uf_name + 3);
                else
@@ -16150,26 +16169,115 @@ func_dump_profile(fd)
 
                for (i = 0; i < fp->uf_lines.ga_len; ++i)
                {
-                   if (fp->uf_tml_count[i] > 0)
-                   {
-                       fprintf(fd, "%5d ", fp->uf_tml_count[i]);
-                       if (profile_equal(&fp->uf_tml_total[i],
-                                                        &fp->uf_tml_self[i]))
-                           fprintf(fd, "           ");
-                       else
-                           fprintf(fd, "%s ",
-                                          profile_msg(&fp->uf_tml_total[i]));
-                       fprintf(fd, "%s ", profile_msg(&fp->uf_tml_self[i]));
-                   }
-                   else
-                       fprintf(fd, "                            ");
+                   prof_func_line(fd, fp->uf_tml_count[i],
+                            &fp->uf_tml_total[i], &fp->uf_tml_self[i], TRUE);
                    fprintf(fd, "%s\n", FUNCLINE(fp, i));
                }
                fprintf(fd, "\n");
            }
        }
     }
+
+    if (sorttab != NULL && st_len > 0)
+    {
+       qsort((void *)sorttab, (size_t)st_len, sizeof(ufunc_T *),
+                                                             prof_total_cmp);
+       prof_sort_list(fd, sorttab, st_len, "TOTAL", FALSE);
+       qsort((void *)sorttab, (size_t)st_len, sizeof(ufunc_T *),
+                                                             prof_self_cmp);
+       prof_sort_list(fd, sorttab, st_len, "SELF", TRUE);
+    }
+}
+
+    static void
+prof_sort_list(fd, sorttab, st_len, title, prefer_self)
+    FILE       *fd;
+    ufunc_T    **sorttab;
+    int                st_len;
+    char       *title;
+    int                prefer_self;    /* when equal print only self time */
+{
+    int                i;
+    ufunc_T    *fp;
+
+    fprintf(fd, "FUNCTIONS SORTED ON %s TIME\n", title);
+    fprintf(fd, "count  total (s)   self (s)  function\n");
+    for (i = 0; i < 20 && i < st_len; ++i)
+    {
+       fp = sorttab[i];
+       prof_func_line(fd, fp->uf_tm_count, &fp->uf_tm_total, &fp->uf_tm_self,
+                                                                prefer_self);
+       if (fp->uf_name[0] == K_SPECIAL)
+           fprintf(fd, " <SNR>%s()\n", fp->uf_name + 3);
+       else
+           fprintf(fd, " %s()\n", fp->uf_name);
+    }
+    fprintf(fd, "\n");
 }
+
+/*
+ * Print the count and times for one function or function line.
+ */
+    static void
+prof_func_line(fd, count, total, self, prefer_self)
+    FILE       *fd;
+    int                count;
+    proftime_T *total;
+    proftime_T *self;
+    int                prefer_self;    /* when equal print only self time */
+{
+    if (count > 0)
+    {
+       fprintf(fd, "%5d ", count);
+       if (prefer_self && profile_equal(total, self))
+           fprintf(fd, "           ");
+       else
+           fprintf(fd, "%s ", profile_msg(total));
+       if (!prefer_self && profile_equal(total, self))
+           fprintf(fd, "           ");
+       else
+           fprintf(fd, "%s ", profile_msg(self));
+    }
+    else
+       fprintf(fd, "                            ");
+}
+
+/*
+ * Compare function for total time sorting.
+ */
+    static int
+#ifdef __BORLANDC__
+_RTLENTRYF
+#endif
+prof_total_cmp(s1, s2)
+    const void *s1;
+    const void *s2;
+{
+    ufunc_T    *p1, *p2;
+
+    p1 = *(ufunc_T **)s1;
+    p2 = *(ufunc_T **)s2;
+    return profile_cmp(&p1->uf_tm_total, &p2->uf_tm_total);
+}
+
+/*
+ * Compare function for self time sorting.
+ */
+    static int
+#ifdef __BORLANDC__
+_RTLENTRYF
+#endif
+prof_self_cmp(s1, s2)
+    const void *s1;
+    const void *s2;
+{
+    ufunc_T    *p1, *p2;
+
+    p1 = *(ufunc_T **)s1;
+    p2 = *(ufunc_T **)s2;
+    return profile_cmp(&p1->uf_tm_self, &p2->uf_tm_self);
+}
+
 #endif
 
 /*
index 72d88dd7474f0ef7a4eb9c9adef7c6cd4f76ac54..a218810ece08d97080709510bd81053053d845b1 100644 (file)
@@ -18,6 +18,7 @@ void profile_add __ARGS((proftime_T *tm, proftime_T *tm2));
 void profile_get_wait __ARGS((proftime_T *tm));
 void profile_sub_wait __ARGS((proftime_T *tm, proftime_T *tma));
 int profile_equal __ARGS((proftime_T *tm1, proftime_T *tm2));
+int profile_cmp __ARGS((proftime_T *tm1, proftime_T *tm2));
 char *profile_msg __ARGS((proftime_T *tm));
 void ex_profile __ARGS((exarg_T *eap));
 void profile_dump __ARGS((void));
index 5a42c13d1df3bf2b024ddd91af9cedcb1c85a434..e98fd0bec38f126baf9726013e8002366725bb74 100644 (file)
@@ -87,4 +87,7 @@ void addfile __ARGS((garray_T *gap, char_u *f, int flags));
 char_u *get_cmd_output __ARGS((char_u *cmd, char_u *infile, int flags));
 void FreeWild __ARGS((int count, char_u **files));
 int goto_im __ARGS((void));
+void mch_startjmp __ARGS((void));
+void mch_endjmp __ARGS((void));
+void mch_didjmp __ARGS((void));
 /* vim: set ft=c : */