diff --git a/src/main/java/org/perlonjava/codegen/EmitBinaryOperatorNode.java b/src/main/java/org/perlonjava/codegen/EmitBinaryOperatorNode.java index aafaf1445..98f582018 100644 --- a/src/main/java/org/perlonjava/codegen/EmitBinaryOperatorNode.java +++ b/src/main/java/org/perlonjava/codegen/EmitBinaryOperatorNode.java @@ -81,8 +81,8 @@ public static void emitBinaryOperatorNode(EmitterVisitor emitterVisitor, BinaryO "==", "!=", "eq", "ne" -> EmitOperatorChained.emitChainedComparison(emitterVisitor, node); // Binary operators - case "%", "&", "&.", "*", "**", "+", "-", "/", "^^", "xor", - "<<", "<=>", ">>", "^", "^.", "|", "|.", + case "%", "&", "&.", "binary&", "*", "**", "+", "-", "/", "^^", "xor", + "<<", "<=>", ">>", "^", "^.", "binary^", "|", "|.", "binary|", "bless", "cmp", "isa" -> EmitBinaryOperator.handleBinaryOperator(emitterVisitor, node, OperatorHandler.get(node.operator)); diff --git a/src/main/java/org/perlonjava/codegen/EmitOperator.java b/src/main/java/org/perlonjava/codegen/EmitOperator.java index f76ad5a76..7d7f099ee 100644 --- a/src/main/java/org/perlonjava/codegen/EmitOperator.java +++ b/src/main/java/org/perlonjava/codegen/EmitOperator.java @@ -893,7 +893,15 @@ static void handleCreateReference(EmitterVisitor emitterVisitor, OperatorNode no node.operand.accept(emitterVisitor.with(RuntimeContextType.LIST)); } } else { - node.operand.accept(emitterVisitor.with(RuntimeContextType.LIST)); + // For most cases, evaluate in SCALAR context to get a reference to the value + // Only use LIST context for actual list-producing operations + int contextType = RuntimeContextType.SCALAR; + if (node.operand instanceof ListNode || + (node.operand instanceof OperatorNode op && + (op.operator.equals("@") || op.operator.equals("%")))) { + contextType = RuntimeContextType.LIST; + } + node.operand.accept(emitterVisitor.with(contextType)); emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/perlonjava/runtime/RuntimeBase", "createReference",