Forráskód Böngészése

Force file copy on `odin strip-semicolon`

gingerBill 4 éve
szülő
commit
05ac2002e0
3 módosított fájl, 71 hozzáadás és 68 törlés
  1. 63 63
      src/common.cpp
  2. 2 1
      src/parser.cpp
  3. 6 4
      src/tokenizer.cpp

+ 63 - 63
src/common.cpp

@@ -868,76 +868,77 @@ enum MemoryMappedFileError {
 	MemoryMappedFile_COUNT,
 };
 
-MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile *memory_mapped_file) {
+MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile *memory_mapped_file, bool copy_file_contents) {
 	MemoryMappedFileError err = MemoryMappedFile_None;
 	
-#if defined(GB_SYSTEM_WINDOWS)
-	isize w_len = 0;
-	wchar_t *w_str = gb__alloc_utf8_to_ucs2(temporary_allocator(), fullpath, &w_len);
-	if (w_str == nullptr) {
-		return MemoryMappedFile_Invalid;
-	}
-	i64 file_size = 0;
-	LARGE_INTEGER li_file_size = {};
-	HANDLE handle = nullptr;
-	HANDLE file_mapping = nullptr;
-	void *file_data = nullptr;
-	
-	handle = CreateFileW(w_str, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
-	if (handle == INVALID_HANDLE_VALUE) {
-		handle = nullptr;
-		goto window_handle_file_error;
-	}
-	
-	li_file_size = {};
-	if (!GetFileSizeEx(handle, &li_file_size)) {
-		goto window_handle_file_error;
-	}
-	file_size = cast(i64)li_file_size.QuadPart;
-	if (file_size > I32_MAX) {
-		CloseHandle(handle);
-		return MemoryMappedFile_FileTooLarge;
-	}
-	
-	if (file_size == 0) {
+	if (!copy_file_contents) {
+	#if defined(GB_SYSTEM_WINDOWS)
+		isize w_len = 0;
+		wchar_t *w_str = gb__alloc_utf8_to_ucs2(temporary_allocator(), fullpath, &w_len);
+		if (w_str == nullptr) {
+			return MemoryMappedFile_Invalid;
+		}
+		i64 file_size = 0;
+		LARGE_INTEGER li_file_size = {};
+		HANDLE handle = nullptr;
+		HANDLE file_mapping = nullptr;
+		void *file_data = nullptr;
+		
+		handle = CreateFileW(w_str, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
+		if (handle == INVALID_HANDLE_VALUE) {
+			handle = nullptr;
+			goto window_handle_file_error;
+		}
+		
+		li_file_size = {};
+		if (!GetFileSizeEx(handle, &li_file_size)) {
+			goto window_handle_file_error;
+		}
+		file_size = cast(i64)li_file_size.QuadPart;
+		if (file_size > I32_MAX) {
+			CloseHandle(handle);
+			return MemoryMappedFile_FileTooLarge;
+		}
+		
+		if (file_size == 0) {
+			CloseHandle(handle);
+			err = MemoryMappedFile_Empty;
+			memory_mapped_file->handle = nullptr;
+			memory_mapped_file->data   = nullptr;
+			memory_mapped_file->size   = 0;
+			return err;
+		}
+		
+		file_mapping = CreateFileMappingW(handle, nullptr, PAGE_READONLY, 0, 0, nullptr);
 		CloseHandle(handle);
-		err = MemoryMappedFile_Empty;
-		memory_mapped_file->handle = nullptr;
-		memory_mapped_file->data   = nullptr;
-		memory_mapped_file->size   = 0;
+		
+		file_data = MapViewOfFileEx(file_mapping, FILE_MAP_READ, 0, 0, 0/*file_size*/, nullptr/*base address*/);
+		memory_mapped_file->handle = cast(void *)file_mapping;
+		memory_mapped_file->data = file_data;
+		memory_mapped_file->size = cast(i32)file_size;
 		return err;
-	}
-	
-	file_mapping = CreateFileMappingW(handle, nullptr, PAGE_READONLY, 0, 0, nullptr);
-	CloseHandle(handle);
-	
-	file_data = MapViewOfFileEx(file_mapping, FILE_MAP_READ, 0, 0, 0/*file_size*/, nullptr/*base address*/);
-	memory_mapped_file->handle = cast(void *)file_mapping;
-	memory_mapped_file->data = file_data;
-	memory_mapped_file->size = cast(i32)file_size;
-	return err;
 	
-window_handle_file_error:;
-	{
-		DWORD handle_err = GetLastError();
-		CloseHandle(handle);
-		err = MemoryMappedFile_Invalid;
-		switch (handle_err) {
-		case ERROR_FILE_NOT_FOUND: 
-		case ERROR_PATH_NOT_FOUND: 
-		case ERROR_INVALID_DRIVE:
-			err = MemoryMappedFile_NotExists; 
-			break;
-		case ERROR_ACCESS_DENIED: 
-		case ERROR_INVALID_ACCESS:
-			err = MemoryMappedFile_Permission;
-			break;
+	window_handle_file_error:;
+		{
+			DWORD handle_err = GetLastError();
+			CloseHandle(handle);
+			err = MemoryMappedFile_Invalid;
+			switch (handle_err) {
+			case ERROR_FILE_NOT_FOUND: 
+			case ERROR_PATH_NOT_FOUND: 
+			case ERROR_INVALID_DRIVE:
+				err = MemoryMappedFile_NotExists; 
+				break;
+			case ERROR_ACCESS_DENIED: 
+			case ERROR_INVALID_ACCESS:
+				err = MemoryMappedFile_Permission;
+				break;
+			}
+			return err;
 		}
-		return err;
+	#endif
 	}
 	
-#else
-	// TODO(bill): Memory map rather than copy contents
 	gbFileContents fc = gb_file_read_contents(heap_allocator(), true, fullpath);
 
 	if (fc.size > I32_MAX) {
@@ -963,7 +964,6 @@ window_handle_file_error:;
 		}
 	}
 	return err;
-#endif
 }
 
 

+ 2 - 1
src/parser.cpp

@@ -4645,7 +4645,8 @@ ParseFileError init_ast_file(AstFile *f, String fullpath, TokenPos *err_pos) {
 	zero_item(&f->tokenizer);
 	f->tokenizer.curr_file_id = f->id;
 
-	TokenizerInitError err = init_tokenizer_from_fullpath(&f->tokenizer, f->fullpath);
+	bool copy_file_contents = build_context.command_kind == Command_strip_semicolon;
+	TokenizerInitError err = init_tokenizer_from_fullpath(&f->tokenizer, f->fullpath, copy_file_contents);
 	if (err != TokenizerInit_None) {
 		switch (err) {
 		case TokenizerInit_Empty:

+ 6 - 4
src/tokenizer.cpp

@@ -722,6 +722,8 @@ struct Tokenizer {
 	i32 error_count;
 
 	bool insert_semicolon;
+	
+	MemoryMappedFile memory_mapped_file;
 };
 
 
@@ -811,17 +813,17 @@ TokenizerInitError memory_mapped_file_error_map_to_tokenizer[MemoryMappedFile_CO
 	TokenizerInit_Permission,   /*MemoryMappedFile_Permission*/
 };
 
-TokenizerInitError init_tokenizer_from_fullpath(Tokenizer *t, String const &fullpath) {
-	MemoryMappedFile memory_mapped_file = {};
+TokenizerInitError init_tokenizer_from_fullpath(Tokenizer *t, String const &fullpath, bool copy_file_contents) {
 	MemoryMappedFileError mmf_err = memory_map_file_32(
 		alloc_cstring(temporary_allocator(), fullpath), 
-		&memory_mapped_file
+		&t->memory_mapped_file,
+		copy_file_contents
 	);
 	
 	TokenizerInitError err = memory_mapped_file_error_map_to_tokenizer[mmf_err];
 	switch (mmf_err) {
 	case MemoryMappedFile_None:
-		init_tokenizer_with_data(t, fullpath, memory_mapped_file.data, cast(isize)memory_mapped_file.size);
+		init_tokenizer_with_data(t, fullpath, t->memory_mapped_file.data, cast(isize)t->memory_mapped_file.size);
 		break;
 	case MemoryMappedFile_FileTooLarge:
 	case MemoryMappedFile_Empty: