13 Star 69 Fork 22

johnsonyl/cpps

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
cpps_dofunction.cpp 4.65 KB
一键复制 编辑 原始数据 按行查看 历史
johnsonyl 提交于 2024-01-13 14:13 +08:00 . 优化cpps运行速度
#include "cpps/cpps.h"
namespace cpps
{
object dofunction(C *c, object func)
{
cpps_value ret;
if (func.value.tt == CPPS_TLAMBDAFUNCTION) {
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)func.value.value.domain;
cpps_lambda_function* pfunc = (cpps_lambda_function*)cppsclassvar->getclsptr();
func.value = pfunc;
func.value.tt = CPPS_TFUNCTION;
}
if (func.value.tt == CPPS_TFUNCTION)
{
cpps_function *f = func.value.value.func;
if (f)
{
cpps_std_vector paramlist;
cpps_domain *execdomain = c->_G;
cpps_stack stack;
stack.init(__FILE__, __LINE__, f->funcname.c_str());
c->push_stack(&stack);
f->callfunction(c, &ret, execdomain, &paramlist);
c->pop_stack();
}
}
return ret;
}
object doclassfunction(C *c, object domain, object func)
{
cpps_value ret;
if (func.value.tt == CPPS_TLAMBDAFUNCTION) {
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)func.value.value.domain;
cpps_lambda_function* pfunc = (cpps_lambda_function*)cppsclassvar->getclsptr();
func.value = pfunc;
func.value.tt = CPPS_TFUNCTION;
}
if (func.value.tt == CPPS_TFUNCTION)
{
cpps_function *f = func.value.value.func;
if (f)
{
cpps_std_vector paramlist;
cpps_domain *execdomain = domain.value.value.domain;
cpps_stack stack;
stack.init(__FILE__, __LINE__, f->funcname.c_str());
c->push_stack(&stack);
f->callfunction(c, &ret, execdomain, &paramlist);
c->pop_stack();
}
}
return ret;
}
cpps_value cpps_new_tmp_string(const std::string& tmp) {
cpps_cppsclassvar* var = cpps_class_singleton<cpps::string*>::instance()->getcls()->create(NULL, false);
var->setclsptr((void*)&tmp);
cpps_value retv(var);
retv.tt = CPPS_TSTRING;
return retv;
}
void cpps_delete_tmp_string(cpps_value& v) {
cpps_cppsclassvar* var = (cpps_cppsclassvar*)v.value.domain;
v = nil;
var->release();
var = NULL;
}
void newcppsclasvar(C* c, cpps::cpps_cppsclass* cppsclass, cpps_value* ret_value)
{
cpps_cppsclassvar* cppsclassvar = cppsclass->create(c);
/* 将类对象里面的变量创建出来 */
cpps_step_newclassvar_reg_baselassvar(cppsclass, c, cppsclassvar, cppsclassvar);
//将类对象里面的变量创建出来
if (cppsclass->o)
cpps_step_all(c, CPPS_MUNITRET, cppsclassvar, cppsclassvar, cppsclass->o->getright(), false);
//将新创建出来的添加到新生区稍后检测要不要干掉
cpps_gc_add_gen0(c, cppsclassvar);
//执行0参数构造函数
cpps_domain* leftdomain = NULL;
cpps_regvar* var = cppsclassvar->getvar("constructor", leftdomain);
ret_value->tt = CPPS_TCLASSVAR;
ret_value->value.domain = (cpps_domain*)cppsclassvar;
ret_value->incruse();
if (var && var->getval().tt == CPPS_TFUNCTION) {
node n("", 0);
leftdomain = cppsclassvar;
for (auto parent_cppsclass : cppsclass->parentclasslist()) {
cpps_call_parent_class_default_constructor(c, &n, parent_cppsclass, c->_G, c->_G, leftdomain);
}
cpps_function* f = var->getval().value.func;
if (f->getparamcount() == 0) {
doclassfunction(c, *ret_value, var->getval());
}
}
}
object function_caller(C* c, object func, cpps_std_vector& paramlist)
{
cpps_value ret;
if (func.value.tt == CPPS_TLAMBDAFUNCTION) {
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)func.value.value.domain;
cpps_lambda_function* pfunc = (cpps_lambda_function*)cppsclassvar->getclsptr();
func.value = pfunc;
func.value.tt = CPPS_TFUNCTION;
}
if (func.value.tt == CPPS_TFUNCTION)
{
cpps_function* f = func.value.value.func;
if (f)
{
cpps_domain* execdomain = c->_G;
cpps_stack stack;
stack.init(__FILE__, __LINE__, f->funcname.c_str());
c->push_stack(&stack);
f->callfunction(c, &ret, execdomain, &paramlist);
c->pop_stack();
}
}
return ret;
}
object function_caller(C* c, object domain, object func, cpps_std_vector& paramlist)
{
cpps_value ret;
if (func.value.tt == CPPS_TLAMBDAFUNCTION) {
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)func.value.value.domain;
cpps_lambda_function* pfunc = (cpps_lambda_function*)cppsclassvar->getclsptr();
func.value = pfunc;
func.value.tt = CPPS_TFUNCTION;
}
if (func.value.tt == CPPS_TFUNCTION)
{
cpps_function* f = func.value.value.func;
if (f)
{
cpps_domain* execdomain = domain.value.value.domain;
cpps_stack stack;
stack.init(c->curnode->filename.c_str(), c->curnode->line, f->funcname.c_str());
c->push_stack(&stack);
f->callfunction(c, &ret, execdomain, &paramlist);
c->pop_stack();
}
}
return ret;
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/cppscript/cpps.git
git@gitee.com:cppscript/cpps.git
cppscript
cpps
cpps
v1.0.3-beta

搜索帮助