]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Several optimizations and speed improvements.
authorSjoerd Mullender <sjoerd@acm.org>
Fri, 22 Oct 1993 12:04:32 +0000 (12:04 +0000)
committerSjoerd Mullender <sjoerd@acm.org>
Fri, 22 Oct 1993 12:04:32 +0000 (12:04 +0000)
cstubs: Use Matrix type instead of float[4][4].

Include/stringobject.h
Modules/cstubs
Modules/stropmodule.c
Objects/accessobject.c
Objects/classobject.c
Objects/dictobject.c
Objects/mappingobject.c
Objects/object.c
Objects/stringobject.c
Python/ceval.c

index a4b4ea654106eed0fac2cd6099badaa8f44317a4..fa2e8a133dbfcc69966f47ff0d1a77a4c8bbb910 100644 (file)
@@ -51,6 +51,9 @@ functions should be applied to nil objects.
 
 typedef struct {
        OB_VARHEAD
+#ifdef CACHE_HASH
+       long ob_shash;
+#endif
        char ob_sval[1];
 } stringobject;
 
index d8f2d90c1bf96c17ba98301c359649d223663a3d..7e99a82790cad903513a6034c889b2eeade1b07f 100644 (file)
@@ -529,21 +529,21 @@ gl_getmatrix(self, args)
        object *self;
        object *args;
 {
-       float arg1 [ 16 ] ;
+       Matrix arg1;
        object *v, *w;
-       int i;
+       int i, j;
        getmatrix( arg1 );
        v = newlistobject(16);
        if (v == NULL) {
                return err_nomem();
        }
-       for (i = 0; i < 16; i++) {
-               w = mknewfloatobject(arg1[i]);
+       for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) {
+               w = mknewfloatobject(arg1[i][j]);
                if (w == NULL) {
                        DECREF(v);
                        return NULL;
                }
-               setlistitem(v, i, w);
+               setlistitem(v, i*4+j, w);
        }
        return v;
 }
@@ -559,7 +559,7 @@ gl_altgetmatrix(self, args)
        object *self;
        object *args;
 {
-       float arg1 [ 4 ] [ 4 ] ;
+       Matrix arg1;
        object *v, *w;
        int i, j;
        getmatrix( arg1 );
@@ -742,7 +742,7 @@ gl_packrect(self, args)
        if (packed == NULL)
                return NULL;
        parray = (unsigned long *) getstringvalue(unpacked);
-       p = getstringvalue(packed);
+       p = (unsigned char *) getstringvalue(packed);
        for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
                for (x = 0; x < width; x += packfactor) {
                        pixel = parray[x];
index 6686abf58f19c94c301b19bbb77452db4893296f..3a941a8daf1cda763acb84b7cdfde3aa2bdf8882 100644 (file)
@@ -254,24 +254,26 @@ strop_lower(self, args)
        object *self; /* Not used */
        object *args;
 {
-       char *s;
+       char *s, *s_new;
        int i, n;
        object *new;
        int changed;
 
        if (!getargs(args, "s#", &s, &n))
                return NULL;
-       new = newsizedstringobject(s, n);
+       new = newsizedstringobject(NULL, n);
        if (new == NULL)
                return NULL;
-       s = getstringvalue(new);
+       s_new = getstringvalue(new);
        changed = 0;
        for (i = 0; i < n; i++) {
-               char c = s[i];
+               char c = *s++;
                if (isupper(c)) {
                        changed = 1;
-                       s[i] = tolower(c);
-               }
+                       *s_new = tolower(c);
+               } else
+                       *s_new = c;
+               s_new++;
        }
        if (!changed) {
                DECREF(new);
@@ -287,24 +289,26 @@ strop_upper(self, args)
        object *self; /* Not used */
        object *args;
 {
-       char *s;
+       char *s, *s_new;
        int i, n;
        object *new;
        int changed;
 
        if (!getargs(args, "s#", &s, &n))
                return NULL;
-       new = newsizedstringobject(s, n);
+       new = newsizedstringobject(NULL, n);
        if (new == NULL)
                return NULL;
-       s = getstringvalue(new);
+       s_new = getstringvalue(new);
        changed = 0;
        for (i = 0; i < n; i++) {
-               char c = s[i];
+               char c = *s++;
                if (islower(c)) {
                        changed = 1;
-                       s[i] = toupper(c);
-               }
+                       *s_new = toupper(c);
+               } else
+                       *s_new = c;
+               s_new++;
        }
        if (!changed) {
                DECREF(new);
@@ -320,28 +324,31 @@ strop_swapcase(self, args)
        object *self; /* Not used */
        object *args;
 {
-       char *s;
+       char *s, *s_new;
        int i, n;
        object *new;
        int changed;
 
        if (!getargs(args, "s#", &s, &n))
                return NULL;
-       new = newsizedstringobject(s, n);
+       new = newsizedstringobject(NULL, n);
        if (new == NULL)
                return NULL;
-       s = getstringvalue(new);
+       s_new = getstringvalue(new);
        changed = 0;
        for (i = 0; i < n; i++) {
-               char c = s[i];
+               char c = *s++;
                if (islower(c)) {
                        changed = 1;
-                       s[i] = toupper(c);
+                       *s_new = toupper(c);
                }
                else if (isupper(c)) {
                        changed = 1;
-                       s[i] = tolower(c);
+                       *s_new = tolower(c);
                }
+               else
+                       *s_new = c;
+               s_new++;
        }
        if (!changed) {
                DECREF(new);
index 6a8981e1ae0e2062ee88bedc3396d4dc4962853b..b2cd4ad0dc561ee69c82847835f2b5f662502c5c 100644 (file)
@@ -232,10 +232,11 @@ isprivileged(caller)
        object *caller;
 {
        object *g;
-       if (caller != NULL && hasattr(caller, "__privileged__"))
+       static char privileged[] = "__privileged__";
+       if (caller != NULL && hasattr(caller, privileged))
                return 1;
        g = getglobals();
-       if (g != NULL && dictlookup(g, "__privileged__"))
+       if (g != NULL && dictlookup(g, privileged))
                return 1;
        return 0;
 }
index c0eb8f1e1b032f33e0e280d48d5fbb11e6290fe7..60089995df60610c289ef4882d651d82ad5bc45f 100644 (file)
@@ -355,13 +355,15 @@ instance_getattr(inst, name)
 {
        register object *v;
        classobject *class;
-       if (strcmp(name, "__dict__") == 0) {
-               INCREF(inst->in_dict);
-               return inst->in_dict;
-       }
-       if (strcmp(name, "__class__") == 0) {
-               INCREF(inst->in_class);
-               return (object *)inst->in_class;
+       if (name[0] == '_' && name[1] == '_') {
+               if (strcmp(name, "__dict__") == 0) {
+                       INCREF(inst->in_dict);
+                       return inst->in_dict;
+               }
+               if (strcmp(name, "__class__") == 0) {
+                       INCREF(inst->in_class);
+                       return (object *)inst->in_class;
+               }
        }
        class = NULL;
        v = dictlookup(inst->in_dict, name);
index 527b062467edf9febe35370fe1e2631e961e8049..2a51d51dae2677ba70871c855678f1346a24ddd5 100644 (file)
@@ -242,6 +242,9 @@ mappinglookup(op, key)
                err_badcall();
                return NULL;
        }
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
        hash = hashobject(key);
        if (hash == -1)
                return NULL;
@@ -260,6 +263,9 @@ mappinginsert(op, key, value)
                err_badcall();
                return -1;
        }
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
        hash = hashobject(key);
        if (hash == -1)
                return -1;
@@ -289,6 +295,9 @@ mappingremove(op, key)
                err_badcall();
                return -1;
        }
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
        hash = hashobject(key);
        if (hash == -1)
                return -1;
@@ -447,7 +456,11 @@ mapping_subscript(mp, key)
        register object *key;
 {
        object *v;
-       long hash = hashobject(key);
+       long hash;
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
+       hash = hashobject(key);
        if (hash == -1)
                return NULL;
        v = lookmapping(mp, key, hash) -> me_value;
@@ -628,9 +641,15 @@ mapping_compare(a, b)
                res = cmpobject(akey, bkey);
                if (res != 0)
                        break;
+#ifdef CACHE_HASH
+               if (!is_stringobject(akey) || (ahash = ((stringobject *) akey)->ob_shash) == -1)
+#endif
                ahash = hashobject(akey);
                if (ahash == -1)
                        err_clear(); /* Don't want errors here */
+#ifdef CACHE_HASH
+               if (!is_stringobject(bkey) || (bhash = ((stringobject *) bkey)->ob_shash) == -1)
+#endif
                bhash = hashobject(bkey);
                if (bhash == -1)
                        err_clear(); /* Don't want errors here */
@@ -661,6 +680,9 @@ mapping_has_key(mp, args)
        register long ok;
        if (!getargs(args, "O", &key))
                return NULL;
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
        hash = hashobject(key);
        if (hash == -1)
                return NULL;
index 527b062467edf9febe35370fe1e2631e961e8049..2a51d51dae2677ba70871c855678f1346a24ddd5 100644 (file)
@@ -242,6 +242,9 @@ mappinglookup(op, key)
                err_badcall();
                return NULL;
        }
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
        hash = hashobject(key);
        if (hash == -1)
                return NULL;
@@ -260,6 +263,9 @@ mappinginsert(op, key, value)
                err_badcall();
                return -1;
        }
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
        hash = hashobject(key);
        if (hash == -1)
                return -1;
@@ -289,6 +295,9 @@ mappingremove(op, key)
                err_badcall();
                return -1;
        }
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
        hash = hashobject(key);
        if (hash == -1)
                return -1;
@@ -447,7 +456,11 @@ mapping_subscript(mp, key)
        register object *key;
 {
        object *v;
-       long hash = hashobject(key);
+       long hash;
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
+       hash = hashobject(key);
        if (hash == -1)
                return NULL;
        v = lookmapping(mp, key, hash) -> me_value;
@@ -628,9 +641,15 @@ mapping_compare(a, b)
                res = cmpobject(akey, bkey);
                if (res != 0)
                        break;
+#ifdef CACHE_HASH
+               if (!is_stringobject(akey) || (ahash = ((stringobject *) akey)->ob_shash) == -1)
+#endif
                ahash = hashobject(akey);
                if (ahash == -1)
                        err_clear(); /* Don't want errors here */
+#ifdef CACHE_HASH
+               if (!is_stringobject(bkey) || (bhash = ((stringobject *) bkey)->ob_shash) == -1)
+#endif
                bhash = hashobject(bkey);
                if (bhash == -1)
                        err_clear(); /* Don't want errors here */
@@ -661,6 +680,9 @@ mapping_has_key(mp, args)
        register long ok;
        if (!getargs(args, "O", &key))
                return NULL;
+#ifdef CACHE_HASH
+       if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
+#endif
        hash = hashobject(key);
        if (hash == -1)
                return NULL;
index bc0aeed295854e1adf3325d903edae90fb37d488..f2d801bb6584b6aaf28812038000c7d13d91ed86 100644 (file)
@@ -38,6 +38,7 @@ long ref_total;
 static typeobject *type_list;
 extern int tuple_zero_allocs, fast_tuple_allocs;
 extern int quick_int_allocs, quick_neg_int_allocs;
+extern int null_strings, one_strings;
 void
 dump_counts()
 {
@@ -51,6 +52,7 @@ dump_counts()
               tuple_zero_allocs);
        printf("fast int allocs: pos: %d, neg: %d\n", quick_int_allocs,
               quick_neg_int_allocs);
+       printf("null strings: %d, 1-strings: %d\n", null_strings, one_strings);
 }
 
 void
index a3043d49f43ddf8ef029ecea4dcbc70bb8d9d7ae..f66a82ccb8927cddb180bcebc0c1b54ae56d26df 100644 (file)
@@ -26,21 +26,76 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 #include "allobjects.h"
 
+#ifdef COUNT_ALLOCS
+int null_strings, one_strings;
+#endif
+
+#ifdef __STDC__
+#include <limits.h>
+#else
+#ifndef UCHAR_MAX
+#define UCHAR_MAX 255
+#endif
+#endif
+
+static stringobject *characters[UCHAR_MAX + 1];
+static stringobject *nullstring;
+
+/*
+   Newsizedstringobject() and newstringobject() try in certain cases
+   to share string objects.  When the size of the string is zero,
+   these routines always return a pointer to the same string object;
+   when the size is one, they return a pointer to an already existing
+   object if the contents of the string is known.  For
+   newstringobject() this is always the case, for
+   newsizedstringobject() this is the case when the first argument in
+   not NULL.
+   A common practice to allocate a string and then fill it in or
+   change it must be done carefully.  It is only allowed to change the
+   contents of the string if the obect was gotten from
+   newsizedstringobject() with a NULL first argument, because in the
+   future these routines may try to do even more sharing of objects.
+*/
 object *
 newsizedstringobject(str, size)
        char *str;
        int size;
 {
-       register stringobject *op = (stringobject *)
+       register stringobject *op;
+       if (size == 0 && (op = nullstring) != NULL) {
+#ifdef COUNT_ALLOCS
+               null_strings++;
+#endif
+               INCREF(op);
+               return op;
+       }
+       if (size == 1 && str != NULL && (op = characters[*str & UCHAR_MAX]) != NULL) {
+#ifdef COUNT_ALLOCS
+               one_strings++;
+#endif
+               INCREF(op);
+               return op;
+       }
+       op = (stringobject *)
                malloc(sizeof(stringobject) + size * sizeof(char));
        if (op == NULL)
                return err_nomem();
        op->ob_type = &Stringtype;
        op->ob_size = size;
+#ifdef CACHE_HASH
+       op->ob_shash = -1;
+#endif
        NEWREF(op);
        if (str != NULL)
                memcpy(op->ob_sval, str, size);
        op->ob_sval[size] = '\0';
+       if (size == 0) {
+               nullstring = op;
+               INCREF(op);
+       } else if (size == 1 && str != NULL) {
+               characters[*str & UCHAR_MAX] = op;
+               INCREF(op);
+       }
        return (object *) op;
 }
 
@@ -49,14 +104,39 @@ newstringobject(str)
        char *str;
 {
        register unsigned int size = strlen(str);
-       register stringobject *op = (stringobject *)
+       register stringobject *op;
+       if (size == 0 && (op = nullstring) != NULL) {
+#ifdef COUNT_ALLOCS
+               null_strings++;
+#endif
+               INCREF(op);
+               return op;
+       }
+       if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) {
+#ifdef COUNT_ALLOCS
+               one_strings++;
+#endif
+               INCREF(op);
+               return op;
+       }
+       op = (stringobject *)
                malloc(sizeof(stringobject) + size * sizeof(char));
        if (op == NULL)
                return err_nomem();
        op->ob_type = &Stringtype;
        op->ob_size = size;
+#ifdef CACHE_HASH
+       op->ob_shash = -1;
+#endif
        NEWREF(op);
        strcpy(op->ob_sval, str);
+       if (size == 0) {
+               nullstring = op;
+               INCREF(op);
+       } else if (size == 1) {
+               characters[*str & UCHAR_MAX] = op;
+               INCREF(op);
+       }
        return (object *) op;
 }
 
@@ -189,6 +269,9 @@ string_concat(a, bb)
                return err_nomem();
        op->ob_type = &Stringtype;
        op->ob_size = size;
+#ifdef CACHE_HASH
+       op->ob_shash = -1;
+#endif
        NEWREF(op);
        memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size);
        memcpy(op->ob_sval + a->ob_size, b->ob_sval, (int) b->ob_size);
@@ -218,6 +301,9 @@ string_repeat(a, n)
                return err_nomem();
        op->ob_type = &Stringtype;
        op->ob_size = size;
+#ifdef CACHE_HASH
+       op->ob_shash = -1;
+#endif
        NEWREF(op);
        for (i = 0; i < size; i += a->ob_size)
                memcpy(op->ob_sval+i, a->ob_sval, (int) a->ob_size);
@@ -247,16 +333,6 @@ string_slice(a, i, j)
        return newsizedstringobject(a->ob_sval + i, (int) (j-i));
 }
 
-#ifdef __STDC__
-#include <limits.h>
-#else
-#ifndef UCHAR_MAX
-#define UCHAR_MAX 255
-#endif
-#endif
-
-static object *characters[UCHAR_MAX + 1];
-
 static object *
 string_item(a, i)
        stringobject *a;
@@ -269,12 +345,16 @@ string_item(a, i)
                return NULL;
        }
        c = a->ob_sval[i] & UCHAR_MAX;
-       v = characters[c];
+       v = (object *) characters[c];
+#ifdef COUNT_ALLOCS
+       if (v != NULL)
+               one_strings++;
+#endif
        if (v == NULL) {
                v = newsizedstringobject((char *)NULL, 1);
                if (v == NULL)
                        return NULL;
-               characters[c] = v;
+               characters[c] = (stringobject *) v;
                ((stringobject *)v)->ob_sval[0] = c;
        }
        INCREF(v);
@@ -287,9 +367,14 @@ string_compare(a, b)
 {
        int len_a = a->ob_size, len_b = b->ob_size;
        int min_len = (len_a < len_b) ? len_a : len_b;
-       int cmp = memcmp(a->ob_sval, b->ob_sval, min_len);
-       if (cmp != 0)
-               return cmp;
+       int cmp;
+       if (min_len > 0) {
+               cmp = *a->ob_sval - *b->ob_sval;
+               if (cmp == 0)
+                       cmp = memcmp(a->ob_sval, b->ob_sval, min_len);
+               if (cmp != 0)
+                       return cmp;
+       }
        return (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0;
 }
 
@@ -297,14 +382,25 @@ static long
 string_hash(a)
        stringobject *a;
 {
-       register int len = a->ob_size;
-       register unsigned char *p = (unsigned char *) a->ob_sval;
-       register long x = *p << 7;
+       register int len;
+       register unsigned char *p;
+       register long x;
+
+#ifdef CACHE_HASH
+       if (a->ob_shash != -1)
+               return a->ob_shash;
+#endif
+       len = a->ob_size;
+       p = (unsigned char *) a->ob_sval;
+       x = *p << 7;
        while (--len >= 0)
                x = (x + x + x) ^ *p++;
        x ^= a->ob_size;
        if (x == -1)
                x = -2;
+#ifdef CACHE_HASH
+       a->ob_shash = x;
+#endif
        return x;
 }
 
index 071d664d547018c0ab8213a874a83a6949df4085..329494e7c4ace44ca50d80d32a6a1d4d8a781d02 100644 (file)
@@ -821,7 +821,7 @@ eval_code(co, globals, locals, owner, arg)
                                break;
                        }
                        if ((err = dict2remove(f->f_locals, w)) != 0)
-                               err_setstr(NameError, getstringvalue(w));
+                               err_setval(NameError, w);
                        break;
 
 #ifdef CASE_TOO_BIG
@@ -1031,7 +1031,7 @@ eval_code(co, globals, locals, owner, arg)
                                break;
                        }
                        if ((err = dict2remove(f->f_globals, w)) != 0)
-                               err_setstr(NameError, getstringvalue(w));
+                               err_setval(NameError, w);
                        break;
                
                case LOAD_CONST:
@@ -1050,8 +1050,7 @@ eval_code(co, globals, locals, owner, arg)
                                        err_clear();
                                        x = getbuiltin(w);
                                        if (x == NULL) {
-                                               err_setstr(NameError,
-                                                       getstringvalue(w));
+                                               err_setval(NameError, w);
                                                break;
                                        }
                                }
@@ -1073,8 +1072,7 @@ eval_code(co, globals, locals, owner, arg)
                                err_clear();
                                x = getbuiltin(w);
                                if (x == NULL) {
-                                       err_setstr(NameError,
-                                               getstringvalue(w));
+                                       err_setval(NameError, w);
                                        break;
                                }
                        }
@@ -1092,7 +1090,7 @@ eval_code(co, globals, locals, owner, arg)
                        w = GETNAMEV(oparg);
                        x = dict2lookup(f->f_locals, w);
                        if (x == NULL) {
-                               err_setstr(NameError, getstringvalue(w));
+                               err_setval(NameError, w);
                                break;
                        }
                        if (is_accessobject(x)) {