Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ jobs:
run: make ci
env:
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
# Windows timeout.exe only sleeps; Git for Windows supplies GNU timeout.exe.
PERLONJAVA_TIMEOUT_COMMAND: 'C:\Program Files\Git\usr\bin\timeout.exe'

- name: Run focused Perl thread gate (Windows)
id: threads-windows
Expand Down
3 changes: 3 additions & 0 deletions docs/about/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ priorities and future plans.

## Work in progress

- Restore Perl-compatible integer increment/decrement semantics, imprecision
warnings, numeric overload fallback, and postfix-reference lifetime handling.

- Preserve Perl control-verb boundaries through nested common-prefix regex
alternatives, restoring `re/regexp.t` compatibility on both backends.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2420,6 +2420,18 @@ private static RuntimeList execute(SuspendedInterpreterFrame frame) {
pc = OpcodeHandlerExtended.executePostAutoDecrement(bytecode, pc, registers);
}

case Opcodes.INTEGER_PRE_AUTOINCREMENT ->
pc = OpcodeHandlerExtended.executeIntegerPreAutoIncrement(bytecode, pc, registers);

case Opcodes.INTEGER_POST_AUTOINCREMENT ->
pc = OpcodeHandlerExtended.executeIntegerPostAutoIncrement(bytecode, pc, registers);

case Opcodes.INTEGER_PRE_AUTODECREMENT ->
pc = OpcodeHandlerExtended.executeIntegerPreAutoDecrement(bytecode, pc, registers);

case Opcodes.INTEGER_POST_AUTODECREMENT ->
pc = OpcodeHandlerExtended.executeIntegerPostAutoDecrement(bytecode, pc, registers);

// =================================================================
// ERROR HANDLING
// =================================================================
Expand Down
15 changes: 11 additions & 4 deletions src/main/java/org/perlonjava/backend/bytecode/CompileOperator.java
Original file line number Diff line number Diff line change
Expand Up @@ -836,6 +836,13 @@ private static void visitFileTestOp(BytecodeCompiler bc, OperatorNode node, Stri
private static void visitIncrDecr(BytecodeCompiler bc, OperatorNode node, String op) {
boolean isPostfix = op.endsWith("postfix");
boolean isIncrement = op.startsWith("++");
short autoOpcode = bc.isIntegerEnabled()
? (isIncrement
? (isPostfix ? Opcodes.INTEGER_POST_AUTOINCREMENT : Opcodes.INTEGER_PRE_AUTOINCREMENT)
: (isPostfix ? Opcodes.INTEGER_POST_AUTODECREMENT : Opcodes.INTEGER_PRE_AUTODECREMENT))
: (isIncrement
? (isPostfix ? Opcodes.POST_AUTOINCREMENT : Opcodes.PRE_AUTOINCREMENT)
: (isPostfix ? Opcodes.POST_AUTODECREMENT : Opcodes.PRE_AUTODECREMENT));
Node operand = node.operand;
while (operand instanceof ListNode list && list.elements.size() == 1) {
operand = list.elements.getFirst();
Expand All @@ -850,12 +857,12 @@ private static void visitIncrDecr(BytecodeCompiler bc, OperatorNode node, String
int varReg = bc.getVariableRegister(varName);
if (isPostfix) {
int resultReg = bc.allocateRegister();
bc.emit(isIncrement ? Opcodes.POST_AUTOINCREMENT : Opcodes.POST_AUTODECREMENT);
bc.emit(autoOpcode);
bc.emitReg(resultReg);
bc.emitReg(varReg);
bc.lastResultReg = resultReg;
} else {
bc.emit(isIncrement ? Opcodes.PRE_AUTOINCREMENT : Opcodes.PRE_AUTODECREMENT);
bc.emit(autoOpcode);
bc.emitReg(varReg);
bc.lastResultReg = varReg;
}
Expand All @@ -866,12 +873,12 @@ private static void visitIncrDecr(BytecodeCompiler bc, OperatorNode node, String
int operandReg = bc.lastResultReg;
if (isPostfix) {
int resultReg = bc.allocateRegister();
bc.emit(isIncrement ? Opcodes.POST_AUTOINCREMENT : Opcodes.POST_AUTODECREMENT);
bc.emit(autoOpcode);
bc.emitReg(resultReg);
bc.emitReg(operandReg);
bc.lastResultReg = resultReg;
} else {
bc.emit(isIncrement ? Opcodes.PRE_AUTOINCREMENT : Opcodes.PRE_AUTODECREMENT);
bc.emit(autoOpcode);
bc.emitReg(operandReg);
bc.lastResultReg = operandReg;
}
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/org/perlonjava/backend/bytecode/Disassemble.java
Original file line number Diff line number Diff line change
Expand Up @@ -940,6 +940,24 @@ public static String disassemble(InterpretedCode interpretedCode) {
int postDecSrc = interpretedCode.bytecode[pc++];
sb.append("POST_AUTODECREMENT r").append(rd).append(" = r").append(postDecSrc).append("--\n");
break;
case Opcodes.INTEGER_PRE_AUTOINCREMENT:
rd = interpretedCode.bytecode[pc++];
sb.append("INTEGER_PRE_AUTOINCREMENT ++r").append(rd).append("\n");
break;
case Opcodes.INTEGER_POST_AUTOINCREMENT:
rd = interpretedCode.bytecode[pc++];
int integerPostIncSrc = interpretedCode.bytecode[pc++];
sb.append("INTEGER_POST_AUTOINCREMENT r").append(rd).append(" = r").append(integerPostIncSrc).append("++\n");
break;
case Opcodes.INTEGER_PRE_AUTODECREMENT:
rd = interpretedCode.bytecode[pc++];
sb.append("INTEGER_PRE_AUTODECREMENT --r").append(rd).append("\n");
break;
case Opcodes.INTEGER_POST_AUTODECREMENT:
rd = interpretedCode.bytecode[pc++];
int integerPostDecSrc = interpretedCode.bytecode[pc++];
sb.append("INTEGER_POST_AUTODECREMENT r").append(rd).append(" = r").append(integerPostDecSrc).append("--\n");
break;
case Opcodes.PRINT: {
int contentReg = interpretedCode.bytecode[pc++];
int filehandleReg = interpretedCode.bytecode[pc++];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -895,6 +895,48 @@ public static int executePostAutoDecrement(int[] bytecode, int pc, RuntimeBase[]
return pc;
}

public static int executeIntegerPreAutoIncrement(int[] bytecode, int pc, RuntimeBase[] registers) {
int rd = bytecode[pc++];
registers[rd] = scalarIncrementOperand(registers[rd]);
if (BytecodeInterpreter.isImmutableProxy(registers[rd])) {
registers[rd] = BytecodeInterpreter.ensureMutableScalar(registers[rd]);
}
((RuntimeScalar) registers[rd]).integerPreAutoIncrement();
return pc;
}

public static int executeIntegerPostAutoIncrement(int[] bytecode, int pc, RuntimeBase[] registers) {
int rd = bytecode[pc++];
int rs = bytecode[pc++];
registers[rs] = scalarIncrementOperand(registers[rs]);
if (BytecodeInterpreter.isImmutableProxy(registers[rs])) {
registers[rs] = BytecodeInterpreter.ensureMutableScalar(registers[rs]);
}
registers[rd] = ((RuntimeScalar) registers[rs]).integerPostAutoIncrement();
return pc;
}

public static int executeIntegerPreAutoDecrement(int[] bytecode, int pc, RuntimeBase[] registers) {
int rd = bytecode[pc++];
registers[rd] = scalarIncrementOperand(registers[rd]);
if (BytecodeInterpreter.isImmutableProxy(registers[rd])) {
registers[rd] = BytecodeInterpreter.ensureMutableScalar(registers[rd]);
}
((RuntimeScalar) registers[rd]).integerPreAutoDecrement();
return pc;
}

public static int executeIntegerPostAutoDecrement(int[] bytecode, int pc, RuntimeBase[] registers) {
int rd = bytecode[pc++];
int rs = bytecode[pc++];
registers[rs] = scalarIncrementOperand(registers[rs]);
if (BytecodeInterpreter.isImmutableProxy(registers[rs])) {
registers[rs] = BytecodeInterpreter.ensureMutableScalar(registers[rs]);
}
registers[rd] = ((RuntimeScalar) registers[rs]).integerPostAutoDecrement();
return pc;
}

/**
* Execute open operation.
* Format: OPEN rd ctx argsReg
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/org/perlonjava/backend/bytecode/Opcodes.java
Original file line number Diff line number Diff line change
Expand Up @@ -2539,6 +2539,18 @@ public class Opcodes {
/** Alias a package hash slot to a hash register. Format: nameStringIdx hashReg. */
public static final short ALIAS_GLOBAL_HASH = 551;

/** Native-IV pre-increment under lexical {@code use integer}. */
public static final short INTEGER_PRE_AUTOINCREMENT = 556;

/** Native-IV post-increment under lexical {@code use integer}. */
public static final short INTEGER_POST_AUTOINCREMENT = 557;

/** Native-IV pre-decrement under lexical {@code use integer}. */
public static final short INTEGER_PRE_AUTODECREMENT = 558;

/** Native-IV post-decrement under lexical {@code use integer}. */
public static final short INTEGER_POST_AUTODECREMENT = 559;

/**
* Resolve a statically named CODE reference at runtime. This preserves the
* current CV snapshot while allowing an earlier runtime glob assignment in
Expand Down
Loading
Loading