From d902818dd6e1db108bcc622adfeb8cbf79207fa8 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 17 Dec 2024 12:19:25 -0500 Subject: [PATCH 1/4] Construct evaluatedCode object in augmented assignment a bit later Wait until we actually need it, after we've checked for errors and user-defined methods. --- M2/Macaulay2/d/evaluate.d | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/M2/Macaulay2/d/evaluate.d b/M2/Macaulay2/d/evaluate.d index 503dc262b6..85af9f2581 100644 --- a/M2/Macaulay2/d/evaluate.d +++ b/M2/Macaulay2/d/evaluate.d @@ -1268,21 +1268,20 @@ augmentedAssignmentFun(x:augmentedAssignmentCode):Expr := ( is Nothing do nothing else return e) else lexpr = eval(x.lhs); - left := evaluatedCode(lexpr, dummyPosition); - when left.expr is e:Error do return Expr(e) else nothing; + when lexpr is e:Error do return lexpr else nothing; -- check if user-defined method exists - meth := lookup(Class(left.expr), - Expr(SymbolClosure(globalFrame, x.oper))); + meth := lookup(Class(lexpr), Expr(SymbolClosure(globalFrame, x.oper))); if meth != nullE then ( - rightexpr := eval(x.rhs); - when rightexpr is e:Error do return(e) else nothing; - r := applyEEE(meth, left.expr, rightexpr); + rexpr := eval(x.rhs); + when rexpr is e:Error do return rexpr else nothing; + r := applyEEE(meth, lexpr, rexpr); when r is s:SymbolClosure do ( if s.symbol.word.name === "Default" then nothing else return r) else return r); -- if not, use default behavior + left := evaluatedCode(lexpr, codePosition(x.lhs)); when x.lhs is y:globalMemoryReferenceCode do ( r := s.binary(Code(left), x.rhs); From 68877ee80459f47a788d4fd959451de729eaabbd Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 17 Dec 2024 12:43:14 -0500 Subject: [PATCH 2/4] Provide position for unimplemented augmented assignment Avoids having "dummy position" appear in the resulting error message. Also call "convert" on the left- and right-hand sides like we do in the other cases. --- M2/Macaulay2/d/convertr.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/M2/Macaulay2/d/convertr.d b/M2/Macaulay2/d/convertr.d index b3a9d3e722..252e462f9c 100644 --- a/M2/Macaulay2/d/convertr.d +++ b/M2/Macaulay2/d/convertr.d @@ -298,7 +298,7 @@ export convert0(e:ParseTree):Code := ( is t:Token do Code(augmentedAssignmentCode( b.Operator.entry, convert(b.lhs), convert(b.rhs), t.entry, pos)) else Code(augmentedAssignmentCode( - b.Operator.entry, dummyCode, dummyCode, dummySymbol, dummyPosition)) -- CHECK + b.Operator.entry, convert(b.lhs), convert(b.rhs), dummySymbol, pos)) ) else Code(binaryCode(b.Operator.entry.binary, convert(b.lhs), convert(b.rhs), pos)) ) From 434277a7d888a3ca96f06f3092cb50390f00d30e Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 17 Dec 2024 14:28:40 -0500 Subject: [PATCH 3/4] Don't bother casting Error back to Expr during augmented assignment We already have the Expr object we need! --- M2/Macaulay2/d/evaluate.d | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/d/evaluate.d b/M2/Macaulay2/d/evaluate.d index 85af9f2581..b267e6d1b0 100644 --- a/M2/Macaulay2/d/evaluate.d +++ b/M2/Macaulay2/d/evaluate.d @@ -1285,15 +1285,15 @@ augmentedAssignmentFun(x:augmentedAssignmentCode):Expr := ( when x.lhs is y:globalMemoryReferenceCode do ( r := s.binary(Code(left), x.rhs); - when r is e:Error do Expr(e) + when r is e:Error do r else globalAssignment(y.frameindex, x.info, r)) is y:localMemoryReferenceCode do ( r := s.binary(Code(left), x.rhs); - when r is e:Error do Expr(e) + when r is e:Error do r else localAssignment(y.nestingDepth, y.frameindex, r)) is y:threadMemoryReferenceCode do ( r := s.binary(Code(left), x.rhs); - when r is e:Error do Expr(e) + when r is e:Error do r else globalAssignment(y.frameindex, x.info, r)) is y:binaryCode do ( r := Code(binaryCode(s.binary, Code(left), x.rhs, dummyPosition)); From 40f5e52d10968b0a059d66168a6dfa22a21774a5 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Tue, 17 Dec 2024 14:30:46 -0500 Subject: [PATCH 4/4] Use current code position when making binaryCode in aug. assignment --- M2/Macaulay2/d/evaluate.d | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/M2/Macaulay2/d/evaluate.d b/M2/Macaulay2/d/evaluate.d index b267e6d1b0..29bb86293f 100644 --- a/M2/Macaulay2/d/evaluate.d +++ b/M2/Macaulay2/d/evaluate.d @@ -1296,17 +1296,17 @@ augmentedAssignmentFun(x:augmentedAssignmentCode):Expr := ( when r is e:Error do r else globalAssignment(y.frameindex, x.info, r)) is y:binaryCode do ( - r := Code(binaryCode(s.binary, Code(left), x.rhs, dummyPosition)); + r := Code(binaryCode(s.binary, Code(left), x.rhs, x.position)); if y.f == DotS.symbol.binary || y.f == SharpS.symbol.binary then AssignElemFun(y.lhs, y.rhs, r) else InstallValueFun(CodeSequence( convertGlobalOperator(x.info), y.lhs, y.rhs, r))) is y:adjacentCode do ( - r := Code(binaryCode(s.binary, Code(left), x.rhs, dummyPosition)); + r := Code(binaryCode(s.binary, Code(left), x.rhs, x.position)); InstallValueFun(CodeSequence( convertGlobalOperator(AdjacentS.symbol), y.lhs, y.rhs, r))) is y:unaryCode do ( - r := Code(binaryCode(s.binary, Code(left), x.rhs, dummyPosition)); + r := Code(binaryCode(s.binary, Code(left), x.rhs, x.position)); UnaryInstallValueFun(convertGlobalOperator(x.info), y.rhs, r)) else buildErrorPacket( "augmented assignment not implemented for this code")));