diff options
Diffstat (limited to 'Build/source/utils/asymptote/stack.cc')
-rw-r--r-- | Build/source/utils/asymptote/stack.cc | 74 |
1 files changed, 39 insertions, 35 deletions
diff --git a/Build/source/utils/asymptote/stack.cc b/Build/source/utils/asymptote/stack.cc index 31eab91106e..99a71e79348 100644 --- a/Build/source/utils/asymptote/stack.cc +++ b/Build/source/utils/asymptote/stack.cc @@ -38,57 +38,58 @@ position curPos = nullPos; const program::label nulllabel; } -inline stack::vars_t make_frame(lambda *l, stack::vars_t closure) +inline stack::vars_t base_frame( + size_t size, + size_t parentIndex, + stack::vars_t closure +#ifdef DEBUG_FRAME + , string name +#endif + ) { + stack::vars_t vars; #ifdef SIMPLE_FRAME - stack::vars_t vars = new item[l->framesize]; - vars[l->parentIndex] = closure; + vars = new item[size]; + vars[parentIndex] = closure; #else +# ifdef DEBUG_FRAME + assert(!name.empty()); + vars = new frame(name, parentIndex, size); +# else + vars = new frame(size); +# endif + (*vars)[parentIndex] = closure; +#endif + + // TODO: Re-factor closure. + return vars; +} + #ifdef DEBUG_FRAME - assert(!l->name.empty()); - stack::vars_t vars = new frame(l->name, l->parentIndex, l->framesize); +#define BASEFRAME(s,p,c,n) (base_frame((s), (p), (c), (n))) #else - stack::vars_t vars = new frame(l->framesize); +#define BASEFRAME(s,p,c,n) (base_frame((s), (p), (c))) #endif - // The closure is stored after the parameters. - (*vars)[l->parentIndex] = closure; -#endif +// Abstractions needed. +//accessor(frame_handle) +// operator[] for accessor - return vars; + +inline stack::vars_t make_frame(lambda *l, stack::vars_t closure) +{ + return BASEFRAME(l->framesize, l->parentIndex, closure, l->name); } inline stack::vars_t make_pushframe(size_t size, stack::vars_t closure) { assert(size >= 1); -#if SIMPLE_FRAME - stack::vars_t vars = new item[size]; - vars[0] = closure; -#else -#ifdef DEBUG_FRAME - stack::vars_t vars = new frame("<pushed frame>", 0, size); -#else - stack::vars_t vars = new frame(size); -#endif - (*vars)[0] = closure; -#endif - - return vars; + return BASEFRAME(size, 0, closure, "<pushed frame>"); } stack::vars_t make_dummyframe(string name) { -#if SIMPLE_FRAME - stack::vars_t vars = new item[1]; -#else -#ifdef DEBUG_FRAME - stack::vars_t vars = new frame("<dummy frame for "+name+">", 0, 1); -#else - stack::vars_t vars = new frame(1); -#endif -#endif - - return vars; + return BASEFRAME(1, 0, 0, "<dummy frame for "+name+">"); } inline stack::vars_t make_globalframe(size_t size) @@ -102,6 +103,8 @@ inline stack::vars_t make_globalframe(size_t size) direct[0] = indirect; return direct; #else + return BASEFRAME(size, 0, 0, "<globals>"); +#if 0 #ifdef DEBUG_FRAME stack::vars_t vars = new frame("<pushed frame>", 0, size); #else @@ -109,6 +112,7 @@ inline stack::vars_t make_globalframe(size_t size) #endif return vars; #endif +#endif } @@ -260,6 +264,7 @@ void stack::debug() } } + void stack::runWithOrWithoutClosure(lambda *l, vars_t vars, vars_t parent) { // The size of the frame (when running without closure). @@ -660,4 +665,3 @@ void interactiveStack::run(lambda *codelet) { } } // namespace vm - |