@@ -396,7 +396,7 @@ func (t *transpiler) evaluateFor(forStatement parser.For) error {
396396 return conv .ForEnd ()
397397}
398398
399- func (t * transpiler ) evaluateExpressionAssignment (assignedExpression parser.Expression ) (expressionResult , error ) {
399+ func (t * transpiler ) evaluateExpressionAssignment (assignedExpression parser.Expression , pointer bool ) (expressionResult , error ) {
400400 result , err := t .evaluateExpression (assignedExpression , true )
401401 value := result .firstValue ()
402402
@@ -408,32 +408,35 @@ func (t *transpiler) evaluateExpressionAssignment(assignedExpression parser.Expr
408408 if ! valueType .IsSlice () {
409409 switch evaluationType := valueType .Type ().(type ) {
410410 case parser.StructDefinition :
411- newStruct , err := t .converter .StructInitialization ([]StructValue {}, true )
411+ // Copy struct if it shall not be passed by reference.
412+ if ! pointer {
413+ newStruct , err := t .converter .StructInitialization ([]StructValue {}, true )
412414
413- if err != nil {
414- return expressionResult {}, err
415- }
415+ if err != nil {
416+ return expressionResult {}, err
417+ }
416418
417- // If expression is a struct, the values need to be copied to avoid manipulation of the original.
418- for _ , field := range evaluationType .Fields () {
419- fieldName := field .Name ()
420- fieldValue , err := t .converter .StructEvaluation (value , fieldName , true )
419+ // If expression is a struct, the values need to be copied to avoid manipulation of the original.
420+ for _ , field := range evaluationType .Fields () {
421+ fieldName := field .Name ()
422+ fieldValue , err := t .converter .StructEvaluation (value , fieldName , true )
421423
422- if err != nil {
423- return expressionResult {}, nil
424+ if err != nil {
425+ return expressionResult {}, nil
426+ }
427+ err = t .converter .StructAssignment (newStruct , fieldName , fieldValue , false )
428+
429+ if err != nil {
430+ return expressionResult {}, err
431+ }
424432 }
425- err = t .converter .StructAssignment (newStruct , fieldName , fieldValue , false )
433+ evaluatedValue , err : = t .converter .VarEvaluation (newStruct , true , false )
426434
427435 if err != nil {
428436 return expressionResult {}, err
429437 }
438+ value = evaluatedValue
430439 }
431- evaluatedValue , err := t .converter .VarEvaluation (newStruct , true , false )
432-
433- if err != nil {
434- return expressionResult {}, err
435- }
436- value = evaluatedValue
437440 }
438441 }
439442 return newExpressionResult (value ), nil
@@ -462,7 +465,7 @@ func (t *transpiler) evaluateConstDefinition(definition parser.ConstDefinition)
462465
463466func (t * transpiler ) evaluateVarDefinition (definition parser.VariableDefinitionValueAssignment ) error {
464467 for i , variable := range definition .Variables () {
465- result , err := t .evaluateExpressionAssignment (definition .Values ()[i ])
468+ result , err := t .evaluateExpressionAssignment (definition .Values ()[i ], false )
466469
467470 if err != nil {
468471 return err
@@ -503,7 +506,7 @@ func (t *transpiler) evaluateVarDefinitionCallAssignment(definition parser.Varia
503506
504507func (t * transpiler ) evaluateVarAssignment (assignment parser.VariableAssignmentValueAssignment ) error {
505508 for i , variable := range assignment .Variables () {
506- result , err := t .evaluateExpressionAssignment (assignment .Values ()[i ])
509+ result , err := t .evaluateExpressionAssignment (assignment .Values ()[i ], false )
507510
508511 if err != nil {
509512 return err
@@ -554,7 +557,7 @@ func (t *transpiler) evaluateSliceAssignment(assignment parser.SliceAssignment)
554557 return err
555558 }
556559 assignmentValue := assignment .Assignment ()
557- result , err := t .evaluateExpressionAssignment (assignmentValue )
560+ result , err := t .evaluateExpressionAssignment (assignmentValue , false )
558561
559562 if err != nil {
560563 return err
@@ -575,8 +578,8 @@ func (t *transpiler) evaluateStructAssignment(assignment parser.StructAssignment
575578 return err
576579 }
577580 fieldAssignment := assignment .Assignment ()
578- valueResult , err := t .evaluateExpressionAssignment (fieldAssignment .Value ())
579-
581+ valueResult , err := t .evaluateExpressionAssignment (fieldAssignment .Value (), false )
582+
580583 if err != nil {
581584 return err
582585 }
@@ -725,9 +728,10 @@ func (t *transpiler) evaluateFunctionDefinition(functionDefinition parser.Functi
725728func (t * transpiler ) evaluateFunctionCall (functionCall parser.FunctionCall , valueUsed bool ) (expressionResult , error ) {
726729 name := functionCall .Name ()
727730 args := []string {}
731+ params := functionCall .Params ()
728732
729- for _ , arg := range functionCall .Args () {
730- result , err := t .evaluateExpressionAssignment (arg )
733+ for i , arg := range functionCall .Args () {
734+ result , err := t .evaluateExpressionAssignment (arg , params [ i ]. Pointer () )
731735
732736 if err != nil {
733737 return expressionResult {}, err
@@ -783,7 +787,7 @@ func (t *transpiler) evaluateSliceInstantiation(instantiation parser.SliceInstan
783787 values := []string {}
784788
785789 for _ , expr := range instantiation .Values () {
786- result , err := t .evaluateExpressionAssignment (expr )
790+ result , err := t .evaluateExpressionAssignment (expr , false )
787791
788792 if err != nil {
789793 return expressionResult {}, err
@@ -802,7 +806,7 @@ func (t *transpiler) evaluateStructInitialization(definition parser.StructInitia
802806 values := []StructValue {}
803807
804808 for _ , value := range definition .Values () {
805- result , err := t .evaluateExpressionAssignment (value .Value ())
809+ result , err := t .evaluateExpressionAssignment (value .Value (), false )
806810
807811 if err != nil {
808812 return expressionResult {}, err
0 commit comments