Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r247:ad70dac44a95
Date: 2013-06-23 21:05 +0200
http://bitbucket.org/pypy/stmgc/changeset/ad70dac44a95/

Log:    in-progress

diff --git a/c4/stmgc.h b/c4/stmgc.h
--- a/c4/stmgc.h
+++ b/c4/stmgc.h
@@ -56,10 +56,12 @@
    this call. */
 void stm_perform_transaction(gcptr arg, int (*callback)(gcptr, int));
 
-/* finish the current transaction, start a new one.  Must save roots
-   around calls to these two functions. */
+/* finish the current transaction, start a new one, or turn the current
+   transaction inevitable.  Must save roots around calls to these three
+   functions. */
 void stm_commit_transaction(void);
 void stm_begin_inevitable_transaction(void);
+void stm_become_inevitable(const char *reason);
 
 /* debugging: check if we're currently running a transaction or not. */
 int stm_in_transaction(void);
diff --git a/c4/stmsync.c b/c4/stmsync.c
--- a/c4/stmsync.c
+++ b/c4/stmsync.c
@@ -203,6 +203,11 @@
         BeginInevitableTransaction();
 }
 
+void stm_become_inevitable(const char *reason)
+{
+    BecomeInevitable(reason);
+}
+
 int stm_in_transaction(void)
 {
     struct tx_descriptor *d = thread_descriptor;
diff --git a/duhton/consobject.c b/duhton/consobject.c
--- a/duhton/consobject.c
+++ b/duhton/consobject.c
@@ -70,14 +70,12 @@
 DuObject *_DuCons_CAR(DuObject *cons)
 {
     assert(DuCons_Check(cons));
-    _du_read1(cons);
     return ((DuConsObject *)cons)->car;
 }
 
 DuObject *_DuCons_NEXT(DuObject *cons)
 {
     assert(DuCons_Check(cons));
-    _du_read1(cons);
     DuObject *result = ((DuConsObject *)cons)->cdr;
     if (result != Du_None && !DuCons_Check(cons))
         Du_FatalError("_DuCons_NEXT: not a well-formed cons list");
diff --git a/duhton/containerobject.c b/duhton/containerobject.c
--- a/duhton/containerobject.c
+++ b/duhton/containerobject.c
@@ -5,16 +5,6 @@
     DuObject *ob_reference;
 } DuContainerObject;
 
-void container_free(DuContainerObject *ob)
-{
-    DuObject *x = ob->ob_reference;
-#ifdef Du_DEBUG
-    ob->ob_reference = (DuObject *)0xDD;
-#endif
-    free(ob);
-    Du_DECREF(x);
-}
-
 void container_print(DuContainerObject *ob)
 {
     printf("<container ");
@@ -24,24 +14,18 @@
 
 DuObject *DuContainer_GetRef(DuObject *ob)
 {
-    DuObject *result;
     DuContainer_Ensure("DuContainer_GetRef", ob);
 
-    Du_AME_READ(ob, (result = ((DuContainerObject *)ob)->ob_reference));
-
-    Du_INCREF(result);
-    return result;
+    _du_read1(ob);
+    return ((DuContainerObject *)ob)->ob_reference;
 }
 
 void DuContainer_SetRef(DuObject *ob, DuObject *x)
 {
     DuContainer_Ensure("DuContainer_SetRef", ob);
 
-    Du_AME_WRITE(ob);
-    DuObject *prev = ((DuContainerObject *)ob)->ob_reference;
-    Du_INCREF(x);
+    _du_write1(ob);
     ((DuContainerObject *)ob)->ob_reference = x;
-    Du_DECREF(prev);
 }
 
 DuType DuContainer_Type = {
@@ -51,12 +35,14 @@
     (print_fn)container_print,
 };
 
-DuObject *DuContainer_New()
+DuObject *DuContainer_New(DuObject *x)
 {
+    _du_save1(x);
     DuContainerObject *ob =                                     \
         (DuContainerObject *)DuObject_New(&DuContainer_Type);
-    Du_INCREF(Du_None);
-    ob->ob_reference = Du_None;
+    _du_restore1(x);
+
+    ob->ob_reference = x;
     return (DuObject *)ob;
 }
 
@@ -64,5 +50,5 @@
 {
     if (!DuContainer_Check(ob))
         Du_FatalError("%s: expected 'container' argument, got '%s'",
-                      where, ob->ob_type->dt_name);
+                      where, Du_TYPE(ob)->dt_name);
 }
diff --git a/duhton/duhton.c b/duhton/duhton.c
--- a/duhton/duhton.c
+++ b/duhton/duhton.c
@@ -32,8 +32,6 @@
         if (interactive) {
             Du_Print(res, 1);
         }
-        Du_DECREF(res);
-        Du_DECREF(code);
         Du_TransactionRun();
         if (!interactive)
             break;
diff --git a/duhton/duhton.h b/duhton/duhton.h
--- a/duhton/duhton.h
+++ b/duhton/duhton.h
@@ -93,7 +93,7 @@
 void DuList_SetItem(DuObject *list, int index, DuObject *newobj);
 DuObject *DuList_Pop(DuObject *list, int index);
 
-DuObject *DuContainer_New(void);
+DuObject *DuContainer_New(DuObject *obj);
 DuObject *DuContainer_GetRef(DuObject *container);
 void DuContainer_SetRef(DuObject *container, DuObject *newobj);
 
diff --git a/duhton/glob.c b/duhton/glob.c
--- a/duhton/glob.c
+++ b/duhton/glob.c
@@ -2,15 +2,79 @@
 #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)
+{
+    DuObject *expr1, *obj1;
+
+    if (cons == Du_None) goto error;
+
+    _du_read1(cons);
+    expr1 = _DuCons_CAR(cons);
+    cons = _DuCons_NEXT(cons);
+    if (cons != Du_None) goto error;
+
+    obj1 = Du_Eval(expr1, locals);
+    *a = obj1;
+    return;
+
+ error:
+    Du_FatalError("%s: expected one argument", name);
+}
+
+static void _du_getargs2(const char *name, DuObject *cons, DuObject *locals,
+                         DuObject **a, DuObject **b)
+{
+    DuObject *expr1, *expr2, *obj1, *obj2;
+
+    if (cons == Du_None) goto error;
+
+    _du_read1(cons);
+    expr1 = _DuCons_CAR(cons);
+    cons = _DuCons_NEXT(cons);
+    if (cons == Du_None) goto error;
+
+    _du_read1(cons);
+    expr2 = _DuCons_CAR(cons);
+    cons = _DuCons_NEXT(cons);
+    if (cons != Du_None) goto error;
+
+    _du_save2(expr2, locals);
+    obj1 = Du_Eval(expr1, locals);
+    _du_restore2(expr2, locals);
+
+    _du_save1(obj1);
+    obj2 = Du_Eval(expr2, locals);
+    _du_restore1(obj1);
+
+    *a = obj1;
+    *b = obj2;
+    return;
+
+ error:
+    Du_FatalError("%s: expected two arguments", name);
+}
+
+/************************************************************/
+
+
 DuObject *Du_Progn(DuObject *cons, DuObject *locals)
 {
     DuObject *result = Du_None;
-    Du_INCREF(Du_None);
     while (cons != Du_None) {
-        DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
-        Du_DECREF(result);
-        result = obj;
-        cons = _DuCons_NEXT(cons);
+        _du_read1(cons);
+        DuObject *expr = _DuCons_CAR(cons);
+        DuObject *next = _DuCons_NEXT(cons);
+        _du_save2(next, locals);
+        result = Du_Eval(expr, locals);
+        _du_restore2(next, locals);
+        cons = next;
     }
     return result;
 }
@@ -18,18 +82,25 @@
 DuObject *du_setq(DuObject *cons, DuObject *locals)
 {
     DuObject *result = Du_None;
-    Du_INCREF(Du_None);
     while (cons != Du_None) {
+        _du_read1(cons);
         DuObject *symbol = _DuCons_CAR(cons);
         cons = _DuCons_NEXT(cons);
         if (cons == Du_None)
             Du_FatalError("setq: number of arguments is odd");
+        _du_read1(cons);
         DuObject *expr = _DuCons_CAR(cons);
-        DuObject *obj = Du_Eval(expr, locals);
+        DuObject *next = _DuCons_NEXT(cons);
+
+        _du_save3(symbol, next, locals);
+        result = Du_Eval(expr, locals);
+        _du_restore3(symbol, next, locals);
+
+        _du_save2(next, locals);
         DuFrame_SetSymbol(locals, symbol, obj);
-        Du_DECREF(result);
-        result = obj;
-        cons = _DuCons_NEXT(cons);
+        _du_restore2(next, locals);
+
+        cons = next;
     }
     return result;
 }
@@ -39,25 +110,34 @@
     DuObject *lst = DuList_New();
 
     while (cons != Du_None) {
-        DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+        _du_read1(cons);
+        DuObject *expr = _DuCons_CAR(cons);
+        DuObject *next = _DuCons_NEXT(cons);
+
+        _du_save3(lst, next, locals);
+        DuObject *obj = Du_Eval(expr, locals);
+        _du_restore3(lst, next, locals);
+
+        _du_save3(lst, next, locals);
         DuList_Append(lst, obj);
-        Du_DECREF(obj);
-        cons = _DuCons_NEXT(cons);
+        _du_restore3(lst, next, locals);
+
+        cons = next;
     }
 
-    Du_AME_TryInevitable();
+    _du_save1(lst);
+    stm_become_inevitable("print");
+    _du_restore1(lst);
 
     int i;
     for (i=0; i<DuList_Size(lst); i++) {
         if (i > 0) printf(" ");
-        DuObject *obj = DuList_GetItem(lst, i);
-        Du_Print(obj, 0);
-        Du_DECREF(obj);
+        _du_save1(lst);
+        Du_Print(DuList_GetItem(lst, i), 0);
+        _du_restore1(lst);
     }
-    Du_DECREF(lst);
 
     printf("\n");
-    Du_INCREF(Du_None);
     return Du_None;
 }
 
@@ -65,10 +145,16 @@
 {
     int result = 0;
     while (cons != Du_None) {
-        DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+        _du_read1(cons);
+        DuObject *expr = _DuCons_CAR(cons);
+        DuObject *next = _DuCons_NEXT(cons);
+
+        _du_save2(next, locals);
+        DuObject *obj = Du_Eval(expr, locals);
         result += DuInt_AsInt(obj);
-        Du_DECREF(obj);
-        cons = _DuCons_NEXT(cons);
+        _du_restore2(next, locals);
+
+        cons = next;
     }
     return DuInt_FromInt(result);
 }
@@ -78,11 +164,17 @@
     int result = 0;
     int sign = 1;
     while (cons != Du_None) {
-        DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+        _du_read1(cons);
+        DuObject *expr = _DuCons_CAR(cons);
+        DuObject *next = _DuCons_NEXT(cons);
+
+        _du_save2(next, locals);
+        DuObject *obj = Du_Eval(next, locals);
         result += sign * DuInt_AsInt(obj);
+        _du_restore2(next, locals);
+
         sign = -1;
-        Du_DECREF(obj);
-        cons = _DuCons_NEXT(cons);
+        cons = next;
     }
     return DuInt_FromInt(result);
 }
@@ -91,25 +183,27 @@
 {
     int result = 1;
     while (cons != Du_None) {
-        DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+        _du_read1(cons);
+        DuObject *expr = _DuCons_CAR(cons);
+        DuObject *next = _DuCons_NEXT(cons);
+
+        _du_save2(next, locals);
+        DuObject *obj = Du_Eval(expr, locals);
         result *= DuInt_AsInt(obj);
-        Du_DECREF(obj);
-        cons = _DuCons_NEXT(cons);
+        _du_restore2(next, locals);
+
+        cons = next;
     }
     return DuInt_FromInt(result);
 }
 
 static DuObject *_du_intcmp(DuObject *cons, DuObject *locals, int mode)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) == Du_None ||
-        _DuCons_NEXT(_DuCons_NEXT(cons)) != Du_None)
-        Du_FatalError("get: expected two arguments");
-    DuObject *obj_a = Du_Eval(_DuCons_CAR(cons), locals);
-    DuObject *obj_b = Du_Eval(_DuCons_CAR(_DuCons_NEXT(cons)), locals);
+    DuObject *obj_a, *obj_b;
+    _du_getargs2("comparison", cons, locals, &obj_a, &obj_b);
+
     int a = DuInt_AsInt(obj_a);
     int b = DuInt_AsInt(obj_b);
-    Du_DECREF(obj_a);
-    Du_DECREF(obj_b);
     int r = 0;
     switch (mode) {
     case 0: r = a < b; break;
@@ -137,74 +231,86 @@
 
 DuObject *du_type(DuObject *cons, DuObject *locals)
 {
-    if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
-        Du_FatalError("type: expected one argument");
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
-    DuObject *res = (DuObject *)(obj->ob_type);
-    Du_INCREF(res);
-    Du_DECREF(obj);
-    return res;
+    DuObject *obj;
+    _du_getarg1("type", cons, locals, &obj);
+
+    return DuSymbol_FromString(Du_TYPE(obj)->dt_name);
 }
 
 DuObject *du_quote(DuObject *cons, DuObject *locals)
 {
+    _du_read1(cons);
     if (cons == Du_None || _DuCons_NEXT(cons) != Du_None)
         Du_FatalError("quote: expected one argument");
-    DuObject *obj = _DuCons_CAR(cons);
-    Du_INCREF(obj);
-    return obj;
+    return _DuCons_CAR(cons);
 }
 
 DuObject *du_list(DuObject *cons, DuObject *locals)
 {
     DuObject *list = DuList_New();
     while (cons != Du_None) {
-        DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+        _du_read1(cons);
+        DuObject *expr = _DuCons_CAR(cons);
+        DuObject *next = _DuCons_NEXT(cons);
+
+        _du_save3(list, next, locals);
+        DuObject *obj = Du_Eval(expr, locals);
+        _du_restore3(list, next, locals);
+
+        _du_save3(list, next, locals);
         DuList_Append(list, obj);
-        Du_DECREF(obj);
-        cons = _DuCons_NEXT(cons);
+        _du_restore3(list, next, locals);
+
+        cons = next;
     }
     return list;
 }
 
 DuObject *du_container(DuObject *cons, DuObject *locals)
 {
-    if (cons != Du_None && _DuCons_NEXT(cons) != Du_None)
-        Du_FatalError("container: expected at most one argument");
-    DuObject *container = DuContainer_New();
-    if (cons != Du_None) {
-        DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
-        DuContainer_SetRef(container, obj);
-        Du_DECREF(obj);
-    }
-    return container;
+    DuObject *container;
+    DuObject *obj;
+
+    if (cons == Du_None)
+        obj = Du_None;
+    else
+        _du_getarg1("container", cons, locals, &obj);
+
+    return DuContainer_New(obj);
 }
 
 DuObject *du_get(DuObject *cons, DuObject *locals)
 {
     if (cons == Du_None)
         Du_FatalError("get: expected at least one argument");
-    DuObject *res;
-    DuObject *obj = Du_Eval(_DuCons_CAR(cons), locals);
+
+    _du_read1(cons);
+    DuObject *expr = _DuCons_CAR(cons);
+    DuObject *next = _DuCons_NEXT(cons);
+
+    _du_save2(next, locals);
+    DuObject *obj = Du_Eval(expr, locals);
+    _du_restore2(next, locals);
 
     if (DuList_Check(obj)) {
-        if (_DuCons_NEXT(cons) == Du_None ||
-            _DuCons_NEXT(_DuCons_NEXT(cons)) != Du_None)
+        _du_read1(next);
+        if (next == Du_None || _DuCons_NEXT(next) != Du_None)
             Du_FatalError("get with a list: expected two arguments");
-        DuObject *index = Du_Eval(_DuCons_CAR(_DuCons_NEXT(cons)), locals);
-        res = DuList_GetItem(obj, DuInt_AsInt(index));
-        Du_DECREF(index);
+
+        _du_save1(obj);
+        DuObject *index = Du_Eval(_DuCons_CAR(next), locals);
+        _du_restore1(obj);
+
+        return DuList_GetItem(obj, DuInt_AsInt(index));
     }
     else if (DuContainer_Check(obj)) {
-        if (_DuCons_NEXT(cons) != Du_None)
+        if (next != Du_None)
             Du_FatalError("get with a container: expected one argument");
-        res = DuContainer_GetRef(obj);
+
+        return DuContainer_GetRef(obj);
     }
     else
-        Du_FatalError("get: bad argument type '%s'", obj->ob_type->dt_name);
-
-    Du_DECREF(obj);
-    return res;
+        Du_FatalError("get: bad argument type '%s'", Du_TYPE(obj)->dt_name);
 }
 
 DuObject *du_set(DuObject *cons, DuObject *locals)
diff --git a/duhton/transaction.c b/duhton/transaction.c
--- a/duhton/transaction.c
+++ b/duhton/transaction.c
@@ -1,29 +1,12 @@
 #include "duhton.h"
 
 
-#ifndef Du_AME
-
-static DuObject *list_transactions = NULL;
-
 void Du_TransactionAdd(DuObject *frame)
 {
-    if (list_transactions == NULL) {
-        list_transactions = DuList_New();
-        _Du_ForgetReference(list_transactions);
-    }
-    DuList_Append(list_transactions, frame);
+    /* XXX */
 }
 
 void Du_TransactionRun(void)
 {
-    if (list_transactions == NULL)
-        return;
-    while (DuList_Size(list_transactions) > 0) {
-        DuObject *frame = DuList_Pop(list_transactions, 0);
-        DuObject *res = DuFrame_Execute(frame);
-        Du_DECREF(res);
-        Du_DECREF(frame);
-    }
+    /* XXX */
 }
-
-#endif
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to