mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-01 04:10:07 +00:00
Use unaligned_load for regex virtual machine
This should hopefully avoid any issues with loading operands greater than 8 bits on alignment-sensitive platforms.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package regex_compiler
|
||||
|
||||
import "base:intrinsics"
|
||||
import "core:text/regex/common"
|
||||
import "core:text/regex/parser"
|
||||
import "core:text/regex/tokenizer"
|
||||
@@ -408,7 +409,7 @@ compile :: proc(tree: Node, flags: common.Flags) -> (code: Program, class_data:
|
||||
break add_global
|
||||
|
||||
case .Rune:
|
||||
operand := (cast(^rune)&code[pc+1])^
|
||||
operand := intrinsics.unaligned_load(cast(^rune)&code[pc+1])
|
||||
inject_at(&code, pc_open, Opcode.Wait_For_Rune)
|
||||
pc_open += size_of(Opcode)
|
||||
inject_raw(&code, pc_open, operand)
|
||||
@@ -490,20 +491,20 @@ compile :: proc(tree: Node, flags: common.Flags) -> (code: Program, class_data:
|
||||
case .Jump:
|
||||
jmp := cast(^i16)&code[pc+size_of(Opcode)]
|
||||
if code[cast(i16)pc+jmp^] == .Jump {
|
||||
next_jmp := (cast(^i16)&code[cast(i16)pc+jmp^+size_of(Opcode)])^
|
||||
next_jmp := intrinsics.unaligned_load(cast(^i16)&code[cast(i16)pc+jmp^+size_of(Opcode)])
|
||||
jmp^ = jmp^ + next_jmp
|
||||
do_another_pass = true
|
||||
}
|
||||
case .Split:
|
||||
jmp_x := cast(^i16)&code[pc+size_of(Opcode)]
|
||||
if code[cast(i16)pc+jmp_x^] == .Jump {
|
||||
next_jmp := (cast(^i16)&code[cast(i16)pc+jmp_x^+size_of(Opcode)])^
|
||||
next_jmp := intrinsics.unaligned_load(cast(^i16)&code[cast(i16)pc+jmp_x^+size_of(Opcode)])
|
||||
jmp_x^ = jmp_x^ + next_jmp
|
||||
do_another_pass = true
|
||||
}
|
||||
jmp_y := cast(^i16)&code[pc+size_of(Opcode)+size_of(i16)]
|
||||
if code[cast(i16)pc+jmp_y^] == .Jump {
|
||||
next_jmp := (cast(^i16)&code[cast(i16)pc+jmp_y^+size_of(Opcode)])^
|
||||
next_jmp := intrinsics.unaligned_load(cast(^i16)&code[cast(i16)pc+jmp_y^+size_of(Opcode)])
|
||||
jmp_y^ = jmp_y^ + next_jmp
|
||||
do_another_pass = true
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package regex_compiler
|
||||
|
||||
import "base:intrinsics"
|
||||
import "core:io"
|
||||
import "core:text/regex/common"
|
||||
import "core:text/regex/virtual_machine"
|
||||
@@ -9,11 +10,11 @@ get_jump_targets :: proc(code: []Opcode) -> (jump_targets: map[int]int) {
|
||||
for opcode, pc in virtual_machine.iterate_opcodes(&iter) {
|
||||
#partial switch opcode {
|
||||
case .Jump:
|
||||
jmp := cast(int)(cast(^u16)&code[pc+1])^
|
||||
jmp := cast(int)intrinsics.unaligned_load(cast(^u16)&code[pc+1])
|
||||
jump_targets[jmp] = pc
|
||||
case .Split:
|
||||
jmp_x := cast(int)(cast(^u16)&code[pc+1])^
|
||||
jmp_y := cast(int)(cast(^u16)&code[pc+3])^
|
||||
jmp_x := cast(int)intrinsics.unaligned_load(cast(^u16)&code[pc+1])
|
||||
jmp_y := cast(int)intrinsics.unaligned_load(cast(^u16)&code[pc+3])
|
||||
jump_targets[jmp_x] = pc
|
||||
jump_targets[jmp_y] = pc
|
||||
}
|
||||
@@ -46,18 +47,18 @@ trace :: proc(w: io.Writer, code: []Opcode) {
|
||||
operand := cast(rune)code[pc+1]
|
||||
io.write_encoded_rune(w, operand)
|
||||
case .Rune:
|
||||
operand := (cast(^rune)&code[pc+1])^
|
||||
operand := intrinsics.unaligned_load(cast(^rune)&code[pc+1])
|
||||
io.write_encoded_rune(w, operand)
|
||||
case .Rune_Class, .Rune_Class_Negated:
|
||||
operand := cast(u8)code[pc+1]
|
||||
common.write_padded_hex(w, operand, 2)
|
||||
case .Jump:
|
||||
jmp := (cast(^u16)&code[pc+1])^
|
||||
jmp := intrinsics.unaligned_load(cast(^u16)&code[pc+1])
|
||||
io.write_string(w, "-> $")
|
||||
common.write_padded_hex(w, jmp, 4)
|
||||
case .Split:
|
||||
jmp_x := (cast(^u16)&code[pc+1])^
|
||||
jmp_y := (cast(^u16)&code[pc+3])^
|
||||
jmp_x := intrinsics.unaligned_load(cast(^u16)&code[pc+1])
|
||||
jmp_y := intrinsics.unaligned_load(cast(^u16)&code[pc+3])
|
||||
io.write_string(w, "=> $")
|
||||
common.write_padded_hex(w, jmp_x, 4)
|
||||
io.write_string(w, ", $")
|
||||
|
||||
Reference in New Issue
Block a user