当前位置: 首页>>代码示例>>C++>>正文


C++ CodeGen::add_stack_identifier方法代码示例

本文整理汇总了C++中CodeGen::add_stack_identifier方法的典型用法代码示例。如果您正苦于以下问题:C++ CodeGen::add_stack_identifier方法的具体用法?C++ CodeGen::add_stack_identifier怎么用?C++ CodeGen::add_stack_identifier使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在CodeGen的用法示例。


在下文中一共展示了CodeGen::add_stack_identifier方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: _parse_block

Error GDCompiler::_parse_block(CodeGen& codegen,const GDParser::BlockNode *p_block,int p_stack_level,int p_break_addr,int p_continue_addr) {

	codegen.push_stack_identifiers();
	int new_identifiers=0;
	codegen.current_line=p_block->line;

	for(int i=0;i<p_block->statements.size();i++) {

		const GDParser::Node *s = p_block->statements[i];


		switch(s->type) {
			case GDParser::Node::TYPE_NEWLINE: {

				const GDParser::NewLineNode *nl = static_cast<const GDParser::NewLineNode*>(s);
				codegen.opcodes.push_back(GDFunction::OPCODE_LINE);
				codegen.opcodes.push_back(nl->line);
				codegen.current_line=nl->line;

			} break;
			case GDParser::Node::TYPE_CONTROL_FLOW: {
				// try subblocks

				const GDParser::ControlFlowNode *cf = static_cast<const GDParser::ControlFlowNode*>(s);

				switch(cf->cf_type) {


					case GDParser::ControlFlowNode::CF_IF: {

#ifdef DEBUG_ENABLED
						codegen.opcodes.push_back(GDFunction::OPCODE_LINE);
						codegen.opcodes.push_back(cf->line);
						codegen.current_line=cf->line;
#endif
						int ret = _parse_expression(codegen,cf->arguments[0],p_stack_level,false);
						if (ret<0)
							return ERR_PARSE_ERROR;

						codegen.opcodes.push_back(GDFunction::OPCODE_JUMP_IF_NOT);
						codegen.opcodes.push_back(ret);
						int else_addr=codegen.opcodes.size();
						codegen.opcodes.push_back(0); //temporary

						Error err = _parse_block(codegen,cf->body,p_stack_level,p_break_addr,p_continue_addr);
						if (err)
							return err;

						if (cf->body_else) {

							codegen.opcodes.push_back(GDFunction::OPCODE_JUMP);
							int end_addr=codegen.opcodes.size();
							codegen.opcodes.push_back(0);
							codegen.opcodes[else_addr]=codegen.opcodes.size();

							Error err = _parse_block(codegen,cf->body_else,p_stack_level,p_break_addr,p_continue_addr);
							if (err)
								return err;

							codegen.opcodes[end_addr]=codegen.opcodes.size();
						} else {
							//end without else
							codegen.opcodes[else_addr]=codegen.opcodes.size();

						}

					} break;
					case GDParser::ControlFlowNode::CF_FOR: {



						int slevel=p_stack_level;
						int iter_stack_pos=slevel;
						int iterator_pos = (slevel++)|(GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS);
						int counter_pos = (slevel++)|(GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS);
						int container_pos = (slevel++)|(GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS);
						codegen.alloc_stack(slevel);

						    codegen.push_stack_identifiers();
						      codegen.add_stack_identifier(static_cast<const GDParser::IdentifierNode*>(cf->arguments[0])->name,iter_stack_pos);

						int ret = _parse_expression(codegen,cf->arguments[1],slevel,false);
						if (ret<0)
							return ERR_COMPILATION_FAILED;

						//assign container
						codegen.opcodes.push_back(GDFunction::OPCODE_ASSIGN);
						codegen.opcodes.push_back(container_pos);
						codegen.opcodes.push_back(ret);

						//begin loop
						codegen.opcodes.push_back(GDFunction::OPCODE_ITERATE_BEGIN);
						codegen.opcodes.push_back(counter_pos);
						codegen.opcodes.push_back(container_pos);
						codegen.opcodes.push_back(codegen.opcodes.size()+4);
						codegen.opcodes.push_back(iterator_pos);
						codegen.opcodes.push_back(GDFunction::OPCODE_JUMP); //skip code for next
						codegen.opcodes.push_back(codegen.opcodes.size()+8);
						//break loop
						int break_pos=codegen.opcodes.size();
//.........这里部分代码省略.........
开发者ID:HiddenDark,项目名称:godot,代码行数:101,代码来源:gd_compiler.cpp

示例2: _parse_function

Error GDCompiler::_parse_function(GDScript *p_script,const GDParser::ClassNode *p_class,const GDParser::FunctionNode *p_func) {

	Vector<int> bytecode;
	CodeGen codegen;

	codegen.class_node=p_class;
	codegen.script=p_script;
	codegen.function_node=p_func;
	codegen.stack_max=0;
	codegen.current_line=0;
	codegen.call_max=0;
	codegen.debug_stack=ScriptDebugger::get_singleton()!=NULL;

	int stack_level=0;

	if (p_func) {
		for(int i=0;i<p_func->arguments.size();i++) {
			int idx = i;
			codegen.add_stack_identifier(p_func->arguments[i],i);
		}
		stack_level=p_func->arguments.size();
	}

	codegen.alloc_stack(stack_level);

	/* Parse initializer -if applies- */

	bool is_initializer=false || !p_func;

	if (!p_func || String(p_func->name)=="_init") {
		//parse initializer for class members
		if (!p_func && p_class->extends_used && p_script->native.is_null()){

			//call implicit parent constructor
			codegen.opcodes.push_back(GDFunction::OPCODE_CALL_SELF_BASE);
			codegen.opcodes.push_back(codegen.get_name_map_pos("_init"));
			codegen.opcodes.push_back(0);
			codegen.opcodes.push_back((GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS)|0);

		}
		Error err = _parse_block(codegen,p_class->initializer,stack_level);
		if (err)
			return err;
		is_initializer=true;

	}

	/* Parse default argument code -if applies- */

	Vector<int> defarg_addr;
	StringName func_name;

	if (p_func) {
		if (p_func->default_values.size()) {

			codegen.opcodes.push_back(GDFunction::OPCODE_JUMP_TO_DEF_ARGUMENT);
			defarg_addr.push_back(codegen.opcodes.size());
			for(int i=0;i<p_func->default_values.size();i++) {

				_parse_expression(codegen,p_func->default_values[i],stack_level,true);
				defarg_addr.push_back(codegen.opcodes.size());
			}


			defarg_addr.invert();
		}



		Error err = _parse_block(codegen,p_func->body,stack_level);
		if (err)
			return err;

		func_name=p_func->name;
	} else {
		func_name="_init";
	}

	codegen.opcodes.push_back(GDFunction::OPCODE_END);

	GDFunction *gdfunc=NULL;

	//if (String(p_func->name)=="") { //initializer func
	//	gdfunc = &p_script->initializer;

	//} else { //regular func
		p_script->member_functions[func_name]=GDFunction();
		gdfunc = &p_script->member_functions[func_name];
	//}

	if (p_func)
		gdfunc->_static=p_func->_static;

	//constants
	if (codegen.constant_map.size()) {
		gdfunc->_constant_count=codegen.constant_map.size();
		gdfunc->constants.resize(codegen.constant_map.size());
		gdfunc->_constants_ptr=&gdfunc->constants[0];
		const Variant *K=NULL;
		while((K=codegen.constant_map.next(K))) {
//.........这里部分代码省略.........
开发者ID:HiddenDark,项目名称:godot,代码行数:101,代码来源:gd_compiler.cpp


注:本文中的CodeGen::add_stack_identifier方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。