diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2010-07-10 22:19:57 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2010-07-10 22:19:57 +0200 |
commit | 2bfdf7e32fb4fb4b806264b323bac5237ed91705 (patch) | |
tree | dcf1c37042b96c06d196d9d249332aa2262b63f8 /src/Term.vala | |
parent | e65240c658ac1d43c5e2c1dcffd83d15605dc0f4 (diff) | |
download | eva-2bfdf7e32fb4fb4b806264b323bac5237ed91705.tar eva-2bfdf7e32fb4fb4b806264b323bac5237ed91705.zip |
New immutable list implementation
Diffstat (limited to 'src/Term.vala')
-rw-r--r-- | src/Term.vala | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/Term.vala b/src/Term.vala index 6b08730..698bfc2 100644 --- a/src/Term.vala +++ b/src/Term.vala @@ -75,18 +75,14 @@ namespace Eva { case Erl.TermType.NIL: case Erl.TermType.LIST: - List term = new List(); - assert(Erl.decode_list_header(buffer, ref index, out size) == 0); - if(size != 0) { - for(int i = 0; i < size; ++i) { - term.list.add(do_decode(buffer, ref index)); - } - term.tail = do_decode(buffer, ref index); + if(size == 0) { + return List.empty; + } + else { + return decode_list(buffer, ref index, size); } - - return term; case Erl.TermType.STRING: char[] value = new char[size+1]; @@ -119,6 +115,19 @@ namespace Eva { assert_not_reached(); } } + + private static List decode_list(void *buffer, ref int index, int n) { + Term head = do_decode(buffer, ref index); + Term tail; + + if(n > 1) { + tail = decode_list(buffer, ref index, n-1); + } + else { + tail = do_decode(buffer, ref index); + } + + return new List(head, tail); + } } - } |