Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. tp_obj *tp_ptr(tp_obj o) {
  2.     tp_obj *ptr = (tp_obj*)tp_malloc(sizeof(tp_obj)); *ptr = o;
  3.     return ptr;
  4. }
  5.  
  6. tp_obj _tp_dcall(TP,tp_obj fnc(TP)) {
  7.     return fnc(tp);
  8. }
  9. tp_obj _tp_tcall(TP,tp_obj fnc) {
  10.     if (fnc.fnc.ftype&2) {
  11.         _tp_list_insert(tp,tp->params.list.val,0,fnc.fnc.info->self);
  12.     }
  13.     return _tp_dcall(tp,(tp_obj (*)(tp_vm *))fnc.fnc.val);
  14. }
  15.  
  16. tp_obj tp_fnc_new(TP,int t, void *v, tp_obj s, tp_obj g) {
  17.     tp_obj r = {TP_FNC};
  18.     _tp_fnc *info = (_tp_fnc*)tp_malloc(sizeof(_tp_fnc));
  19.     info->self = s;
  20.     info->globals = g;
  21.     r.fnc.ftype = t;
  22.     r.fnc.info = info;
  23.     r.fnc.val = v;
  24.     return tp_track(tp,r);
  25. }
  26.  
  27. tp_obj tp_def(TP,void *v, tp_obj g) {
  28.     return tp_fnc_new(tp,1,v,tp_None,g);
  29. }
  30.  
  31. tp_obj tp_fnc(TP,tp_obj v(TP)) {
  32.     return tp_fnc_new(tp,0,v,tp_None,tp_None);
  33. }
  34.  
  35. tp_obj tp_method(TP,tp_obj self,tp_obj v(TP)) {
  36.     return tp_fnc_new(tp,2,v,self,tp_None);
  37. }
  38.  
  39. tp_obj tp_data(TP,int magic,void *v) {
  40.     tp_obj r = {TP_DATA};
  41.     r.data.info = (_tp_data*)tp_malloc(sizeof(_tp_data));
  42.     r.data.val = v;
  43.     r.data.magic = magic;
  44.     return tp_track(tp,r);
  45. }
  46.  
  47. tp_obj tp_params(TP) {
  48.     tp_obj r;
  49.     tp->params = tp->_params.list.val->items[tp->cur];
  50.     r = tp->_params.list.val->items[tp->cur];
  51.     r.list.val->len = 0;
  52.     return r;
  53. }
  54. tp_obj tp_params_n(TP,int n, tp_obj argv[]) {
  55.     tp_obj r = tp_params(tp);
  56.     int i; for (i=0; i<n; i++) { _tp_list_append(tp,r.list.val,argv[i]); }
  57.     return r;
  58. }
  59. tp_obj tp_params_v(TP,int n,...) {
  60.     int i;
  61.     tp_obj r = tp_params(tp);
  62.     va_list a; va_start(a,n);
  63.     for (i=0; i<n; i++) {
  64.         _tp_list_append(tp,r.list.val,va_arg(a,tp_obj));
  65.     }
  66.     va_end(a);
  67.     return r;
  68. }
  69.