refactor(tvix): add explicit copy/move constructors for Value
This is in preparation for making some of Value's members into refcounted ('smart') pointers.
Change-Id: Ibc54e23ac35766a2fd4e14871c9a7c936a603778
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1743
Tested-by: BuildkiteCI
Reviewed-by: glittershark <grfn@gws.fyi>
			
			
This commit is contained in:
		
							parent
							
								
									cbebc75d94
								
							
						
					
					
						commit
						38f2ea34f4
					
				
					 3 changed files with 129 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								third_party/nix/src/libexpr/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								third_party/nix/src/libexpr/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							|  | @ -62,6 +62,7 @@ target_sources(nixexpr | |||
|     parser.cc | ||||
|     primops.cc | ||||
|     symbol-table.cc | ||||
|     value.cc | ||||
|     value-to-json.cc | ||||
|     value-to-xml.cc | ||||
| ) | ||||
|  |  | |||
							
								
								
									
										121
									
								
								third_party/nix/src/libexpr/value.cc
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								third_party/nix/src/libexpr/value.cc
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,121 @@ | |||
| #include "libexpr/value.hh" | ||||
| 
 | ||||
| #include <glog/logging.h> | ||||
| 
 | ||||
| namespace nix { | ||||
| 
 | ||||
| Value::Value(const Value& copy) { *this = copy; } | ||||
| 
 | ||||
| Value::Value(Value&& move) { *this = move; } | ||||
| 
 | ||||
| Value& Value::operator=(const Value& copy) { | ||||
|   if (type != copy.type) { | ||||
|     memset(this, 0, sizeof(*this)); | ||||
|   } | ||||
|   type = copy.type; | ||||
|   switch (type) { | ||||
|     case tInt: | ||||
|       integer = copy.integer; | ||||
|       break; | ||||
|     case tBool: | ||||
|       boolean = copy.boolean; | ||||
|       break; | ||||
|     case tString: | ||||
|       string = copy.string; | ||||
|       break; | ||||
|     case tPath: | ||||
|       path = copy.path; | ||||
|       break; | ||||
|     case tNull: | ||||
|       /* no fields */ | ||||
|       break; | ||||
|     case tAttrs: | ||||
|       attrs = copy.attrs; | ||||
|       break; | ||||
|     case tList: | ||||
|       list = copy.list; | ||||
|       break; | ||||
|     case tThunk: | ||||
|       thunk = copy.thunk; | ||||
|       break; | ||||
|     case tApp: | ||||
|       app = copy.app; | ||||
|       break; | ||||
|     case tLambda: | ||||
|       lambda = copy.lambda; | ||||
|       break; | ||||
|     case tBlackhole: | ||||
|       /* no fields */ | ||||
|       break; | ||||
|     case tPrimOp: | ||||
|       primOp = copy.primOp; | ||||
|       break; | ||||
|     case tPrimOpApp: | ||||
|       primOpApp = copy.primOpApp; | ||||
|       break; | ||||
|     case _reserved1: | ||||
|       LOG(FATAL) << "attempted to assign a tExternal value"; | ||||
|       break; | ||||
|     case tFloat: | ||||
|       fpoint = copy.fpoint; | ||||
|       break; | ||||
|   } | ||||
|   return *this; | ||||
| } | ||||
| 
 | ||||
| Value& Value::operator=(Value&& move) { | ||||
|   if (type != move.type) { | ||||
|     memset(this, 0, sizeof(*this)); | ||||
|   } | ||||
|   type = move.type; | ||||
|   switch (type) { | ||||
|     case tInt: | ||||
|       integer = move.integer; | ||||
|       break; | ||||
|     case tBool: | ||||
|       boolean = move.boolean; | ||||
|       break; | ||||
|     case tString: | ||||
|       string = move.string; | ||||
|       break; | ||||
|     case tPath: | ||||
|       path = move.path; | ||||
|       break; | ||||
|     case tNull: | ||||
|       /* no fields */ | ||||
|       break; | ||||
|     case tAttrs: | ||||
|       attrs = move.attrs; | ||||
|       break; | ||||
|     case tList: | ||||
|       list = move.list; | ||||
|       break; | ||||
|     case tThunk: | ||||
|       thunk = move.thunk; | ||||
|       break; | ||||
|     case tApp: | ||||
|       app = move.app; | ||||
|       break; | ||||
|     case tLambda: | ||||
|       lambda = move.lambda; | ||||
|       break; | ||||
|     case tBlackhole: | ||||
|       /* no fields */ | ||||
|       break; | ||||
|     case tPrimOp: | ||||
|       primOp = move.primOp; | ||||
|       break; | ||||
|     case tPrimOpApp: | ||||
|       primOpApp = move.primOpApp; | ||||
|       break; | ||||
|     case _reserved1: | ||||
|       LOG(FATAL) << "attempted to assign a tExternal value"; | ||||
|       break; | ||||
|     case tFloat: | ||||
|       fpoint = move.fpoint; | ||||
|       break; | ||||
|   } | ||||
|   return *this; | ||||
| } | ||||
| 
 | ||||
| }  // namespace nix
 | ||||
							
								
								
									
										7
									
								
								third_party/nix/src/libexpr/value.hh
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								third_party/nix/src/libexpr/value.hh
									
										
									
									
										vendored
									
									
								
							|  | @ -105,6 +105,13 @@ struct Value { | |||
|     NixFloat fpoint; | ||||
|   }; | ||||
| 
 | ||||
|   Value() : type(tInt), integer(0) {} | ||||
|   Value(const Value& copy); | ||||
|   Value(Value&& move); | ||||
|   ~Value() {} | ||||
|   Value& operator=(const Value& copy); | ||||
|   Value& operator=(Value&& move); | ||||
| 
 | ||||
|   bool isList() const { return type == tList; } | ||||
| 
 | ||||
|   size_t listSize() const { return list->size(); } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue