#34: stack refactoring

This commit is contained in:
Louis Rubet 2017-04-23 15:49:28 +02:00
parent df3042325a
commit 4d394e845e
2 changed files with 38 additions and 53 deletions

View file

@ -1,13 +1,17 @@
stack _stack_manip;
// //
void swap(void) void swap(void)
{ {
MIN_ARGUMENTS(2); MIN_ARGUMENTS(2);
_stack->copy_obj_to_local(0, 0);
_stack->copy_obj_to_local(1, 1); stack::copy_and_push_back(*_stack, _stack->size()-1, _stack_manip);
stack::copy_and_push_back(*_stack, _stack->size()-2, _stack_manip);
(void)_stack->pop_back(); (void)_stack->pop_back();
(void)_stack->pop_back(); (void)_stack->pop_back();
_stack->push_obj_from_local(0); stack::copy_and_push_back(_stack_manip, 0, *_stack);
_stack->push_obj_from_local(1); stack::copy_and_push_back(_stack_manip, 1, *_stack);
_stack_manip.erase();
} }
void drop(void) void drop(void)
@ -32,17 +36,14 @@ void erase(void)
void dup(void) void dup(void)
{ {
MIN_ARGUMENTS(1); MIN_ARGUMENTS(1);
_stack->copy_obj_to_local(0, 0); stack::copy_and_push_back(*_stack, _stack->size()-1, *_stack);
_stack->push_obj_from_local(0);
} }
void dup2(void) void dup2(void)
{ {
MIN_ARGUMENTS(2); MIN_ARGUMENTS(2);
_stack->copy_obj_to_local(0, 0); stack::copy_and_push_back(*_stack, _stack->size()-2, *_stack);
_stack->copy_obj_to_local(1, 1); stack::copy_and_push_back(*_stack, _stack->size()-2, *_stack);
_stack->push_obj_from_local(1);
_stack->push_obj_from_local(0);
} }
void pick(void) void pick(void)
@ -55,25 +56,28 @@ void pick(void)
// treat stack depth errors // treat stack depth errors
if ((to_pick == 0) || (to_pick > _stack->size())) if ((to_pick == 0) || (to_pick > _stack->size()))
{ {
ERR_CONTEXT(ret_missing_operand); ERR_CONTEXT(ret_out_of_range);
return; return;
} }
_stack->copy_obj_to_local(to_pick - 1, 0);
_stack->push_obj_from_local(0); stack::copy_and_push_back(*_stack, _stack->size()-to_pick, *_stack);
} }
void rot(void) void rot(void)
{ {
MIN_ARGUMENTS(3); MIN_ARGUMENTS(3);
_stack->copy_obj_to_local(0, 0);
_stack->copy_obj_to_local(1, 1); //TODO could be optimized
_stack->copy_obj_to_local(2, 2); stack::copy_and_push_back(*_stack, _stack->size()-3, _stack_manip);
stack::copy_and_push_back(*_stack, _stack->size()-2, _stack_manip);
stack::copy_and_push_back(*_stack, _stack->size()-1, _stack_manip);
(void)_stack->pop_back(); (void)_stack->pop_back();
(void)_stack->pop_back(); (void)_stack->pop_back();
(void)_stack->pop_back(); (void)_stack->pop_back();
_stack->push_obj_from_local(1); stack::copy_and_push_back(_stack_manip, 2, *_stack);
_stack->push_obj_from_local(0); stack::copy_and_push_back(_stack_manip, 1, *_stack);
_stack->push_obj_from_local(2); stack::copy_and_push_back(_stack_manip, 0, *_stack);
_stack_manip.erase();
} }
void depth(void) void depth(void)

View file

@ -13,20 +13,10 @@ using namespace std;
// allocation base size // allocation base size
#define ALLOC_STACK_CHUNK (64*1024) #define ALLOC_STACK_CHUNK (64*1024)
#define ALLOC_BLOB_CHUNK (64*1024) #define ALLOC_BLOB_CHUNK (64*1024)
#define LOCAL_COPY_PLACES 3
#define LOCAL_COPY_SIZE 128
// //
class stack class stack
{ {
private:
struct local_copy
{
unsigned int length;
int type;
int blob;
};
public: public:
stack() stack()
{ {
@ -34,9 +24,7 @@ public:
_blob = new char[ALLOC_BLOB_CHUNK]; _blob = new char[ALLOC_BLOB_CHUNK];
_total_size = ALLOC_STACK_CHUNK; _total_size = ALLOC_STACK_CHUNK;
_total_blob_size = ALLOC_BLOB_CHUNK; _total_blob_size = ALLOC_BLOB_CHUNK;
_current = _base; erase();
_current_blob = _blob;
_count = 0;
} }
virtual ~stack() virtual ~stack()
@ -45,6 +33,18 @@ public:
delete[] _blob; delete[] _blob;
} }
void erase()
{
_current = _base;
_current_blob = _blob;
_vpointer.clear();
_vpointer_blob.clear();
_vlen.clear();
_vlen_blob.clear();
_vtype.clear();
_count = 0;
}
void push_back(void* obj, unsigned int size, int type = 0, bool dont_copy = false, void* blob = NULL, unsigned int blob_size = 0) void push_back(void* obj, unsigned int size, int type = 0, bool dont_copy = false, void* blob = NULL, unsigned int blob_size = 0)
{ {
void* allocated_blob; void* allocated_blob;
@ -222,23 +222,6 @@ public:
return 0; return 0;
} }
// local objects copy
void copy_obj_to_local(unsigned int index, unsigned int to_place)
{
assert(to_place < LOCAL_COPY_PLACES);
struct local_copy* local = (struct local_copy*)_places[to_place];
local->length = get_len(index);
local->type= get_type(index);
memcpy(&local->blob, get_obj(index), local->length);
}
void push_obj_from_local(unsigned int from_place)
{
assert(from_place < LOCAL_COPY_PLACES);
struct local_copy* local = (struct local_copy*)_places[from_place];
push_back(&local->blob, local->length, local->type);
}
private: private:
char* _base; char* _base;
char* _blob; char* _blob;
@ -253,8 +236,6 @@ private:
unsigned int _count;// =_vlen.size()=_vpointer.size()=_vtype.size() unsigned int _count;// =_vlen.size()=_vpointer.size()=_vtype.size()
unsigned int _total_size;//total allocated size in bytes unsigned int _total_size;//total allocated size in bytes
unsigned int _total_blob_size;//total allocated blob size in bytes unsigned int _total_blob_size;//total allocated blob size in bytes
char _places[LOCAL_COPY_PLACES][LOCAL_COPY_SIZE];
}; };
// //