@@ -630,13 +630,14 @@ static bool resolveContextualMethod(VM* pvm, ObjString* name, Value* result) {
630630 }
631631
632632 CASE_OP (OP_ADD ) {
633- if (performTensorArithmetic (vm , '+' )) { DISPATCH (); }
634- if (IS_STRING (peek (vm , 0 )) && IS_STRING (peek (vm , 1 ))) {
635- concatenate (vm );
636- } else if (IS_NUMBER (peek (vm , 0 )) && IS_NUMBER (peek (vm , 1 ))) {
633+ if (IS_NUMBER (peek (vm , 0 )) && IS_NUMBER (peek (vm , 1 ))) {
637634 double b = AS_NUMBER (pop (vm ));
638635 double a = AS_NUMBER (pop (vm ));
639636 PUSH (NUMBER_VAL (a + b ));
637+ } else if (IS_TENSOR (peek (vm , 0 )) || IS_TENSOR (peek (vm , 1 ))) {
638+ if (performTensorArithmetic (vm , '+' )) { DISPATCH (); }
639+ } else if (IS_STRING (peek (vm , 0 )) && IS_STRING (peek (vm , 1 ))) {
640+ concatenate (vm );
640641 } else if (IS_NUMBER (peek (vm , 0 )) && IS_STRING (peek (vm , 1 ))) {
641642 Value numVal = peek (vm , 0 );
642643 char buffer [32 ];
@@ -662,26 +663,44 @@ static bool resolveContextualMethod(VM* pvm, ObjString* name, Value* result) {
662663 }
663664
664665 CASE_OP (OP_SUBTRACT ) {
665- if (performTensorArithmetic (vm , '-' )) { DISPATCH (); }
666- double b = AS_NUMBER (pop (vm ));
667- double a = AS_NUMBER (pop (vm ));
668- PUSH (NUMBER_VAL (a - b ));
666+ if (IS_NUMBER (peek (vm , 0 )) && IS_NUMBER (peek (vm , 1 ))) {
667+ double b = AS_NUMBER (pop (vm ));
668+ double a = AS_NUMBER (pop (vm ));
669+ PUSH (NUMBER_VAL (a - b ));
670+ } else if (performTensorArithmetic (vm , '-' )) {
671+ DISPATCH ();
672+ } else {
673+ runtimeError (vm , "Operands must be numbers." );
674+ return INTERPRET_RUNTIME_ERROR ;
675+ }
669676 DISPATCH ();
670677 }
671678
672679 CASE_OP (OP_MULTIPLY ) {
673- if (performTensorArithmetic (vm , '*' )) { DISPATCH (); }
674- double b = AS_NUMBER (pop (vm ));
675- double a = AS_NUMBER (pop (vm ));
676- PUSH (NUMBER_VAL (a * b ));
680+ if (IS_NUMBER (peek (vm , 0 )) && IS_NUMBER (peek (vm , 1 ))) {
681+ double b = AS_NUMBER (pop (vm ));
682+ double a = AS_NUMBER (pop (vm ));
683+ PUSH (NUMBER_VAL (a * b ));
684+ } else if (performTensorArithmetic (vm , '*' )) {
685+ DISPATCH ();
686+ } else {
687+ runtimeError (vm , "Operands must be numbers." );
688+ return INTERPRET_RUNTIME_ERROR ;
689+ }
677690 DISPATCH ();
678691 }
679692
680693 CASE_OP (OP_DIVIDE ) {
681- if (performTensorArithmetic (vm , '/' )) { DISPATCH (); }
682- double b = AS_NUMBER (pop (vm ));
683- double a = AS_NUMBER (pop (vm ));
684- PUSH (NUMBER_VAL (a / b ));
694+ if (IS_NUMBER (peek (vm , 0 )) && IS_NUMBER (peek (vm , 1 ))) {
695+ double b = AS_NUMBER (pop (vm ));
696+ double a = AS_NUMBER (pop (vm ));
697+ PUSH (NUMBER_VAL (a / b ));
698+ } else if (performTensorArithmetic (vm , '/' )) {
699+ DISPATCH ();
700+ } else {
701+ runtimeError (vm , "Operands must be numbers." );
702+ return INTERPRET_RUNTIME_ERROR ;
703+ }
685704 DISPATCH ();
686705 }
687706
0 commit comments