[pypy-commit] stmgc default: merge

Raemi noreply at buildbot.pypy.org
Tue Jun 25 14:02:02 CEST 2013


Author: Remi Meier <meierrem at student.ethz.ch>
Branch: 
Changeset: r274:5634ab8d11f6
Date: 2013-06-25 14:01 +0200
http://bitbucket.org/pypy/stmgc/changeset/5634ab8d11f6/

Log:	merge

diff --git a/c4/Makefile b/c4/Makefile
--- a/c4/Makefile
+++ b/c4/Makefile
@@ -2,14 +2,16 @@
 # Makefile for the demos.
 #
 
+DEBUG_EXE = debug-demo1 debug-demo2 debug-demo_random
 BUILD_EXE = build-demo1 build-demo2 build-demo_random
-DEBUG_EXE = debug-demo1 debug-demo2 debug-demo_random
+RELEASE_EXE = release-demo1 release-demo2 release-demo_random
 
-build: $(BUILD_EXE)
-debug: $(DEBUG_EXE)
+debug: $(DEBUG_EXE)       # with prints and asserts
+build: $(BUILD_EXE)       # without prints, but with asserts
+release: $(RELEASE_EXE)   # without prints nor asserts
 
 clean:
-	rm -f $(BUILD_EXE) $(DEBUG_EXE)
+	rm -f $(BUILD_EXE) $(DEBUG_EXE) $(RELEASE_EXE)
 
 
 H_FILES = atomic_ops.h stmgc.h stmimpl.h \
@@ -29,5 +31,8 @@
 debug-%: %.c ${H_FILES} ${C_FILES}
 	gcc -lrt -pthread ${DEBUG} $< -o debug-$* -Wall ${C_FILES}
 
+release-%: %.c ${H_FILES} ${C_FILES} stmgc.c
+	gcc -lrt -pthread -DNDEBUG -O2 -g $< -o release-$* -Wall stmgc.c
+
 test-%:
 	./$* 2>/dev/null | grep "check ok"
diff --git a/c4/demo1.c b/c4/demo1.c
--- a/c4/demo1.c
+++ b/c4/demo1.c
@@ -11,7 +11,11 @@
 #include "fprintcolor.h"
 
 
-#define UPPER_BOUND 100
+#ifdef _GC_DEBUG
+# define UPPER_BOUND 100
+#else
+# define UPPER_BOUND 5000
+#endif
 #define NUMTHREADS  4
 
 
@@ -134,7 +138,8 @@
     stm_finalize();
 
     status = sem_post(&done);
-    assert(status == 0);
+    if (status != 0)
+        stm_fatalerror("status != 0\n");
     return NULL;
 }
 
@@ -158,7 +163,8 @@
 {
   pthread_t th;
   int status = pthread_create(&th, NULL, func, arg);
-  assert(status == 0);
+  if (status != 0)
+      stm_fatalerror("status != 0\n");
   pthread_detach(th);
   printf("started new thread\n");
 }
@@ -168,7 +174,8 @@
   int i, status;
 
   status = sem_init(&done, 0, 0);
-  assert(status == 0);
+  if (status != 0)
+      stm_fatalerror("status != 0\n");
 
   for (i = 0; i < NUMTHREADS; i++)
     newthread(demo1, NULL);
@@ -176,7 +183,8 @@
   for (i=0; i < NUMTHREADS; i++)
     {
       status = sem_wait(&done);
-      assert(status == 0);
+      if (status != 0)
+          stm_fatalerror("status != 0\n");
       printf("thread finished\n");
     }
 
diff --git a/c4/demo2.c b/c4/demo2.c
--- a/c4/demo2.c
+++ b/c4/demo2.c
@@ -97,23 +97,9 @@
             r_current = (struct node*)stm_read_barrier((gcptr)r_next);
             r_next = (struct node*)stm_read_barrier((gcptr)tmp);
         }
-        // results from consecutive read_barriers can differ. needs Ptr_Eq()
-        int i = 0;
-        while (!(stm_read_barrier((gcptr)r_prev->next) ==
-                 stm_read_barrier((gcptr)r_current) &&
-                 stm_read_barrier((gcptr)r_current->next) ==
-                 stm_read_barrier((gcptr)r_next))) {
-            asm volatile ("pause":::"memory");  /* smp_spinloop() */
-            i++;
-            assert(i < 1000000);
-        }
-        // for now:
-        assert(((nodeptr)stm_read_barrier((gcptr)r_prev->next))->value 
-               == r_current->value
-               && 
-               ((nodeptr)stm_read_barrier((gcptr)r_current->next))->value
-               == r_next->value);
-        
+        assert(stm_pointer_equal((gcptr)r_prev->next, (gcptr)r_current));
+        assert(stm_pointer_equal((gcptr)r_current->next, (gcptr)r_next));
+
         r_prev = r_current;
         r_current = r_next;
         r_next = r_next->next;
@@ -154,7 +140,8 @@
 void final_check(void)
 {
     long sum;
-    
+
+    printf("final check\n");
     stm_initialize();
     
     sum = check_sorted();
@@ -171,7 +158,8 @@
 {
     pthread_t th;
     int status = pthread_create(&th, NULL, func, arg);
-    assert(status == 0);
+    if (status != 0)
+        stm_fatalerror("newthread: pthread_create failure\n");
     pthread_detach(th);
     printf("started new thread\n");
 }
diff --git a/c4/demo_random.c b/c4/demo_random.c
--- a/c4/demo_random.c
+++ b/c4/demo_random.c
@@ -473,7 +473,8 @@
 {
     pthread_t th;
     int status = pthread_create(&th, NULL, func, arg);
-    assert(status == 0);
+    if (status != 0)
+        stm_fatalerror("newthread: pthread_create failure\n");
     pthread_detach(th);
     printf("started new thread\n");
 }
diff --git a/c4/et.c b/c4/et.c
--- a/c4/et.c
+++ b/c4/et.c
@@ -305,6 +305,7 @@
 
 static void _check_flags(gcptr P)
 {
+#ifndef NDEBUG
   struct tx_descriptor *d = thread_descriptor;
   if (P->h_tid & GCFLAG_STUB)
     {
@@ -322,6 +323,7 @@
       assert(is_old);
       dprintf(("O "));
     }
+#endif
 }
 
 gcptr _stm_nonrecord_barrier(gcptr P)
@@ -962,7 +964,6 @@
 
 static void CancelLocks(struct tx_descriptor *d)
 {
-  revision_t my_lock = d->my_lock;
   wlog_t *item;
 
   if (!g2l_any_entry(&d->public_to_private))
@@ -984,7 +985,7 @@
 
       if (v == expected)
         {
-          assert(R->h_revision != my_lock);
+          assert(R->h_revision != d->my_lock);
           break;    /* done */
         }
 
@@ -993,7 +994,7 @@
 #ifdef DUMP_EXTRA
       dprintf(("%p->h_revision = %p (CancelLocks)\n", R, (gcptr)v));
 #endif
-      assert(R->h_revision == my_lock);
+      assert(R->h_revision == d->my_lock);
       ACCESS_ONCE(R->h_revision) = v;
 
     } G2L_LOOP_END;
diff --git a/c4/gcpage.c b/c4/gcpage.c
--- a/c4/gcpage.c
+++ b/c4/gcpage.c
@@ -39,13 +39,17 @@
 void stmgcpage_acquire_global_lock(void)
 {
     int err = pthread_mutex_lock(&mutex_gc_lock);
-    assert(err == 0);
+    if (err != 0)
+        stm_fatalerror("stmgcpage_acquire_global_lock: "
+                       "pthread_mutex_lock() failure\n");
 }
 
 void stmgcpage_release_global_lock(void)
 {
     int err = pthread_mutex_unlock(&mutex_gc_lock);
-    assert(err == 0);
+    if (err != 0)
+        stm_fatalerror("stmgcpage_release_global_lock: "
+                       "pthread_mutex_unlock() failure\n");
 }
 
 
@@ -158,7 +162,9 @@
     }
 }
 
+#ifndef NDEBUG
 static unsigned char random_char = 0x55;
+#endif
 
 void stmgcpage_free(gcptr obj)
 {
diff --git a/c4/stmsync.c b/c4/stmsync.c
--- a/c4/stmsync.c
+++ b/c4/stmsync.c
@@ -57,7 +57,8 @@
 void stm_initialize(void)
 {
     int r = DescriptorInit();
-    assert(r == 1);
+    if (r != 1)
+        stm_fatalerror("stm_initialize: DescriptorInit failure\n");
     stmgc_init_nursery();
     init_shadowstack();
     //stmgcpage_init_tls();
@@ -227,7 +228,9 @@
 void stm_start_sharedlock(void)
 {
     int err = pthread_rwlock_rdlock(&rwlock_shared);
-    assert(err == 0);
+    if (err != 0)
+        stm_fatalerror("stm_start_sharedlock: "
+                       "pthread_rwlock_rdlock failure\n");
     //assert(stmgc_nursery_hiding(thread_descriptor, 0));
     dprintf(("stm_start_sharedlock\n"));
 }
@@ -237,13 +240,17 @@
     dprintf(("stm_stop_sharedlock\n"));
     //assert(stmgc_nursery_hiding(thread_descriptor, 1));
     int err = pthread_rwlock_unlock(&rwlock_shared);
-    assert(err == 0);
+    if (err != 0)
+        stm_fatalerror("stm_stop_sharedlock: "
+                       "pthread_rwlock_unlock failure\n");
 }
 
 static void start_exclusivelock(void)
 {
     int err = pthread_rwlock_wrlock(&rwlock_shared);
-    assert(err == 0);
+    if (err != 0)
+        stm_fatalerror("start_exclusivelock: "
+                       "pthread_rwlock_wrlock failure\n");
     dprintf(("start_exclusivelock\n"));
 }
 
@@ -251,7 +258,9 @@
 {
     dprintf(("stop_exclusivelock\n"));
     int err = pthread_rwlock_unlock(&rwlock_shared);
-    assert(err == 0);
+    if (err != 0)
+        stm_fatalerror("stop_exclusivelock: "
+                       "pthread_rwlock_unlock failure\n");
 }
 
 void stm_start_single_thread(void)
@@ -289,9 +298,8 @@
 
     /* Warning, may block waiting for rwlock_in_transaction while another
        thread runs a major GC */
-    struct tx_descriptor *d = thread_descriptor;
-    assert(d->active);
-    assert(in_single_thread != d);
+    assert(thread_descriptor->active);
+    assert(in_single_thread != thread_descriptor);
 
     stm_stop_sharedlock();
     /* another thread should be waiting in start_exclusivelock(),
diff --git a/duhton/duhton.h b/duhton/duhton.h
--- a/duhton/duhton.h
+++ b/duhton/duhton.h
@@ -97,7 +97,7 @@
 DuObject *DuContainer_GetRef(DuObject *container);
 void DuContainer_SetRef(DuObject *container, DuObject *newobj);
 
-DuObject *DuSymbol_FromString(char *name);
+DuObject *DuSymbol_FromString(const char *name);
 char *DuSymbol_AsString(DuObject *ob);
 
 DuObject *DuCons_New(DuObject *car, DuObject *cdr);
@@ -123,10 +123,11 @@
                              DuObject *arglist, DuObject *progn);
 DuObject *_DuFrame_EvalCall(DuObject *frame, DuObject *symbol,
                             DuObject *rest, int execute_now);
+DuObject *_Du_GetGlobals(void);
 
 void Du_Initialize(void);
 void Du_Finalize(void);
-extern DuObject *Du_Globals;
+#define Du_Globals        (_Du_GetGlobals())
 
 void Du_TransactionAdd(DuObject *code, DuObject *frame);
 void Du_TransactionRun(void);
diff --git a/duhton/frame.c b/duhton/frame.c
--- a/duhton/frame.c
+++ b/duhton/frame.c
@@ -15,6 +15,17 @@
     struct dictentry *entries;
 } DuFrameObject;
 
+DuFrameObject Du_GlobalsFrame = {
+    DuOBJECT_HEAD_INIT(DUTYPE_FRAME),
+    0,
+    NULL,
+};
+
+DuObject *_Du_GetGlobals()
+{
+    return (DuObject *)&Du_GlobalsFrame;
+}
+
 DuObject *DuFrame_New()
 {
     DuFrameObject *ob = (DuFrameObject *)DuObject_New(&DuFrame_Type);
diff --git a/duhton/glob.c b/duhton/glob.c
--- a/duhton/glob.c
+++ b/duhton/glob.c
@@ -2,12 +2,6 @@
 #include <sys/select.h>
 
 
-static void _du_getargs0(const char *name, DuObject *cons, DuObject *locals)
-{
-    if (cons != Du_None)
-        Du_FatalError("%s: expected no argument", name);
-}
-
 static void _du_getargs1(const char *name, DuObject *cons, DuObject *locals,
                          DuObject **a)
 {
@@ -93,13 +87,14 @@
         DuObject *next = _DuCons_NEXT(cons);
 
         _du_save3(symbol, next, locals);
-        result = Du_Eval(expr, locals);
+        DuObject *obj = Du_Eval(expr, locals);
         _du_restore3(symbol, next, locals);
 
-        _du_save2(next, locals);
+        _du_save3(next, locals, obj);
         DuFrame_SetSymbol(locals, symbol, obj);
-        _du_restore2(next, locals);
+        _du_restore3(next, locals, obj);
 
+        result = obj;
         cons = next;
     }
     return result;
@@ -169,7 +164,7 @@
         DuObject *next = _DuCons_NEXT(cons);
 
         _du_save2(next, locals);
-        DuObject *obj = Du_Eval(next, locals);
+        DuObject *obj = Du_Eval(expr, locals);
         result += sign * DuInt_AsInt(obj);
         _du_restore2(next, locals);
 
@@ -232,7 +227,7 @@
 DuObject *du_type(DuObject *cons, DuObject *locals)
 {
     DuObject *obj;
-    _du_getarg1("type", cons, locals, &obj);
+    _du_getargs1("type", cons, locals, &obj);
 
     return DuSymbol_FromString(Du_TYPE(obj)->dt_name);
 }
@@ -268,13 +263,12 @@
 
 DuObject *du_container(DuObject *cons, DuObject *locals)
 {
-    DuObject *container;
     DuObject *obj;
 
     if (cons == Du_None)
         obj = Du_None;
     else
-        _du_getarg1("container", cons, locals, &obj);
+        _du_getargs1("container", cons, locals, &obj);
 
     return DuContainer_New(obj);
 }
@@ -315,45 +309,58 @@
 
 DuObject *du_set(DuObject *cons, DuObject *locals)
 {
+    _du_read1(cons);
     if (cons == Du_None || _DuCons_NEXT(cons) == Du_None)
         Du_FatalError("set: expected at least two arguments");
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+
+    DuObject *expr = _DuCons_CAR(cons);
+    DuObject *next = _DuCons_NEXT(cons);
+
+    _du_save2(next, locals);
+    DuObject *obj = Du_Eval(expr, locals);
+    _du_restore2(next, locals);
+
+    _du_read1(next);
+    DuObject *expr2 = _DuCons_CAR(next);
+    DuObject *next2 = _DuCons_NEXT(next);
 
     if (DuList_Check(obj)) {
-        if (_DuCons_NEXT(_DuCons_NEXT(cons)) == Du_None ||
-            _DuCons_NEXT(_DuCons_NEXT(_DuCons_NEXT(cons))) != Du_None)
+        _du_read1(next2);
+        if (next2 == Du_None || _DuCons_NEXT(next2) != Du_None)
             Du_FatalError("set with a list: expected three arguments");
-        DuObject *index = Du_Eval(_DuCons_CAR(_DuCons_NEXT(cons)), locals);
-        DuObject *newobj = Du_Eval(
-                    _DuCons_CAR(_DuCons_NEXT(_DuCons_NEXT(cons))), locals);
+
+        _du_save3(obj, next2, locals);
+        DuObject *index = Du_Eval(expr2, locals);
+        _du_restore3(obj, next2, locals);
+
+        _du_save2(obj, index);
+        DuObject *newobj = Du_Eval(_DuCons_CAR(next2), locals);
+        _du_restore2(obj, index);
+
         DuList_SetItem(obj, DuInt_AsInt(index), newobj);
-        Du_DECREF(index);
-        Du_DECREF(newobj);
     }
     else if (DuContainer_Check(obj)) {
-        if (_DuCons_NEXT(_DuCons_NEXT(cons)) != Du_None)
+        if (next2 != Du_None)
             Du_FatalError("set with a container: expected two arguments");
-        DuObject *newobj = Du_Eval(_DuCons_CAR(_DuCons_NEXT(cons)), locals);
+
+        _du_save1(obj);
+        DuObject *newobj = Du_Eval(expr2, locals);
+        _du_restore1(obj);
+
         DuContainer_SetRef(obj, newobj);
-        Du_DECREF(newobj);
     }
     else
-        Du_FatalError("set: bad argument type '%s'", obj->ob_type->dt_name);
+        Du_FatalError("set: bad argument type '%s'", Du_TYPE(obj)->dt_name);
 
-    Du_DECREF(obj);
-    Du_INCREF(Du_None);
     return Du_None;
 }
 
 DuObject *du_append(DuObject *cons, DuObject *locals)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) == Du_None ||
-        _DuCons_NEXT(_DuCons_NEXT(cons)) != Du_None)
-        Du_FatalError("append: expected two arguments");
-    DuObject *lst = Du_Eval(_DuCons_CAR(cons), locals);
-    DuObject *newobj = Du_Eval(_DuCons_CAR(_DuCons_NEXT(cons)), locals);
+    DuObject *lst, *newobj;
+    _du_getargs2("append", cons, locals, &lst, &newobj);
+
     DuList_Append(lst, newobj);
-    Du_DECREF(lst);
     return newobj;
 }
 
@@ -361,50 +368,69 @@
 {
     if (cons == Du_None)
         Du_FatalError("pop: expected at least one argument");
-    DuObject *lst = Du_Eval(_DuCons_CAR(cons), locals);
+
+    _du_read1(cons);
+    DuObject *expr = _DuCons_CAR(cons);
+    DuObject *next = _DuCons_NEXT(cons);
+
+    _du_save2(next, locals);
+    DuObject *lst = Du_Eval(expr, locals);
+    _du_restore2(next, locals);
+
     int index;
-    if (_DuCons_NEXT(cons) == Du_None) {
+    if (next == Du_None) {
         index = DuList_Size(lst) - 1;
         if (index < 0)
             Du_FatalError("pop: empty list");
     }
-    else if (_DuCons_NEXT(_DuCons_NEXT(cons)) == Du_None) {
-        DuObject *indexobj = Du_Eval(_DuCons_CAR(_DuCons_NEXT(cons)), locals);
+    else {
+        _du_read1(next);
+        DuObject *expr2 = _DuCons_CAR(next);
+        DuObject *next2 = _DuCons_NEXT(next);
+
+        if (next2 != Du_None)
+            Du_FatalError("pop: expected at most two arguments");
+
+        _du_save1(lst);
+        DuObject *indexobj = Du_Eval(expr2, locals);
+        _du_restore1(lst);
+
         index = DuInt_AsInt(indexobj);
-        Du_DECREF(indexobj);
     }
-    else
-        Du_FatalError("pop: expected at most two arguments");
 
-    DuObject *res = DuList_Pop(lst, index);
-    Du_DECREF(lst);
-    return res;
+    return DuList_Pop(lst, index);
 }
 
 DuObject *du_len(DuObject *cons, DuObject *locals)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
-        Du_FatalError("len: expected one argument");
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+    DuObject *obj;
+    _du_getargs1("len", cons, locals, &obj);
+
     int length = DuObject_Length(obj);
-    Du_DECREF(obj);
     return DuInt_FromInt(length);
 }
 
 DuObject *du_if(DuObject *cons, DuObject *locals)
 {
+    _du_read1(cons);
     if (cons == Du_None || _DuCons_NEXT(cons) == Du_None)
         Du_FatalError("if: expected at least two arguments");
-    DuObject *cond = Du_Eval(_DuCons_CAR(cons), locals);
-    int cond_int = DuObject_IsTrue(cond);
-    Du_DECREF(cond);
-    if (cond_int != 0) {
+
+    DuObject *expr = _DuCons_CAR(cons);
+    DuObject *next = _DuCons_NEXT(cons);
+
+    _du_save2(next, locals);
+    DuObject *cond = Du_Eval(expr, locals);
+    _du_restore2(next, locals);
+
+    _du_read1(next);
+    if (DuObject_IsTrue(cond) != 0) {
         /* true path */
-        return Du_Eval(_DuCons_CAR(_DuCons_NEXT(cons)), locals);
+        return Du_Eval(_DuCons_CAR(next), locals);
     }
     else {
         /* false path */
-        return Du_Progn(_DuCons_NEXT(_DuCons_NEXT(cons)), locals);
+        return Du_Progn(_DuCons_NEXT(next), locals);
     }
 }
 
@@ -412,63 +438,73 @@
 {
     if (cons == Du_None)
         Du_FatalError("while: expected at least one argument");
+
+    _du_read1(cons);
+    DuObject *expr = _DuCons_CAR(cons);
+    DuObject *next = _DuCons_NEXT(cons);
+
     while (1) {
-        DuObject *cond = Du_Eval(_DuCons_CAR(cons), locals);
-        int cond_int = DuObject_IsTrue(cond);
-        Du_DECREF(cond);
-        if (cond_int == 0)
+        _du_save3(expr, next, locals);
+        DuObject *cond = Du_Eval(expr, locals);
+        _du_restore3(expr, next, locals);
+
+        if (!DuObject_IsTrue(cond))
             break;
-        DuObject *res = Du_Progn(_DuCons_NEXT(cons), locals);
-        Du_DECREF(res);
+
+        _du_save3(expr, next, locals);
+        Du_Progn(next, locals);
+        _du_restore3(expr, next, locals);
     }
-    Du_INCREF(Du_None);
     return Du_None;
 }
 
 DuObject *du_defun(DuObject *cons, DuObject *locals)
 {
+    _du_read1(cons);
     if (cons == Du_None || _DuCons_NEXT(cons) == Du_None)
         Du_FatalError("defun: expected at least two arguments");
+
     DuObject *name = _DuCons_CAR(cons);
-    DuObject *arglist = _DuCons_CAR(_DuCons_NEXT(cons));
-    DuObject *progn = _DuCons_NEXT(_DuCons_NEXT(cons));
+    DuObject *next = _DuCons_NEXT(cons);
+
+    _du_read1(next);
+    DuObject *arglist = _DuCons_CAR(next);
+    DuObject *progn = _DuCons_NEXT(next);
+
     DuFrame_SetUserFunction(locals, name, arglist, progn);
-    Du_INCREF(Du_None);
+
     return Du_None;
 }
 
 DuObject *du_car(DuObject *cons, DuObject *locals)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
-        Du_FatalError("car: expected one argument");
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
-    DuObject *res = DuCons_Car(obj);
-    Du_DECREF(obj);
-    return res;
+    DuObject *obj;
+    _du_getargs1("car", cons, locals, &obj);
+
+    return DuCons_Car(obj);
 }
 
 DuObject *du_cdr(DuObject *cons, DuObject *locals)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
-        Du_FatalError("car: expected one argument");
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
-    DuObject *res = DuCons_Cdr(obj);
-    Du_DECREF(obj);
-    return res;
+    DuObject *obj;
+    _du_getargs1("cdr", cons, locals, &obj);
+
+    return DuCons_Cdr(obj);
 }
 
 DuObject *du_not(DuObject *cons, DuObject *locals)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
-        Du_FatalError("not: expected one argument");
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+    DuObject *obj;
+    _du_getargs1("not", cons, locals, &obj);
+
     int res = !DuObject_IsTrue(obj);
-    Du_DECREF(obj);
     return DuInt_FromInt(res);
 }
 
 DuObject *du_transaction(DuObject *cons, DuObject *locals)
 {
+    Du_FatalError("transaction: not implemented");
+#if 0
     if (cons == Du_None)
         Du_FatalError("transaction: expected at least one argument");
     DuObject *sym = _DuCons_CAR(cons);
@@ -476,61 +512,57 @@
     _DuFrame_EvalCall(locals, sym, rest, 0);
     Du_INCREF(Du_None);
     return Du_None;
+#endif
 }
 
 DuObject *du_sleepms(DuObject *cons, DuObject *locals)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
-        Du_FatalError("sleepms: expected one argument");
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+    DuObject *obj;
+    _du_getargs1("sleepms", cons, locals, &obj);
+
     int ms = DuInt_AsInt(obj);
-    Du_DECREF(obj);
 
     struct timeval t;
     t.tv_sec = ms / 1000;
     t.tv_usec = (ms % 1000) * 1000;
     select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
 
-    Du_INCREF(Du_None);
     return Du_None;
 }
 
 DuObject *du_defined(DuObject *cons, DuObject *locals)
 {
+    _du_read1(cons);
     if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
         Du_FatalError("defined?: expected one argument");
     DuObject *ob = _DuCons_CAR(cons);
+
+    _du_save1(ob);
     DuObject *res = DuFrame_GetSymbol(locals, ob);
+    _du_restore1(ob);
+
     if (res == NULL)
-        DuFrame_GetSymbol(Du_Globals, ob);
-    if (res != NULL)
-        Du_DECREF(res);
+        res = DuFrame_GetSymbol(Du_Globals, ob);
+
     return DuInt_FromInt(res != NULL);
 }
 
 DuObject *du_assert(DuObject *cons, DuObject *locals)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
-        Du_FatalError("defined?: expected one argument");
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+    DuObject *obj;
+    _du_getargs1("assert", cons, locals, &obj);
+
     if (!DuInt_AsInt(obj)) {
         printf("assert failed: ");
+        _du_read1(cons);
         Du_Print(_DuCons_CAR(cons), 1);
         Du_FatalError("assert failed");
     }
-    Du_DECREF(obj);
-    Du_INCREF(Du_None);
     return Du_None;
 }
 
-DuObject *Du_Globals;
-
 void Du_Initialize(void)
 {
-    _Du_AME_InitThreadDescriptor();
-    _Du_InitializeObjects();
-
-    Du_Globals = DuFrame_New();
     DuFrame_SetBuiltinMacro(Du_Globals, "progn", Du_Progn);
     DuFrame_SetBuiltinMacro(Du_Globals, "setq", du_setq);
     DuFrame_SetBuiltinMacro(Du_Globals, "print", du_print);
@@ -567,9 +599,4 @@
 
 void Du_Finalize(void)
 {
-    Du_DECREF(Du_Globals);
-    Du_Globals = NULL;
-
-    _Du_FinalizeObjects();
-    _Du_AME_FiniThreadDescriptor();
 }
diff --git a/duhton/listobject.c b/duhton/listobject.c
--- a/duhton/listobject.c
+++ b/duhton/listobject.c
@@ -21,12 +21,14 @@
 {
     int i;
     _du_read1(ob);
-    if (ob->ob_count == 0) {
+
+    DuTupleObject *p = ob->ob_tuple;
+    _du_read1(p);
+
+    if (p->ob_count == 0) {
         printf("[]");
     }
     else {
-        DuTupleObject *p = ob->ob_tuple;
-        _du_read1(p);
         printf("[ ");
         for (i=0; i<p->ob_count; i++) {
             Du_Print(p->ob_items[i], 0);
@@ -63,8 +65,8 @@
     DuTupleObject *newitems = DuTuple_New(newcount);
 
     for (i=0; i<newcount-1; i++)
-        newitems[i] = olditems[i];
-    newitems[newcount-1] = x;
+        newitems->ob_items[i] = olditems->ob_items[i];
+    newitems->ob_items[newcount-1] = x;
 
     ob->ob_tuple = newitems;
 }
@@ -124,6 +126,7 @@
     if (index < 0 || index >= p->ob_count)
         Du_FatalError("list_pop: index out of range");
     DuObject *result = p->ob_items[index];
+    int i;
     p->ob_count--;
     for (i=index; i<p->ob_count; i++)
         p->ob_items[i] = p->ob_items[i+1];
@@ -149,7 +152,7 @@
 static DuTupleObject du_empty_tuple = {
     DuOBJECT_HEAD_INIT(DUTYPE_TUPLE),
     0,
-}
+};
 
 DuObject *DuList_New()
 {
diff --git a/duhton/symbol.c b/duhton/symbol.c
--- a/duhton/symbol.c
+++ b/duhton/symbol.c
@@ -43,7 +43,7 @@
     (eval_fn)symbol_eval,
 };
 
-DuObject *DuSymbol_FromString(char *name)
+DuObject *DuSymbol_FromString(const char *name)
 {
     DuSymbolObject *p, *head = &_Du_AllSymbols;
     for (p=head; p != NULL; p=p->next) {
diff --git a/duhton/transaction.c b/duhton/transaction.c
--- a/duhton/transaction.c
+++ b/duhton/transaction.c
@@ -1,7 +1,7 @@
 #include "duhton.h"
 
 
-void Du_TransactionAdd(DuObject *frame)
+void Du_TransactionAdd(DuObject *code, DuObject *frame)
 {
     /* XXX */
 }


More information about the pypy-commit mailing list