| 40 | | * Evaluation of `DynamicTypeOf(t)` in a state `s` is defined as follows: |
| 41 | | * if `t` is a struct type, say with tag `foo`, then the result is the result of evaluating the variable (in s) `__struct_foo__` |
| 42 | | * if `t` is an array type with element type `E` and length expression `l`, the result is obtained by evaluating `CIVLDynamicType(E)`, call the result `de`; evaluating `l`, call the result `dl`; and return `completeArrayType(de,dl)` (eliding the wrapping and unwrapping of the symbolic type into a symbolic expression value) |
| 43 | | * Evaluation of `InitialValue[v,d]` is as follows: |
| 44 | | * for a primitive dynamic type, some undefined value (null expression)? |
| 45 | | * define a method in the `Evaluator`, `SymbolicExpression computeInitialValue(LHSExpression expr, SymbolicType dynamicType);` |
| 46 | | * if `dynamicType` is a tuple type, create the concrete tuple of type of that type with each component obtained by evaluating `computeInitialValue(dotExpression(…), componentType)` |
| | 40 | * define a method in the `Evaluator`, `SymbolicType getDynamicType(State s, Type t)` |
| | 41 | * if `t` is a primitive type, map to the corresponding symbolic type |
| | 42 | * if `t` is a struct type, say with tag `foo`, then the result is the result of evaluating the variable (in s) `__struct_foo__` and extracting the symbolic type from the result |
| | 43 | * if `t` is an array type with element type `E` and length expression `l`, the result is obtained by evaluating `getDynamicType(s, E)`, call the result `de`; evaluating `l`, call the result `dl`; and returning `completeArrayType(de,dl)` (eliding the wrapping and unwrapping of the symbolic type into a symbolic expression value) |
| | 44 | * define a method in the `Evaluator`, `SymbolicType computeDynamicType(State s, Type t)` |
| | 45 | * if `t` is a struct type, return the symbolic tuple type obtained by invoking `computeDynamicType` recursively on the component types of `t` |
| | 46 | * if `t` is an array type or primitive type proceed analogously to `getDynamicType` |
| | 47 | * define a method in the `Evaluator`, `SymbolicExpression computeInitialValue(State s, LHSExpression expr, SymbolicType dynamicType);` |
| | 48 | * if `dynamicType` is a tuple type, create the concrete tuple of that type with each component obtained by evaluating `computeInitialValue(s, dotExpression(…), componentType)` |
| | 50 | * Evaluation of `DynamicTypeOf(t)` in a state `s` is defined by `computeDynamicType(s,t)` |
| | 51 | * Evaluation of `InitialValue[v]` is as follows: |
| | 52 | * let `t` be the (static) type of `v` |
| | 53 | * if `t` is primitive, return appropriate symbolic value (null expression, …) |
| | 54 | * else let `d` be `getDynamicType(s,t)` |
| | 55 | * return `computeInitialValue(s, v, d)` |