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