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
)
14 if(VX_FAILED(v
->GetBool(3, &raise
)))
18 if(VX_FAILED(v
->CallStack(v
->GetTop()-1, true, raise
)))
25 VXInteger
_closure_acall(VXState
* v
,bool raiseerror
)
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
)
51 if(VX_FAILED(v
->BindEnv(v
->StackGet(1), v
->StackGet(2), res
)))
59 VXInteger
closure_getinfos(VXState
* v
)
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
]);
79 _array(params
)->Set(nparams
-1, v
->NewString("..."));
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
);
91 funcname
= nc
->_name
.String();
92 filename
= v
->NewString("[native]");
93 res
->NewSlot(v
->NewString("paramscheck"), nc
->_nparamscheck
);
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
);
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"},