Make primop registration pluggable
This way we don't have to put all primops in one giant file.
This commit is contained in:
		
							parent
							
								
									96515b0c0d
								
							
						
					
					
						commit
						12b257f045
					
				
					 4 changed files with 33 additions and 3 deletions
				
			
		|  | @ -26,9 +26,9 @@ typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, | |||
| struct PrimOp | ||||
| { | ||||
|     PrimOpFun fun; | ||||
|     unsigned int arity; | ||||
|     size_t arity; | ||||
|     Symbol name; | ||||
|     PrimOp(PrimOpFun fun, unsigned int arity, Symbol name) | ||||
|     PrimOp(PrimOpFun fun, size_t arity, Symbol name) | ||||
|         : fun(fun), arity(arity), name(name) { } | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ libexpr_NAME = libnixexpr | |||
| 
 | ||||
| libexpr_DIR := $(d) | ||||
| 
 | ||||
| libexpr_SOURCES := $(wildcard $(d)/*.cc) $(d)/lexer-tab.cc $(d)/parser-tab.cc | ||||
| libexpr_SOURCES := $(wildcard $(d)/*.cc) $(wildcard $(d)/primops/*.cc) $(d)/lexer-tab.cc $(d)/parser-tab.cc | ||||
| 
 | ||||
| libexpr_CXXFLAGS := -Wno-deprecated-register | ||||
| 
 | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ | |||
| #include "util.hh" | ||||
| #include "value-to-json.hh" | ||||
| #include "value-to-xml.hh" | ||||
| #include "primops.hh" | ||||
| 
 | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
|  | @ -1725,6 +1726,16 @@ static void prim_fetchTarball(EvalState & state, const Pos & pos, Value * * args | |||
|  *************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| RegisterPrimOp::PrimOps * RegisterPrimOp::primOps; | ||||
| 
 | ||||
| 
 | ||||
| RegisterPrimOp::RegisterPrimOp(std::string name, size_t arity, PrimOpFun fun) | ||||
| { | ||||
|     if (!primOps) primOps = new PrimOps; | ||||
|     primOps->emplace_back(name, arity, fun); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void EvalState::createBaseEnv() | ||||
| { | ||||
|     baseEnv.up = 0; | ||||
|  | @ -1889,6 +1900,10 @@ void EvalState::createBaseEnv() | |||
|     } | ||||
|     addConstant("__nixPath", v); | ||||
| 
 | ||||
|     if (RegisterPrimOp::primOps) | ||||
|         for (auto & primOp : *RegisterPrimOp::primOps) | ||||
|             addPrimOp(std::get<0>(primOp), std::get<1>(primOp), std::get<2>(primOp)); | ||||
| 
 | ||||
|     /* Now that we've added all primops, sort the `builtins' set,
 | ||||
|        because attribute lookups expect it to be sorted. */ | ||||
|     baseEnv.values[0]->attrs->sort(); | ||||
|  |  | |||
							
								
								
									
										15
									
								
								src/libexpr/primops.hh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/libexpr/primops.hh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| #include "eval.hh" | ||||
| 
 | ||||
| #include <tuple> | ||||
| #include <vector> | ||||
| 
 | ||||
| namespace nix { | ||||
| 
 | ||||
| struct RegisterPrimOp | ||||
| { | ||||
|     typedef std::vector<std::tuple<std::string, size_t, PrimOpFun>> PrimOps; | ||||
|     static PrimOps * primOps; | ||||
|     RegisterPrimOp(std::string name, size_t arity, PrimOpFun fun); | ||||
| }; | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue