moved back to old acc
[vox.git] / src / core / baselib_closure.cpp
blob1fc4f57e9b1485e2627e2df3fc7583634d28103e
2 #include "baselib.hpp"
5 VXInteger closure_pcall(VXState* v)
7 //return VX_SUCCEEDED(vox_call(v,vox_gettop(v)-1,true,false))?1:VX_ERROR;
8 return v->CallStack(v->GetTop()-1, true, false);
11 VXInteger closure_call(VXState* v)
13 bool raise;
14 if(VX_FAILED(v->GetBool(3, &raise)))
16 raise = true;
18 if(VX_FAILED(v->CallStack(v->GetTop()-1, true, raise)))
20 return VX_ERROR;
22 return 1;
25 VXInteger _closure_acall(VXState* v,bool raiseerror)
27 VXInteger i;
28 VXArrayObj *aparams = v->StackGet(2).Array();
29 VXInteger nparams = aparams->Size();
30 v->Push(v->StackGet(1));
31 for(i=0; i<nparams; i++)
33 v->Push(aparams->_values[i]);
35 return v->CallStack(nparams, true, raiseerror);
38 VXInteger closure_acall(VXState* v)
40 return _closure_acall(v,true);
43 VXInteger closure_pacall(VXState* v)
45 return _closure_acall(v,false);
48 VXInteger closure_bindenv(VXState* v)
50 VXObject res;
51 if(VX_FAILED(v->BindEnv(v->StackGet(1), v->StackGet(2), res)))
53 return VX_ERROR;
55 v->Push(res);
56 return 1;
59 VXInteger closure_getinfos(VXState* v)
61 VXInteger n;
62 bool native;
63 VXObject filename;
64 VXObject funcname;
65 VXObject sourcename;
66 VXRawObj o = v->StackGet(1);
67 VXTableObj* res = v->NewTable();
68 if(type(o) == VX_OT_CLOSURE)
70 VXFuncProtoObj* f = _closure(o)->_function;
71 VXInteger nparams = f->_nparameters + (f->_varparams?1:0);
72 VXObject params = v->NewArray(nparams);
73 for(n=0; n<(f->_nparameters); n++)
75 _array(params)->Set(n, f->_parameters[n]);
77 if(f->_varparams)
79 _array(params)->Set(nparams-1, v->NewString("..."));
81 native = false;
82 funcname = f->_name;
83 filename = f->_sourcename;
84 res->NewSlot(v->NewString("parameters"), params);
85 res->NewSlot(v->NewString("varargs"), f->_varparams);
87 else //VX_OT_NATIVECLOSURE
89 VXNativeClosureObj *nc = _nativeclosure(o);
90 native = true;
91 funcname = nc->_name.String();
92 filename = v->NewString("[native]");
93 res->NewSlot(v->NewString("paramscheck"), nc->_nparamscheck);
94 VXObject typecheck;
95 if(nc->_typecheck.size() > 0)
97 typecheck = v->NewArray(nc->_typecheck.size());
98 for(VXUnsignedInteger n = 0; n<nc->_typecheck.size(); n++)
100 _array(typecheck)->Set((VXInteger)n, nc->_typecheck[n]);
103 res->NewSlot(v->NewString("typecheck"), typecheck);
105 res->NewSlot(v->NewString("native"), native);
106 res->NewSlot(v->NewString("name"), funcname);
107 res->NewSlot(v->NewString("src"), filename);
108 v->Push(res);
109 return 1;
112 VXRegFunction VXSharedState::_closure_default_delegate_funcz[]=
114 {"call", closure_call, -1, "c"},
115 {"pcall", closure_pcall, -1, "c"},
116 {"acall", closure_acall, 2, "ca"},
117 {"pacall", closure_pacall, 2, "ca"},
118 {"weakref", obj_delegate_weakref, 1, NULL },
119 {"tostring", default_delegate_tostring, -1, ".b"},
120 {"bindenv", closure_bindenv, 2, "c x|y|t"},
121 {"getinfos", closure_getinfos, 1, "c"},
122 {0, 0, 0, 0}