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
 | 
					struct PrimOp
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PrimOpFun fun;
 | 
					    PrimOpFun fun;
 | 
				
			||||||
    unsigned int arity;
 | 
					    size_t arity;
 | 
				
			||||||
    Symbol name;
 | 
					    Symbol name;
 | 
				
			||||||
    PrimOp(PrimOpFun fun, unsigned int arity, Symbol name)
 | 
					    PrimOp(PrimOpFun fun, size_t arity, Symbol name)
 | 
				
			||||||
        : fun(fun), arity(arity), name(name) { }
 | 
					        : fun(fun), arity(arity), name(name) { }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ libexpr_NAME = libnixexpr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libexpr_DIR := $(d)
 | 
					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
 | 
					libexpr_CXXFLAGS := -Wno-deprecated-register
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,7 @@
 | 
				
			||||||
#include "util.hh"
 | 
					#include "util.hh"
 | 
				
			||||||
#include "value-to-json.hh"
 | 
					#include "value-to-json.hh"
 | 
				
			||||||
#include "value-to-xml.hh"
 | 
					#include "value-to-xml.hh"
 | 
				
			||||||
 | 
					#include "primops.hh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
#include <sys/stat.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()
 | 
					void EvalState::createBaseEnv()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    baseEnv.up = 0;
 | 
					    baseEnv.up = 0;
 | 
				
			||||||
| 
						 | 
					@ -1889,6 +1900,10 @@ void EvalState::createBaseEnv()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    addConstant("__nixPath", v);
 | 
					    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,
 | 
					    /* Now that we've added all primops, sort the `builtins' set,
 | 
				
			||||||
       because attribute lookups expect it to be sorted. */
 | 
					       because attribute lookups expect it to be sorted. */
 | 
				
			||||||
    baseEnv.values[0]->attrs->sort();
 | 
					    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