@@ -329,7 +329,7 @@ In contrast to regular write operations, the value does not have to be _mutable_
329
329
330
330
rule <k> VAL:TypedLocal ~> #markMoved(OLDLOCAL, local(I), PROJECTIONS) ~> CONT
331
331
=>
332
- #projectedUpdate(makeProjectedUpdate(toLocal(I), OLDLOCAL, PROJECTIONS, Moved, .Contexts, true, STACK, LOCALS))
332
+ #projectedUpdate(makeProjectedUpdate(toLocal(I), OLDLOCAL, PROJECTIONS, .Contexts, true, STACK, LOCALS), Moved )
333
333
~> VAL
334
334
~> CONT
335
335
</k>
@@ -402,12 +402,12 @@ The `#setLocalValue` operation writes a `TypedLocal` value to a given `Place` wi
402
402
Write operations to places that include (a chain of) projections are handled by a special rewrite symbol ` #projectedUpdate ` .
403
403
404
404
``` k
405
- syntax KItem ::= #projectedUpdate ( ProjectedUpdate )
406
- syntax ProjectedUpdate ::= makeProjectedUpdate(WriteTo, TypedLocal, ProjectionElems, TypedLocal, Contexts, Bool, List, List) [function] // total
407
- | ProjectedUpdate(WriteTo, TypedLocal, TypedLocal, Contexts, Bool)
405
+ syntax KItem ::= #projectedUpdate ( ProjectedUpdate , TypedLocal )
406
+ syntax ProjectedUpdate ::= makeProjectedUpdate(WriteTo, TypedLocal, ProjectionElems, Contexts, Bool, List, List) [function] // total
407
+ | ProjectedUpdate(WriteTo, Contexts, Bool)
408
408
409
409
rule <k> #setLocalValue(place(local(I), PROJ), VAL)
410
- => #projectedUpdate(makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, PROJ, VAL, .Contexts, false, STACK, LOCALS))
410
+ => #projectedUpdate(makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, PROJ, .Contexts, false, STACK, LOCALS), VAL )
411
411
...
412
412
</k>
413
413
<stack> STACK </stack>
@@ -448,16 +448,16 @@ The solution is to use rewrite operations in a downward pass through the project
448
448
=> #buildUpdate(typedValue(Range(ELEMS[I <- VAL]), TY, mutabilityMut), CTXS)
449
449
[preserves-definedness] // valid list indexing checked upon context construction
450
450
451
- rule makeProjectedUpdate(DEST, typedValue(Aggregate(IDX, ARGS), TY, MUT), projectionElemField(fieldIdx(I), _) PROJS, UPDATE, CTXTS, FORCE, STACK, LOCALS)
452
- => makeProjectedUpdate(DEST, {ARGS[I]}:>TypedLocal, PROJS, UPDATE, CtxField(TY, IDX, ARGS, I) CTXTS, FORCE, STACK, LOCALS)
451
+ rule makeProjectedUpdate(DEST, typedValue(Aggregate(IDX, ARGS), TY, MUT), projectionElemField(fieldIdx(I), _) PROJS, CTXTS, FORCE, STACK, LOCALS)
452
+ => makeProjectedUpdate(DEST, {ARGS[I]}:>TypedLocal, PROJS, CtxField(TY, IDX, ARGS, I) CTXTS, FORCE, STACK, LOCALS)
453
453
requires 0 <=Int I
454
454
andBool I <Int size(ARGS)
455
455
andBool isTypedLocal(ARGS[I])
456
456
andBool (FORCE orBool MUT ==K mutabilityMut)
457
457
[preserves-definedness] // valid list indexing checked
458
458
459
- rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemIndex(local(LOCAL)) PROJS, UPDATE, CTXTS, FORCE, STACK, LOCALS)
460
- => makeProjectedUpdate(DEST, {ELEMENTS[#expectUsize({LOCALS[LOCAL]}:>TypedValue)]}:>TypedValue, PROJS, UPDATE, CtxIndex(TY, ELEMENTS, #expectUsize({LOCALS[LOCAL]}:>TypedValue)) CTXTS, FORCE, STACK, LOCALS)
459
+ rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemIndex(local(LOCAL)) PROJS, CTXTS, FORCE, STACK, LOCALS)
460
+ => makeProjectedUpdate(DEST, {ELEMENTS[#expectUsize({LOCALS[LOCAL]}:>TypedValue)]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, #expectUsize({LOCALS[LOCAL]}:>TypedValue)) CTXTS, FORCE, STACK, LOCALS)
461
461
requires 0 <=Int LOCAL
462
462
andBool LOCAL <Int size(LOCALS)
463
463
andBool isTypedValue(LOCALS[LOCAL])
@@ -468,49 +468,49 @@ The solution is to use rewrite operations in a downward pass through the project
468
468
andBool (FORCE orBool MUT ==K mutabilityMut)
469
469
[preserves-definedness] // index checked, valid Int can be read, ELEMENT indexable and writeable or forced
470
470
471
- rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemConstantIndex(OFFSET:Int, _MINLEN, false) PROJS, UPDATE, CTXTS, FORCE, STACK, LOCALS)
472
- => makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, UPDATE, CtxIndex(TY, ELEMENTS, OFFSET) CTXTS, FORCE, STACK, LOCALS)
471
+ rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemConstantIndex(OFFSET:Int, _MINLEN, false) PROJS, CTXTS, FORCE, STACK, LOCALS)
472
+ => makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, OFFSET) CTXTS, FORCE, STACK, LOCALS)
473
473
requires 0 <=Int OFFSET
474
474
andBool OFFSET <Int size(ELEMENTS)
475
475
andBool isTypedValue(ELEMENTS[OFFSET])
476
476
andBool (FORCE orBool MUT ==K mutabilityMut)
477
477
[preserves-definedness] // ELEMENT indexable and writeable or forced
478
478
479
- rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemConstantIndex(OFFSET:Int, MINLEN, true) PROJS, UPDATE, CTXTS, FORCE, STACK, LOCALS)
480
- => makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, UPDATE, CtxIndex(TY, ELEMENTS, MINLEN -Int OFFSET) CTXTS, FORCE, STACK, LOCALS)
479
+ rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemConstantIndex(OFFSET:Int, MINLEN, true) PROJS, CTXTS, FORCE, STACK, LOCALS)
480
+ => makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, MINLEN -Int OFFSET) CTXTS, FORCE, STACK, LOCALS)
481
481
requires 0 <Int OFFSET
482
482
andBool OFFSET <=Int MINLEN
483
483
andBool MINLEN ==Int size(ELEMENTS) // assumed for valid MIR code
484
484
andBool isTypedValue(ELEMENTS[MINLEN -Int OFFSET])
485
485
andBool (FORCE orBool MUT ==K mutabilityMut)
486
486
[preserves-definedness] // ELEMENT indexable and writeable or forced
487
487
488
- rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(LOCAL, PLACEPROJ), MUT), _, _), projectionElemDeref PROJS, UPDATE, _CTXTS, FORCE, STACK, LOCALS)
489
- => makeProjectedUpdate(toStack(OFFSET, LOCAL), #localFromFrame({STACK[OFFSET -Int 1]}:>StackFrame, LOCAL, OFFSET), appendP(PLACEPROJ, PROJS), UPDATE, .Contexts, FORCE, STACK, LOCALS)
488
+ rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(LOCAL, PLACEPROJ), MUT), _, _), projectionElemDeref PROJS, _CTXTS, FORCE, STACK, LOCALS)
489
+ => makeProjectedUpdate(toStack(OFFSET, LOCAL), #localFromFrame({STACK[OFFSET -Int 1]}:>StackFrame, LOCAL, OFFSET), appendP(PLACEPROJ, PROJS), .Contexts, FORCE, STACK, LOCALS)
490
490
requires 0 <Int OFFSET
491
491
andBool OFFSET <=Int size(STACK)
492
492
andBool isStackFrame(STACK[OFFSET -Int 1])
493
493
andBool (FORCE orBool MUT ==K mutabilityMut)
494
494
[preserves-definedness]
495
495
496
- rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(local(I), PLACEPROJ), MUT), _, _), projectionElemDeref PROJS, UPDATE, _CTXTS, FORCE, STACK, LOCALS)
497
- => makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, appendP(PLACEPROJ, PROJS), UPDATE, .Contexts, FORCE, STACK, LOCALS)
496
+ rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(local(I), PLACEPROJ), MUT), _, _), projectionElemDeref PROJS, _CTXTS, FORCE, STACK, LOCALS)
497
+ => makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, appendP(PLACEPROJ, PROJS), .Contexts, FORCE, STACK, LOCALS)
498
498
requires OFFSET ==Int 0
499
499
andBool 0 <=Int I
500
500
andBool I <Int size(LOCALS)
501
501
andBool (FORCE orBool MUT ==K mutabilityMut)
502
502
[preserves-definedness]
503
503
504
- rule makeProjectedUpdate(DEST, TV :TypedValue, .ProjectionElems, NEW , CONTEXTS, FORCE, _, _)
505
- => ProjectedUpdate(DEST, TV, NEW, CONTEXTS, FORCE)
504
+ rule makeProjectedUpdate(DEST, _ :TypedValue, .ProjectionElems, CONTEXTS, FORCE, _, _)
505
+ => ProjectedUpdate(DEST, CONTEXTS, FORCE)
506
506
507
- rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), _ORIGINAL, NEW, CONTEXTS, false))
507
+ rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS, false), NEW )
508
508
=> #setLocalValue(place(local(I), .ProjectionElems), #buildUpdate(NEW, CONTEXTS))
509
509
...
510
510
</k>
511
511
[preserves-definedness] // valid conmtext ensured upon context construction
512
512
513
- rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), _ORIGINAL, NEW, CONTEXTS, true))
513
+ rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS, true), NEW )
514
514
=> #forceSetLocal(local(I), #buildUpdate(NEW, CONTEXTS))
515
515
...
516
516
</k>
@@ -525,7 +525,7 @@ The solution is to use rewrite operations in a downward pass through the project
525
525
andBool I <Int size(LOCALS)
526
526
[preserves-definedness] // valid list indexing checked
527
527
528
- rule <k> #projectedUpdate(ProjectedUpdate(toStack(FRAME, local(I)), _ORIGINAL, NEW, CONTEXTS, _)) => .K ... </k>
528
+ rule <k> #projectedUpdate(ProjectedUpdate(toStack(FRAME, local(I)), CONTEXTS, _), NEW ) => .K ... </k>
529
529
<stack> STACK => STACK[(FRAME -Int 1) <- #updateStackLocal({STACK[FRAME -Int 1]}:>StackFrame, I, #buildUpdate(NEW, CONTEXTS)) ] </stack>
530
530
requires 0 <Int FRAME
531
531
andBool FRAME <=Int size(STACK)
0 commit comments