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 |     parser.cc | ||||||
|     primops.cc |     primops.cc | ||||||
|     symbol-table.cc |     symbol-table.cc | ||||||
|  |     value.cc | ||||||
|     value-to-json.cc |     value-to-json.cc | ||||||
|     value-to-xml.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; |     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; } |   bool isList() const { return type == tList; } | ||||||
| 
 | 
 | ||||||
|   size_t listSize() const { return list->size(); } |   size_t listSize() const { return list->size(); } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue