#include <cpps/cpps.h>namespace cpps {node* cpps_parse_getsymbol2node(C* c, node* o, std::string symbolStr, cppsbuffer& buffer, bool leftsymbol);int32 cpps_str2i64(const char* s, cpps_integer* result);int32 cpps_str2ui64(const char* s, cpps_uinteger* result);node* cpps_get_root_node(node* n);void cpps_class_parent_buildoffset(C* c, node* child, node* root, node* parent, std::set<node*>& parentset, std::set<cpps_cppsclass*>& parentset_class);void cpps_parse_var_buildoffset(C* c, node* root, node* str, cpps_node_domain* domain);void cpps_varname_build_offset(C* c, node* root, node* param, node* o);bool cpps_loadlibrary(C* c, std::string libname, cppsbuffer& buffer);node* cpps_get_realroot(node* _n) {switch (_n->type){case CPPS_ROOT:case CPPS_ODEFVAR_FUNC:case CPPS_ODEFVAR_LAMBDA_FUNC:case CPPS_OCLASS:case CPPS_ONAMESPACE:return _n;default:if (_n->parent) return cpps_get_realroot(_n->parent);break;}return NULL;}void cpps_node_build(C* c, node* _root, node* _node, cppsbuffer& buffer) {if (_node->type == CPPS_ROOT) return;if (_node->type == CPPS_ONIL) return;node* __root = cpps_get_realroot(_node->parent);switch (_node->type){case CPPS_OIMPORT:{cpps_loadlibrary(c, _node->s, buffer);break;}case CPPS_VARNAME: {if (c->buildoffset) {//1.func argsif (_node->parent && _node->parent->type == CPPS_VARNAME && _node->parent->parent) {node* right = _node->parent->parent;if (right->parent && (right->parent->type == CPPS_ODEFVAR_FUNC || right->parent->type == CPPS_ODEFVAR_LAMBDA_FUNC))/* 根节点.. */ {_node->offset = right->parent->size++;_node->offsettype = CPPS_OFFSET_TYPE_SELF;right->parent->regnode(_node->s, _node);}}//2.def var - multivarelse if (_node->parent && _node->parent->type == CPPS_VARNAMES && _node->parent->parent) {cpps_parse_var_buildoffset(c, __root, _node, __root->domain);}//3.def var - const,async,varelse if (_node->parent && (_node->parent->type == CPPS_ODEFVAR ||_node->parent->type == CPPS_ODEFCONSTVAR ||_node->parent->type == CPPS_ODEFASYNCVAR) &&_node->parent->parent) {//4.build symbol 无法确认是否是符号,只能逐个检测,后续优化cpps_symbol* symbol = cpps_parse_getsymbol(c, _node->s, false);if (symbol) {_node->symbol = symbol;}cpps_parse_var_buildoffset(c, __root, _node, __root->domain);}else{cpps_varname_build_offset(c, __root, _node, __root);}}break;}case CPPS_ONEWVAR: {_node->offset = 0;_node->offsettype = 0;_node->varsize = 0;_node->size = 0;break;}case CPPS_OTRYCATCH: {cpps_node_domain* trycatchdomain = CPPSNEW(cpps_node_domain)(_node, __root->domain, cpps_domain_type_trycatch, "trycatch");_node->setdomain(trycatchdomain);break;}case CPPS_ODEFVAR_FUNC:case CPPS_OCLASS_CONSTRUCTOR:case CPPS_ODOFUNCTION:{_node->size = 0;_node->varsize = 0;cpps_node_domain* funcdomain = CPPSNEW(cpps_node_domain)(_node, __root->domain, cpps_domain_type_func, _node->parent->s);_node->setdomain(funcdomain);break;}case CPPS_OIF: {cpps_node_domain* ifdomain = CPPSNEW(cpps_node_domain)(_node, __root->domain, cpps_domain_type_if, "if");_node->setdomain(ifdomain);break;}case CPPS_OFOR: {cpps_node_domain* fordomain = CPPSNEW(cpps_node_domain)(_node, __root->domain, cpps_domain_type_for, "for");_node->setdomain(fordomain);break;}case CPPS_OFOREACH: {cpps_node_domain* foreachdomain = CPPSNEW(cpps_node_domain)(_node, __root->domain, cpps_domain_type_for, "foreach");_node->setdomain(foreachdomain);break;}case CPPS_OWHILE: {cpps_node_domain* whiledomain = CPPSNEW(cpps_node_domain)(_node, __root->domain, cpps_domain_type_while, "while");_node->setdomain(whiledomain);break;}case CPPS_FUNCNAME: {cpps_symbol* symbol = cpps_parse_getsymbol(c, _node->s, _node->closure);if (!symbol) cpps::error(c, "symbol error");_node->symbol = symbol;break;}case CPPS_OSTR: {//const stringif (_node->l.size() == 1 || _node->l.size() == 0) {std::string* tmpstr;_node->value.val = CPPSNEW(cpps_value)();newclass(c, &tmpstr, _node->value.val);_node->needdelete = true;if (_node->l.size() == 1) tmpstr->append(_node->l[0]->s);}break;}case CPPS_OENUM: {_node->offset = 0;_node->offsettype = 0;_node->varsize = 0;_node->size = 0;for (auto& _cn : _node->l) {cpps_str2i64(_cn->s.c_str(), &_cn->value.integer);}break;}case CPPS_ONUMBER: {cpps_str2d(_node->s.c_str(), &_node->value.number);break;}case CPPS_OINTEGER:case CPPS_OINTEGER16: {cpps_str2i64(_node->s.c_str(), &_node->value.integer);break;}case CPPS_OUINTEGER: {cpps_str2ui64(_node->s.c_str(), &_node->value.uinteger);break;}case CPPS_OCLASS: {_node->varsize = 0;_node->size = 0;if (c->buildoffset) {if (__root->type == CPPS_ROOT)/* 根节点.. */ {_node->offset = __root->size++;_node->offsettype = CPPS_OFFSET_TYPE_GLOBAL;__root->regnode(_node->s, _node);}else if (__root->type == CPPS_ONAMESPACE) {node* r = cpps_get_root_node(__root);/* namespace不注册到自己里面 */_node->offset = r->size++;_node->offsettype = CPPS_OFFSET_TYPE_GLOBAL;r->regnode(_node->s, _node);}//parentsnode* parents = _node->l[0];std::set<node*> parentset;std::set<cpps_cppsclass*> parentset_class;for (node* _parent : parents->l) {cpps_class_parent_buildoffset(c, _node, __root, _parent, parentset, parentset_class);}}break;}case CPPS_ONAMESPACE: {_node->offset = 0;_node->offsettype = 0;_node->varsize = 0;_node->size = 0;if (c->buildoffset) {if (__root->type == CPPS_ROOT)/* 根节点.. */ {_node->offset = __root->size++;_node->offsettype = CPPS_OFFSET_TYPE_GLOBAL;__root->regnode(_node->s, _node);}else if (__root->type == CPPS_ONAMESPACE) {node* r = cpps_get_root_node(__root);/* namespace不注册到自己里面 */_node->offset = r->size++;_node->offsettype = CPPS_OFFSET_TYPE_GLOBAL;r->regnode(_node->s, _node);}}break;}case CPPS_ODEFVAR: {node* r = cpps_get_root_node(_node->parent);node* str = _node->l[0];if (!str->l.empty()) {node* lambda = str->l[0];if (lambda->type == CPPS_ODEFVAR_LAMBDA_FUNC) {if (c->buildoffset) {str->offset = r->size++;str->offsettype = CPPS_OFFSET_TYPE_GLOBAL;}node* lastopnode = _node->parent;node* lambdaparam = lastopnode->l[1];if (__root->type == CPPS_ODEFVAR_LAMBDA_FUNC || __root->type == CPPS_ODEFVAR_FUNC) {lambda->size = __root->size;/*为了兼容闭包*/}usint16 takesize = lambda->size;if (c->buildoffset) {lambdaparam->offset = str->offset;lambdaparam->offsettype = str->offsettype;}lambdaparam->size = takesize;/*记录当时使用时它父类长度.*/}}break;}}}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型