From 0acfaaef6a402d332f2c1e83424e9d4d0ada7455 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 17 Apr 2015 20:36:25 -0700 Subject: 1088 - start porting the 'buffer' type --- cpp/.traces/init-buffer-allocates | 204 ++++++++++++++++++++++++++++++++++++++ cpp/032array | 4 + cpp/034exclusive_container | 1 + cpp/050scenario | 5 +- cpp/060string.mu | 17 ++++ 5 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 cpp/.traces/init-buffer-allocates diff --git a/cpp/.traces/init-buffer-allocates b/cpp/.traces/init-buffer-allocates new file mode 100644 index 00000000..2730df91 --- /dev/null +++ b/cpp/.traces/init-buffer-allocates @@ -0,0 +1,204 @@ +parse/0: instruction: 33 +parse/0: ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]} +parse/0: ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]} +parse/0: product: {name: "default-space", value: 0, type: 2-0, properties: ["default-space": "address":"space"]} +parse/0: instruction: 100 +parse/0: ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]} +parse/0: product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]} +parse/0: instruction: 19 +parse/0: ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]} +parse/0: ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]} +parse/0: product: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]} +parse/0: instruction: 23 +parse/0: ingredient: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character", "deref": ]} +parse/0: product: {name: "len1", value: 0, type: 1, properties: ["len1": "integer"]} +parse/0: instruction: 99 +parse/0: ingredient: {name: "len1", value: 0, type: 1, properties: ["len1": "integer"]} +parse/0: instruction: 99 +parse/0: ingredient: {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]} +parse/0: instruction: 99 +parse/0: ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]} +parse/0: instruction: 99 +parse/0: ingredient: {name: " +", value: 0, type: 0, properties: [" +": "literal-string"]} +parse/0: instruction: 100 +parse/0: ingredient: {name: "4", value: 0, type: 0, properties: ["4": "literal"]} +parse/0: product: {name: "y", value: 0, type: 2-9, properties: ["y": "address":"buffer"]} +parse/0: instruction: 19 +parse/0: ingredient: {name: "y", value: 0, type: 2-9, properties: ["y": "address":"buffer", "deref": ]} +parse/0: ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]} +parse/0: product: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character"]} +parse/0: instruction: 23 +parse/0: ingredient: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character", "deref": ]} +parse/0: product: {name: "len2", value: 0, type: 1, properties: ["len2": "integer"]} +parse/0: instruction: 99 +parse/0: ingredient: {name: "len2", value: 0, type: 1, properties: ["len2": "integer"]} +parse/0: instruction: 99 +parse/0: ingredient: {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]} +parse/0: instruction: 99 +parse/0: ingredient: {name: "y", value: 0, type: 2-9, properties: ["y": "address":"buffer"]} +parse/0: instruction: 99 +parse/0: ingredient: {name: " +", value: 0, type: 0, properties: [" +": "literal-string"]} +parse/0: instruction: 3 +parse/0: ingredient: {name: "y", value: 0, type: 2-9, properties: ["y": "address":"buffer"]} +parse/0: ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]} +parse/0: product: {name: "1", value: 0, type: 1, properties: ["1": "integer", "raw": ]} +new/0: location -> 1 +name/0: assign x 1 +name/0: element data of type buffer is at offset 1 +name/0: assign s1 2 +name/0: assign len1 3 +name/0: assign y 4 +name/0: element data of type buffer is at offset 1 +name/0: assign s2 5 +name/0: assign len2 6 +after-brace/0: recipe test-init-buffer-allocates +after-brace/0: new ... +after-brace/0: init-buffer ... +after-brace/0: get ... +after-brace/0: length ... +after-brace/0: $print ... +after-brace/0: $print ... +after-brace/0: $print ... +after-brace/0: $print ... +after-brace/0: init-buffer ... +after-brace/0: get ... +after-brace/0: length ... +after-brace/0: $print ... +after-brace/0: $print ... +after-brace/0: $print ... +after-brace/0: $print ... +after-brace/0: subtract ... +run/0: instruction test-init-buffer-allocates/0 +mem/0: new alloc: 1000 +mem/0: array size is 30 +run/0: instruction test-init-buffer-allocates/1 +run/0: instruction init-buffer/0 +mem/0: new alloc: 1030 +mem/0: array size is 30 +run/0: instruction init-buffer/1 +mem/0: new alloc: 1060 +mem/0: storing 1060 in location 1032 +run/0: instruction init-buffer/2 +run/0: ingredient 0 is result +mem/0: location 1032 is 1060 +run/0: ingredient 1 is length +run/0: address to copy is 1060 +run/0: product 0 is 1060 +mem/0: storing 1060 in location 1033 +run/0: instruction init-buffer/3 +run/0: ingredient 0 is 0 +mem/0: location 1033 is 1060 +mem/0: storing 0 in location 1060 +run/0: instruction init-buffer/4 +run/0: ingredient 0 is result +mem/0: location 1032 is 1060 +run/0: ingredient 1 is data +run/0: address to copy is 1061 +run/0: product 0 is 1061 +mem/0: storing 1061 in location 1034 +run/0: instruction init-buffer/5 +run/0: product 0 is 3 +mem/0: storing 3 in location 1035 +run/0: instruction init-buffer/6 +mem/0: new alloc: 1062 +mem/0: location 1034 is 1061 +mem/0: storing 1062 in location 1061 +mem/0: location 1035 is 3 +mem/0: array size is 3 +run/0: instruction init-buffer/7 +mem/0: location 1032 is 1060 +run/0: result 0 is 1060 +mem/0: storing 1060 in location 1002 +run/0: instruction test-init-buffer-allocates/2 +run/0: ingredient 0 is x +mem/0: location 1002 is 1060 +run/0: ingredient 1 is data +run/0: address to copy is 1061 +run/0: its type is 2 +mem/0: location 2062 is 0 +run/0: product 0 is 0 +mem/0: storing 0 in location 1003 +run/0: instruction test-init-buffer-allocates/3 +mem/0: location 1003 is 0 +mem/0: storing 0 in location 1004 +run/0: instruction test-init-buffer-allocates/4 +mem/0: location 1004 is 0 +run/0: $print: 0 +run/0: instruction test-init-buffer-allocates/5 +run/0: $print: +run/0: instruction test-init-buffer-allocates/6 +mem/0: location 1002 is 1060 +run/0: $print: 1060 +run/0: instruction test-init-buffer-allocates/7 +run/0: $print: +run/0: instruction test-init-buffer-allocates/8 +run/0: instruction init-buffer/0 +mem/0: new alloc: 1065 +mem/0: array size is 30 +run/0: instruction init-buffer/1 +mem/0: new alloc: 1095 +mem/0: storing 1095 in location 1067 +run/0: instruction init-buffer/2 +run/0: ingredient 0 is result +mem/0: location 1067 is 1095 +run/0: ingredient 1 is length +run/0: address to copy is 1095 +run/0: product 0 is 1095 +mem/0: storing 1095 in location 1068 +run/0: instruction init-buffer/3 +run/0: ingredient 0 is 0 +mem/0: location 1068 is 1095 +mem/0: storing 0 in location 1095 +run/0: instruction init-buffer/4 +run/0: ingredient 0 is result +mem/0: location 1067 is 1095 +run/0: ingredient 1 is data +run/0: address to copy is 1096 +run/0: product 0 is 1096 +mem/0: storing 1096 in location 1069 +run/0: instruction init-buffer/5 +run/0: product 0 is 4 +mem/0: storing 4 in location 1070 +run/0: instruction init-buffer/6 +mem/0: new alloc: 1097 +mem/0: location 1069 is 1096 +mem/0: storing 1097 in location 1096 +mem/0: location 1070 is 4 +mem/0: array size is 4 +run/0: instruction init-buffer/7 +mem/0: location 1067 is 1095 +run/0: result 0 is 1095 +mem/0: storing 1095 in location 1005 +run/0: instruction test-init-buffer-allocates/9 +run/0: ingredient 0 is y +mem/0: location 1005 is 1095 +run/0: ingredient 1 is data +run/0: address to copy is 1096 +run/0: its type is 2 +mem/0: location 2097 is 0 +run/0: product 0 is 0 +mem/0: storing 0 in location 1006 +run/0: instruction test-init-buffer-allocates/10 +mem/0: location 1006 is 0 +mem/0: storing 0 in location 1007 +run/0: instruction test-init-buffer-allocates/11 +mem/0: location 1007 is 0 +run/0: $print: 0 +run/0: instruction test-init-buffer-allocates/12 +run/0: $print: +run/0: instruction test-init-buffer-allocates/13 +mem/0: location 1005 is 1095 +run/0: $print: 1095 +run/0: instruction test-init-buffer-allocates/14 +run/0: $print: +run/0: instruction test-init-buffer-allocates/15 +run/0: ingredient 0 is y +mem/0: location 1005 is 1095 +run/0: ingredient 1 is x +mem/0: location 1002 is 1060 +run/0: product 0 is 35 +mem/0: storing 35 in location 1 diff --git a/cpp/032array b/cpp/032array index fbb5ed7b..a4f5ecba 100644 --- a/cpp/032array +++ b/cpp/032array @@ -1,4 +1,8 @@ //: Arrays contain a variable number of elements of the same type. +//: +//: You can create arrays of containers, but containers can only contain +//: elements of a fixed size, so you can't create containers containing arrays. +//: Create containers containing addresses to arrays instead. :(scenario copy_array) # Arrays can be copied around with a single instruction just like integers, diff --git a/cpp/034exclusive_container b/cpp/034exclusive_container index e38433d6..8f9fe842 100644 --- a/cpp/034exclusive_container +++ b/cpp/034exclusive_container @@ -40,6 +40,7 @@ recipe main [ :(before "End size_of(types) Cases") if (t.kind == exclusive_container) { // size of an exclusive container is the size of its largest variant + // (So like containers, it can't contain arrays.) //? cout << "--- " << types[0] << ' ' << t.size << '\n'; //? 1 //? cout << "point: " << Type_number["point"] << " " << Type[Type_number["point"]].name << " " << Type[Type_number["point"]].size << '\n'; //? 1 //? cout << t.name << ' ' << t.size << ' ' << t.elements.size() << '\n'; //? 1 diff --git a/cpp/050scenario b/cpp/050scenario index 9c29d971..199fd692 100644 --- a/cpp/050scenario +++ b/cpp/050scenario @@ -19,9 +19,12 @@ for (size_t i = 0; i < Scenarios.size(); ++i) { Trace_file = Scenarios[i].name; START_TRACING_UNTIL_END_OF_SCOPE //? Trace_stream->dump_layer = "all"; //? 1 +//? cout << "before: " << Memory[1] << '\n'; //? 1 +//? Trace_stream->dump_layer = "all"; //? 1 //? cout << "Before:\n"; dump_memory(); //? 1 -//? cout << Scenarios[i].to_run; //? 1 +//? cout << Scenarios[i].to_run; //? 2 run(Scenarios[i].to_run); +//? cout << "after: " << Memory[1] << '\n'; //? 1 //? cout << "After:\n"; dump_memory(); //? 1 for (map::iterator p = Scenarios[i].memory_expectations.begin(); p != Scenarios[i].memory_expectations.end(); diff --git a/cpp/060string.mu b/cpp/060string.mu index a437c24f..85ff65b6 100644 --- a/cpp/060string.mu +++ b/cpp/060string.mu @@ -96,3 +96,20 @@ scenario string-equal-common-lengths-but-distinct [ 3 <- 0 # abc != abd ] ] + +# A new type to help incrementally construct strings. +container buffer [ + length:integer + data:address:array:character +] + +recipe init-buffer [ + default-space:address:space <- new location:type, 30:literal + result:address:buffer <- new buffer:type + len:address:integer <- get-address result:address:buffer/deref, length:offset + len:address:integer/deref <- copy 0:literal + s:address:address:array:character <- get-address result:address:buffer/deref, data:offset + capacity:integer <- next-ingredient + s:address:address:array:character/deref <- new character:type, capacity:integer + reply result:address:buffer +] -- cgit 1.4.1-2-gfad0