mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	[FunC] Add builtin keyword to be used in stdlib later on
				
					
				
			This commit is contained in:
		
							parent
							
								
									acf0043342
								
							
						
					
					
						commit
						cdef8302b0
					
				
					 6 changed files with 99 additions and 36 deletions
				
			
		|  | @ -31,7 +31,7 @@ int glob_func_cnt, undef_func_cnt, glob_var_cnt, const_cnt; | |||
| std::vector<SymDef*> glob_func, glob_vars; | ||||
| std::set<std::string> prohibited_var_names; | ||||
| 
 | ||||
| SymDef* predefine_builtin_func(std::string name, TypeExpr* func_type) { | ||||
| SymDef* define_builtin_func_impl(const std::string& name, SymValAsmFunc* func_val) { | ||||
|   if (name.back() == '_') { | ||||
|     prohibited_var_names.insert(name); | ||||
|   } | ||||
|  | @ -44,39 +44,40 @@ SymDef* predefine_builtin_func(std::string name, TypeExpr* func_type) { | |||
|     std::cerr << "fatal: global function `" << name << "` already defined" << std::endl; | ||||
|     std::exit(1); | ||||
|   } | ||||
|   return def; | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| SymDef* define_builtin_func(std::string name, TypeExpr* func_type, const T& func, bool impure = false) { | ||||
|   SymDef* def = predefine_builtin_func(name, func_type); | ||||
|   def->value = new SymValAsmFunc{func_type, func, !impure}; | ||||
|   func_val->flags |= SymValFunc::flagBuiltinFunction; | ||||
|   def->value = func_val; | ||||
| #ifdef FUNC_DEBUG | ||||
|   dynamic_cast<SymValAsmFunc*>(def->value)->name = name; | ||||
| #endif | ||||
|   return def; | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| SymDef* define_builtin_func(std::string name, TypeExpr* func_type, const T& func, std::initializer_list<int> arg_order, | ||||
| SymDef* define_builtin_func(const std::string& name, TypeExpr* func_type, const simple_compile_func_t& func, bool impure = false) { | ||||
|   return define_builtin_func_impl(name, new SymValAsmFunc{func_type, func, !impure}); | ||||
| } | ||||
| 
 | ||||
| SymDef* define_builtin_func(const std::string& name, TypeExpr* func_type, const compile_func_t& func, bool impure = false) { | ||||
|   return define_builtin_func_impl(name, new SymValAsmFunc{func_type, func, !impure}); | ||||
| } | ||||
| 
 | ||||
| SymDef* define_builtin_func(const std::string& name, TypeExpr* func_type, const AsmOp& macro, bool impure = false) { | ||||
|   return define_builtin_func_impl(name, new SymValAsmFunc{func_type, make_simple_compile(macro), !impure}); | ||||
| } | ||||
| 
 | ||||
| SymDef* define_builtin_func(const std::string& name, TypeExpr* func_type, const simple_compile_func_t& func, std::initializer_list<int> arg_order, | ||||
|                             std::initializer_list<int> ret_order = {}, bool impure = false) { | ||||
|   SymDef* def = predefine_builtin_func(name, func_type); | ||||
|   def->value = new SymValAsmFunc{func_type, func, arg_order, ret_order, !impure}; | ||||
| #ifdef FUNC_DEBUG | ||||
|   dynamic_cast<SymValAsmFunc*>(def->value)->name = name; | ||||
| #endif | ||||
|   return def; | ||||
|   return define_builtin_func_impl(name, new SymValAsmFunc{func_type, func, arg_order, ret_order, !impure}); | ||||
| } | ||||
| 
 | ||||
| SymDef* define_builtin_func(std::string name, TypeExpr* func_type, const AsmOp& macro, | ||||
| SymDef* define_builtin_func(const std::string& name, TypeExpr* func_type, const compile_func_t& func, std::initializer_list<int> arg_order, | ||||
|                             std::initializer_list<int> ret_order = {}, bool impure = false) { | ||||
|   return define_builtin_func_impl(name, new SymValAsmFunc{func_type, func, arg_order, ret_order, !impure}); | ||||
| } | ||||
| 
 | ||||
| SymDef* define_builtin_func(const std::string& name, TypeExpr* func_type, const AsmOp& macro, | ||||
|                             std::initializer_list<int> arg_order, std::initializer_list<int> ret_order = {}, | ||||
|                             bool impure = false) { | ||||
|   SymDef* def = predefine_builtin_func(name, func_type); | ||||
|   def->value = new SymValAsmFunc{func_type, make_simple_compile(macro), arg_order, ret_order, !impure}; | ||||
| #ifdef FUNC_DEBUG | ||||
|   dynamic_cast<SymValAsmFunc*>(def->value)->name = name; | ||||
| #endif | ||||
|   return def; | ||||
|   return define_builtin_func_impl(name, new SymValAsmFunc{func_type, make_simple_compile(macro), arg_order, ret_order, !impure}); | ||||
| } | ||||
| 
 | ||||
| SymDef* force_autoapply(SymDef* def) { | ||||
|  | @ -1152,9 +1153,9 @@ void define_builtins() { | |||
|   auto Int3 = TypeExpr::new_tensor({Int, Int, Int}); | ||||
|   auto TupleInt = TypeExpr::new_tensor({Tuple, Int}); | ||||
|   auto SliceInt = TypeExpr::new_tensor({Slice, Int}); | ||||
|   auto X = TypeExpr::new_var(); | ||||
|   auto Y = TypeExpr::new_var(); | ||||
|   auto Z = TypeExpr::new_var(); | ||||
|   auto X = TypeExpr::new_var(0); | ||||
|   auto Y = TypeExpr::new_var(1); | ||||
|   auto Z = TypeExpr::new_var(2); | ||||
|   auto XY = TypeExpr::new_tensor({X, Y}); | ||||
|   auto arith_bin_op = TypeExpr::new_map(Int2, Int); | ||||
|   auto arith_un_op = TypeExpr::new_map(Int, Int); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue