about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/.traces/array-from-args234
-rw-r--r--cpp/062array.mu40
2 files changed, 274 insertions, 0 deletions
diff --git a/cpp/.traces/array-from-args b/cpp/.traces/array-from-args
new file mode 100644
index 00000000..d2b9380f
--- /dev/null
+++ b/cpp/.traces/array-from-args
@@ -0,0 +1,234 @@
+parse/0: instruction: 114
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location", "deref": ]}
+parse/0:   product: {name: "2", value: 0, type: 5-1, properties: ["2": "array":"location"]}
+after-brace/0: recipe test-array-from-args
+after-brace/0: init-array ...
+after-brace/0: copy ...
+new/0: routine allocated memory from 1000 to 101000
+schedule/0: test-array-from-args
+run/0: instruction test-array-from-args/0
+run/0: instruction init-array/0
+mem/0: array size is 30
+mem/0: new alloc: 1000
+run/0: instruction init-array/1
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1002
+run/0: instruction init-array/3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1003
+mem/0: storing 1 in location 1004
+run/0: instruction init-array/4
+mem/0: location 1004 is 1
+run/0: ingredient 0 is 1
+run/0: jump-unless fell through
+run/0: instruction init-array/5
+run/0: ingredient 0 is capacity
+mem/0: location 1002 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1002
+run/0: instruction init-array/6
+run/0: ingredient 0 is -4
+run/0: jumping to instruction 3
+run/0: instruction init-array/3
+run/0: product 0 is 1
+mem/0: storing 1 in location 1003
+mem/0: storing 1 in location 1004
+run/0: instruction init-array/4
+mem/0: location 1004 is 1
+run/0: ingredient 0 is 1
+run/0: jump-unless fell through
+run/0: instruction init-array/5
+run/0: ingredient 0 is capacity
+mem/0: location 1002 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1002
+run/0: instruction init-array/6
+run/0: ingredient 0 is -4
+run/0: jumping to instruction 3
+run/0: instruction init-array/3
+run/0: product 0 is 2
+mem/0: storing 2 in location 1003
+mem/0: storing 1 in location 1004
+run/0: instruction init-array/4
+mem/0: location 1004 is 1
+run/0: ingredient 0 is 1
+run/0: jump-unless fell through
+run/0: instruction init-array/5
+run/0: ingredient 0 is capacity
+mem/0: location 1002 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1002
+run/0: instruction init-array/6
+run/0: ingredient 0 is -4
+run/0: jumping to instruction 3
+run/0: instruction init-array/3
+mem/0: storing 0 in location 1004
+run/0: instruction init-array/4
+mem/0: location 1004 is 0
+run/0: ingredient 0 is 0
+run/0: ingredient 1 is 
+run/0: jumping to instruction 7
+run/0: instruction init-array/8
+mem/0: location 1002 is 3
+mem/0: array size is 3
+mem/0: new alloc: 1030
+mem/0: storing 1030 in location 1005
+run/0: instruction init-array/9
+run/0: instruction init-array/10
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1006
+run/0: instruction init-array/12
+run/0: ingredient 0 is i
+mem/0: location 1006 is 0
+run/0: ingredient 1 is capacity
+mem/0: location 1002 is 3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1007
+run/0: instruction init-array/13
+mem/0: location 1007 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction init-array/14
+run/0: product 0 is 0
+mem/0: storing 0 in location 1003
+mem/0: storing 1 in location 1004
+run/0: instruction init-array/15
+run/0: ingredient 0 is exists?
+mem/0: location 1004 is 1
+run/0: instruction init-array/16
+run/0: ingredient 0 is result
+mem/0: location 1005 is 1030
+run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
+mem/0: location 1006 is 0
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1008
+run/0: instruction init-array/17
+run/0: ingredient 0 is curr-value
+mem/0: location 1003 is 0
+mem/0: location 1008 is 1031
+mem/0: storing 0 in location 1031
+run/0: instruction init-array/18
+run/0: ingredient 0 is i
+mem/0: location 1006 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1006
+run/0: instruction init-array/19
+run/0: ingredient 0 is -8
+run/0: jumping to instruction 12
+run/0: instruction init-array/12
+run/0: ingredient 0 is i
+mem/0: location 1006 is 1
+run/0: ingredient 1 is capacity
+mem/0: location 1002 is 3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1007
+run/0: instruction init-array/13
+mem/0: location 1007 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction init-array/14
+run/0: product 0 is 1
+mem/0: storing 1 in location 1003
+mem/0: storing 1 in location 1004
+run/0: instruction init-array/15
+run/0: ingredient 0 is exists?
+mem/0: location 1004 is 1
+run/0: instruction init-array/16
+run/0: ingredient 0 is result
+mem/0: location 1005 is 1030
+run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
+mem/0: location 1006 is 1
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1008
+run/0: instruction init-array/17
+run/0: ingredient 0 is curr-value
+mem/0: location 1003 is 1
+mem/0: location 1008 is 1032
+mem/0: storing 1 in location 1032
+run/0: instruction init-array/18
+run/0: ingredient 0 is i
+mem/0: location 1006 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1006
+run/0: instruction init-array/19
+run/0: ingredient 0 is -8
+run/0: jumping to instruction 12
+run/0: instruction init-array/12
+run/0: ingredient 0 is i
+mem/0: location 1006 is 2
+run/0: ingredient 1 is capacity
+mem/0: location 1002 is 3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1007
+run/0: instruction init-array/13
+mem/0: location 1007 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction init-array/14
+run/0: product 0 is 2
+mem/0: storing 2 in location 1003
+mem/0: storing 1 in location 1004
+run/0: instruction init-array/15
+run/0: ingredient 0 is exists?
+mem/0: location 1004 is 1
+run/0: instruction init-array/16
+run/0: ingredient 0 is result
+mem/0: location 1005 is 1030
+run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
+mem/0: location 1006 is 2
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1008
+run/0: instruction init-array/17
+run/0: ingredient 0 is curr-value
+mem/0: location 1003 is 2
+mem/0: location 1008 is 1033
+mem/0: storing 2 in location 1033
+run/0: instruction init-array/18
+run/0: ingredient 0 is i
+mem/0: location 1006 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1006
+run/0: instruction init-array/19
+run/0: ingredient 0 is -8
+run/0: jumping to instruction 12
+run/0: instruction init-array/12
+run/0: ingredient 0 is i
+mem/0: location 1006 is 3
+run/0: ingredient 1 is capacity
+mem/0: location 1002 is 3
+run/0: product 0 is 1
+mem/0: storing 1 in location 1007
+run/0: instruction init-array/13
+mem/0: location 1007 is 1
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 20
+run/0: instruction init-array/21
+mem/0: location 1005 is 1030
+run/0: result 0 is 1030
+mem/0: storing 1030 in location 1
+run/0: instruction test-array-from-args/1
+run/0: ingredient 0 is 1
+mem/0: location 1 is 1030
+mem/0: location 1030 is 3
+mem/0: location 1031 is 0
+mem/0: location 1032 is 1
+mem/0: location 1033 is 2
+mem/0: storing 3 in location 2
+mem/0: storing 0 in location 3
+mem/0: storing 1 in location 4
+mem/0: storing 2 in location 5
diff --git a/cpp/062array.mu b/cpp/062array.mu
new file mode 100644
index 00000000..3afecf5c
--- /dev/null
+++ b/cpp/062array.mu
@@ -0,0 +1,40 @@
+scenario array-from-args [
+  run [
+    1:address:array:location <- init-array 0:literal, 1:literal, 2:literal
+    2:array:location <- copy 1:address:array:location/deref
+  ]
+  memory should contain [
+    2 <- 3  # array length
+    3 <- 0
+    4 <- 1
+    5 <- 2
+  ]
+]
+
+# create an array out of a list of scalar args
+recipe init-array [
+  default-space:address:array:location <- new location:type, 30:literal
+  capacity:integer <- copy 0:literal
+  {
+    # while read curr-value
+    curr-value:location, exists?:boolean <- next-ingredient
+    break-unless exists?:boolean
+    capacity:integer <- add capacity:integer, 1:literal
+    loop
+  }
+  result:address:array:location <- new location:type, capacity:integer
+  rewind-ingredients
+  i:integer <- copy 0:literal
+  {
+    # while read curr-value
+    done?:boolean <- greater-or-equal i:integer, capacity:integer
+    break-if done?:boolean
+    curr-value:location, exists?:boolean <- next-ingredient
+    assert exists?:boolean, [error in rewinding ingredients to init-array]
+    tmp:address:location <- index-address result:address:array:location/deref, i:integer
+    tmp:address:location/deref <- copy curr-value:location
+    i:integer <- add i:integer, 1:literal
+    loop
+  }
+  reply result:address:array:location
+]