Преглед изворни кода

Fix filepath.rel allocation behaviour

gingerBill пре 1 година
родитељ
комит
4035a226da
1 измењених фајлова са 11 додато и 16 уклоњено
  1. 11 16
      core/path/filepath/path.odin

+ 11 - 16
core/path/filepath/path.odin

@@ -356,28 +356,24 @@ Relative_Error :: enum {
 */
 rel :: proc(base_path, target_path: string, allocator := context.allocator) -> (string, Relative_Error) {
 	context.allocator = allocator
-	base_clean, target_clean := clean(base_path), clean(target_path)
-
-	delete_target := true
-	defer {
-		if delete_target {
-			delete(target_clean)
-		}
-		delete(base_clean)
-	}
+	base_clean   := clean(base_path,   allocator)
+	target_clean := clean(target_path, allocator)
+	defer delete(base_clean,   allocator)
+	defer delete(target_clean, allocator)
 
 	if strings.equal_fold(target_clean, base_clean) {
-		return strings.clone("."), .None
+		return strings.clone(".", allocator), .None
 	}
 
-	base_vol, target_vol := volume_name(base_path), volume_name(target_path)
-	base := base_clean[len(base_vol):]
+	base_vol   := volume_name(base_path)
+	target_vol := volume_name(target_path)
+	base   := base_clean  [len(base_vol):]
 	target := target_clean[len(target_vol):]
 	if base == "." {
 		base = ""
 	}
 
-	base_slashed := len(base) > 0 && base[0] == SEPARATOR
+	base_slashed   := len(base)   > 0 && base  [0] == SEPARATOR
 	target_slashed := len(target) > 0 && target[0] == SEPARATOR
 	if base_slashed != target_slashed || !strings.equal_fold(base_vol, target_vol) {
 		return "", .Cannot_Relate
@@ -413,7 +409,7 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> (
 		if tl != t0 {
 			size += 1 + tl - t0
 		}
-		buf := make([]byte, size)
+		buf := make([]byte, size, allocator)
 		n := copy(buf, "..")
 		for _ in 0..<seps {
 			buf[n] = SEPARATOR
@@ -427,8 +423,7 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> (
 		return string(buf), .None
 	}
 
-	delete_target = false
-	return target[t0:], .None
+	return strings.clone(target[t0:], allocator), .None
 }
 
 /*