Author: Armin Rigo <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit