@@ -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, .Contexts, true, STACK, LOCALS), Moved)
332
+ #projectedUpdate(makeProjectedUpdate(toLocal(I), OLDLOCAL, PROJECTIONS, .Contexts, STACK, LOCALS), Moved, true )
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 , TypedLocal )
406
- syntax ProjectedUpdate ::= makeProjectedUpdate(WriteTo, TypedLocal, ProjectionElems, Contexts, Bool, List, List) [function] // total
407
- | ProjectedUpdate(WriteTo, Contexts, Bool )
405
+ syntax KItem ::= #projectedUpdate ( ProjectedUpdate , TypedLocal , Bool )
406
+ syntax ProjectedUpdate ::= makeProjectedUpdate(WriteTo, TypedLocal, ProjectionElems, Contexts, List, List) [function] // total
407
+ | ProjectedUpdate(WriteTo, Contexts)
408
408
409
409
rule <k> #setLocalValue(place(local(I), PROJ), VAL)
410
- => #projectedUpdate(makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, PROJ, .Contexts, false, STACK, LOCALS), VAL)
410
+ => #projectedUpdate(makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, PROJ, .Contexts, STACK, LOCALS), VAL, false )
411
411
...
412
412
</k>
413
413
<stack> STACK </stack>
@@ -448,69 +448,63 @@ 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, CTXTS, FORCE , STACK, LOCALS)
452
- => makeProjectedUpdate(DEST, {ARGS[I]}:>TypedLocal, PROJS, CtxField(TY, IDX, ARGS, I) CTXTS, FORCE , STACK, LOCALS)
451
+ rule makeProjectedUpdate(DEST, typedValue(Aggregate(IDX, ARGS), TY, _ ), projectionElemField(fieldIdx(I), _) PROJS, CTXTS, STACK, LOCALS)
452
+ => makeProjectedUpdate(DEST, {ARGS[I]}:>TypedLocal, PROJS, CtxField(TY, IDX, ARGS, I) CTXTS, STACK, LOCALS)
453
453
requires 0 <=Int I
454
454
andBool I <Int size(ARGS)
455
455
andBool isTypedLocal(ARGS[I])
456
- andBool (FORCE orBool MUT ==K mutabilityMut)
457
456
[preserves-definedness] // valid list indexing checked
458
457
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)
458
+ rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, _ ), projectionElemIndex(local(LOCAL)) PROJS, CTXTS, STACK, LOCALS)
459
+ => makeProjectedUpdate(DEST, {ELEMENTS[#expectUsize({LOCALS[LOCAL]}:>TypedValue)]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, #expectUsize({LOCALS[LOCAL]}:>TypedValue)) CTXTS, STACK, LOCALS)
461
460
requires 0 <=Int LOCAL
462
461
andBool LOCAL <Int size(LOCALS)
463
462
andBool isTypedValue(LOCALS[LOCAL])
464
463
andBool isInt(#expectUsize({LOCALS[LOCAL]}:>TypedValue))
465
464
andBool 0 <=Int #expectUsize({LOCALS[LOCAL]}:>TypedValue)
466
465
andBool #expectUsize({LOCALS[LOCAL]}:>TypedValue) <Int size(ELEMENTS)
467
466
andBool isTypedValue(ELEMENTS[#expectUsize({LOCALS[LOCAL]}:>TypedValue)])
468
- andBool (FORCE orBool MUT ==K mutabilityMut)
469
467
[preserves-definedness] // index checked, valid Int can be read, ELEMENT indexable and writeable or forced
470
468
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)
469
+ rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, _ ), projectionElemConstantIndex(OFFSET:Int, _MINLEN, false) PROJS, CTXTS, STACK, LOCALS)
470
+ => makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, OFFSET) CTXTS, STACK, LOCALS)
473
471
requires 0 <=Int OFFSET
474
472
andBool OFFSET <Int size(ELEMENTS)
475
473
andBool isTypedValue(ELEMENTS[OFFSET])
476
- andBool (FORCE orBool MUT ==K mutabilityMut)
477
474
[preserves-definedness] // ELEMENT indexable and writeable or forced
478
475
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)
476
+ rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, _ ), projectionElemConstantIndex(OFFSET:Int, MINLEN, true) PROJS, CTXTS, STACK, LOCALS)
477
+ => makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, MINLEN -Int OFFSET) CTXTS, STACK, LOCALS)
481
478
requires 0 <Int OFFSET
482
479
andBool OFFSET <=Int MINLEN
483
480
andBool MINLEN ==Int size(ELEMENTS) // assumed for valid MIR code
484
481
andBool isTypedValue(ELEMENTS[MINLEN -Int OFFSET])
485
- andBool (FORCE orBool MUT ==K mutabilityMut)
486
482
[preserves-definedness] // ELEMENT indexable and writeable or forced
487
483
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)
484
+ rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(LOCAL, PLACEPROJ), _ ), _, _), projectionElemDeref PROJS, _CTXTS, STACK, LOCALS)
485
+ => makeProjectedUpdate(toStack(OFFSET, LOCAL), #localFromFrame({STACK[OFFSET -Int 1]}:>StackFrame, LOCAL, OFFSET), appendP(PLACEPROJ, PROJS), .Contexts, STACK, LOCALS)
490
486
requires 0 <Int OFFSET
491
487
andBool OFFSET <=Int size(STACK)
492
488
andBool isStackFrame(STACK[OFFSET -Int 1])
493
- andBool (FORCE orBool MUT ==K mutabilityMut)
494
489
[preserves-definedness]
495
490
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)
491
+ rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(local(I), PLACEPROJ), _ ), _, _), projectionElemDeref PROJS, _CTXTS, STACK, LOCALS)
492
+ => makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, appendP(PLACEPROJ, PROJS), .Contexts, STACK, LOCALS)
498
493
requires OFFSET ==Int 0
499
494
andBool 0 <=Int I
500
495
andBool I <Int size(LOCALS)
501
- andBool (FORCE orBool MUT ==K mutabilityMut)
502
496
[preserves-definedness]
503
497
504
- rule makeProjectedUpdate(DEST, _:TypedValue, .ProjectionElems, CONTEXTS, FORCE, _, _)
505
- => ProjectedUpdate(DEST, CONTEXTS, FORCE )
498
+ rule makeProjectedUpdate(DEST, _:TypedValue, .ProjectionElems, CONTEXTS, _, _)
499
+ => ProjectedUpdate(DEST, CONTEXTS)
506
500
507
- rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS, false ), NEW)
501
+ rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS), NEW, false )
508
502
=> #setLocalValue(place(local(I), .ProjectionElems), #buildUpdate(NEW, CONTEXTS))
509
503
...
510
504
</k>
511
505
[preserves-definedness] // valid conmtext ensured upon context construction
512
506
513
- rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS, true ), NEW)
507
+ rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS), NEW, true )
514
508
=> #forceSetLocal(local(I), #buildUpdate(NEW, CONTEXTS))
515
509
...
516
510
</k>
@@ -525,7 +519,7 @@ The solution is to use rewrite operations in a downward pass through the project
525
519
andBool I <Int size(LOCALS)
526
520
[preserves-definedness] // valid list indexing checked
527
521
528
- rule <k> #projectedUpdate(ProjectedUpdate(toStack(FRAME, local(I)), CONTEXTS, _ ), NEW) => .K ... </k>
522
+ rule <k> #projectedUpdate(ProjectedUpdate(toStack(FRAME, local(I)), CONTEXTS), NEW, _ ) => .K ... </k>
529
523
<stack> STACK => STACK[(FRAME -Int 1) <- #updateStackLocal({STACK[FRAME -Int 1]}:>StackFrame, I, #buildUpdate(NEW, CONTEXTS)) ] </stack>
530
524
requires 0 <Int FRAME
531
525
andBool FRAME <=Int size(STACK)
0 commit comments