cstubs: Use Matrix type instead of float[4][4].
typedef struct {
OB_VARHEAD
+#ifdef CACHE_HASH
+ long ob_shash;
+#endif
char ob_sval[1];
} stringobject;
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;
}
object *self;
object *args;
{
- float arg1 [ 4 ] [ 4 ] ;
+ Matrix arg1;
object *v, *w;
int i, j;
getmatrix( arg1 );
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];
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);
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);
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);
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;
}
{
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);
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;
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;
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;
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;
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 */
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;
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;
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;
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;
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;
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 */
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;
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()
{
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
#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;
}
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;
}
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);
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);
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;
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);
{
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;
}
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;
}
break;
}
if ((err = dict2remove(f->f_locals, w)) != 0)
- err_setstr(NameError, getstringvalue(w));
+ err_setval(NameError, w);
break;
#ifdef CASE_TOO_BIG
break;
}
if ((err = dict2remove(f->f_globals, w)) != 0)
- err_setstr(NameError, getstringvalue(w));
+ err_setval(NameError, w);
break;
case LOAD_CONST:
err_clear();
x = getbuiltin(w);
if (x == NULL) {
- err_setstr(NameError,
- getstringvalue(w));
+ err_setval(NameError, w);
break;
}
}
err_clear();
x = getbuiltin(w);
if (x == NULL) {
- err_setstr(NameError,
- getstringvalue(w));
+ err_setval(NameError, w);
break;
}
}
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)) {