Author: Armin Rigo <[email protected]>
Branch:
Changeset: r277:5252837946d1
Date: 2013-06-25 16:42 +0200
http://bitbucket.org/pypy/stmgc/changeset/5252837946d1/
Log: Progress
diff --git a/duhton/frame.c b/duhton/frame.c
--- a/duhton/frame.c
+++ b/duhton/frame.c
@@ -34,9 +34,14 @@
DuFrameNodeObject *ob_nodes;
} DuFrameObject;
+static DuFrameNodeObject du_empty_framenode = {
+ DuOBJECT_HEAD_INIT(DUTYPE_FRAMENODE),
+ 0,
+};
+
DuFrameObject Du_GlobalsFrame = {
DuOBJECT_HEAD_INIT(DUTYPE_FRAME),
- NULL,
+ &du_empty_framenode,
};
DuObject *_Du_GetGlobals()
@@ -47,7 +52,7 @@
DuObject *DuFrame_New()
{
DuFrameObject *ob = (DuFrameObject *)DuObject_New(&DuFrame_Type);
- ob->ob_nodes = NULL;
+ ob->ob_nodes = &du_empty_framenode;
return (DuObject *)ob;
}
@@ -132,6 +137,7 @@
newentries[i] = entries[i];
DuSymbol_Ensure("find_entry", symbol);
+ newentries[left].symbol_id = search_id;
newentries[left].symbol = symbol;
newentries[left].value = NULL;
newentries[left].builtin_macro = NULL;
@@ -164,30 +170,40 @@
_parse_arguments(DuObject *symbol, DuObject *arguments,
DuObject *formallist, DuObject *caller, DuObject *callee)
{
- abort();
-#if 0
while (DuCons_Check(formallist)) {
if (!DuCons_Check(arguments))
Du_FatalError("call to '%s': not enough arguments",
DuSymbol_AsString(symbol));
+
+ _du_read1(arguments);
+ DuObject *arg = _DuCons_CAR(arguments);
+ DuObject *argumentsnext = _DuCons_NEXT(arguments);
+
+ _du_save3(symbol, argumentsnext, caller);
+ _du_save2(formallist, callee);
+ DuObject *obj = Du_Eval(arg, caller);
+ _du_restore2(formallist, callee);
+
+ _du_read1(formallist);
DuObject *sym = _DuCons_CAR(formallist);
- DuObject *obj = Du_Eval(_DuCons_CAR(arguments), caller);
+ DuObject *formallistnext = _DuCons_NEXT(formallist);
+
+ _du_save2(formallistnext, callee);
DuFrame_SetSymbol(callee, sym, obj);
- Du_DECREF(obj);
- formallist = _DuCons_NEXT(formallist);
- arguments = _DuCons_NEXT(arguments);
+ _du_restore2(formallistnext, callee);
+ _du_restore3(symbol, argumentsnext, caller);
+
+ formallist = formallistnext;
+ arguments = argumentsnext;
}
if (arguments != Du_None)
Du_FatalError("call to '%s': too many arguments",
DuSymbol_AsString(symbol));
-#endif
}
DuObject *_DuFrame_EvalCall(DuObject *frame, DuObject *symbol,
DuObject *rest, int execute_now)
{
- stm_fatalerror("_DuFrame_EvalCall\n");
-#if 0
struct dictentry *e;
DuFrame_Ensure("_DuFrame_EvalCall", frame);
@@ -205,18 +221,24 @@
}
}
if (e->func_progn) {
+ DuObject *func = e->func_progn;
+ _du_save1(func);
+ _du_save3(frame, symbol, rest);
DuObject *callee_frame = DuFrame_New();
- DuObject *res;
+ _du_restore3(frame, symbol, rest);
+
+ _du_save1(callee_frame);
_parse_arguments(symbol, rest, e->func_arglist, frame, callee_frame);
+ _du_restore1(callee_frame);
+ _du_restore1(func);
+
if (execute_now) {
- res = Du_Progn(e->func_progn, callee_frame);
+ return Du_Progn(func, callee_frame);
}
else {
- Du_TransactionAdd(e->func_progn, callee_frame);
- res = NULL;
+ Du_TransactionAdd(func, callee_frame);
+ return NULL;
}
- Du_DECREF(callee_frame);
- return res;
}
if (e->builtin_macro) {
if (!execute_now)
@@ -227,63 +249,50 @@
not_defined:
Du_FatalError("symbol not defined as a function: '%s'",
DuSymbol_AsString(symbol));
-#endif
}
DuObject *DuFrame_GetSymbol(DuObject *frame, DuObject *symbol)
{
- stm_fatalerror("DuFrame_GetSymbol\n");
-#if 0
struct dictentry *e;
DuFrame_Ensure("DuFrame_GetSymbol", frame);
e = find_entry((DuFrameObject *)frame, symbol, 0);
- if (e && e->value) {
- Du_INCREF(e->value);
- return e->value;
- }
- else
- return NULL;
-#endif
+ return e ? e->value : NULL;
}
void DuFrame_SetSymbol(DuObject *frame, DuObject *symbol, DuObject *value)
{
- stm_fatalerror("DuFrame_SetSymbol\n");
-#if 0
struct dictentry *e;
DuFrame_Ensure("DuFrame_SetSymbol", frame);
+ _du_save1(value);
e = find_entry((DuFrameObject *)frame, symbol, 1);
- if (e->value) Du_DECREF(e->value);
- e->value = value; Du_INCREF(value);
-#endif
+ _du_restore1(value);
+
+ e->value = value;
}
void DuFrame_SetSymbolStr(DuObject *frame, char *name, DuObject *value)
{
- stm_fatalerror("DuFrame_SetSymbolStr\n");
-#if 0
+ _du_save2(frame, value);
DuObject *sym = DuSymbol_FromString(name);
+ _du_restore2(frame, value);
+
DuFrame_SetSymbol(frame, sym, value);
- Du_DECREF(sym);
-#endif
}
void DuFrame_SetUserFunction(DuObject *frame, DuObject *symbol,
DuObject *arglist, DuObject *progn)
{
- stm_fatalerror("DuFrame_SetUserFunction\n");
-#if 0
struct dictentry *e;
DuFrame_Ensure("DuFrame_SetUserFunction", frame);
+ _du_save2(arglist, progn);
e = find_entry((DuFrameObject *)frame, symbol, 1);
- if (e->func_arglist) Du_DECREF(e->func_arglist);
- if (e->func_progn) Du_DECREF(e->func_progn);
- e->func_arglist = arglist; Du_INCREF(arglist);
- e->func_progn = progn; Du_INCREF(progn);
-#endif
+ _du_restore2(arglist, progn);
+
+ e->func_arglist = arglist;
+ e->func_progn = progn;
}
void DuFrame_Ensure(char *where, DuObject *ob)
diff --git a/duhton/object.c b/duhton/object.c
--- a/duhton/object.c
+++ b/duhton/object.c
@@ -71,7 +71,7 @@
vfprintf(stderr, msg, ap);
fprintf(stderr, "\n");
va_end(ap);
- exit(1);
+ abort();
}
void Du_Print(DuObject *ob, int newline)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit