summaryrefslogtreecommitdiffstats
path: root/src/Term.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/Term.vala')
-rw-r--r--src/Term.vala29
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);
+ }
}
-
}