dad_utils.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "squirrel.h"
  2. #include <stdio.h>
  3. typedef struct {
  4. HSQOBJECT func_to_call;
  5. HSQOBJECT param;
  6. HSQUIRRELVM v;
  7. } gc_scope_alert_st;
  8. static const SQChar *gc_scope_alert_TAG = _SC("gc_scope_alert");
  9. static SQRESULT gc_scope_alert_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  10. {
  11. gc_scope_alert_st *self = ((gc_scope_alert_st *)p);
  12. //printf("%p %p\n", p, v);
  13. if(self){
  14. //if(v){
  15. SQInteger top = sq_gettop(self->v);
  16. sq_reservestack(self->v, 20);
  17. sq_pushobject(self->v, self->func_to_call);
  18. sq_pushroottable(self->v);
  19. sq_pushobject(self->v, self->param);
  20. sq_call(self->v, 2, SQFalse, SQTrue);
  21. sq_release(self->v, &self->func_to_call);
  22. sq_release(self->v, &self->param);
  23. sq_settop(self->v, top);
  24. //}
  25. //else
  26. sq_free(self, sizeof(gc_scope_alert_st));
  27. }
  28. return 0;
  29. }
  30. static SQRESULT gc_scope_alert_constructor(HSQUIRRELVM v)
  31. {
  32. SQInteger rc;
  33. gc_scope_alert_st proto;
  34. proto.v = v;
  35. sq_resetobject(&proto.func_to_call);
  36. sq_resetobject(&proto.param);
  37. if((rc = sq_getstackobj(v, 2, &proto.func_to_call)) < 0) return rc;
  38. if(sq_gettop(v) > 2){
  39. if((rc = sq_getstackobj(v, 3, &proto.param)) < 0) return rc;
  40. }
  41. gc_scope_alert_st *self = (gc_scope_alert_st*)sq_malloc(sizeof(gc_scope_alert_st));
  42. if(!self) return sq_throwerror(v, "Failed to create %s", gc_scope_alert_TAG);
  43. sq_addref(v, &proto.func_to_call);
  44. sq_addref(v, &proto.param);
  45. *self = proto;
  46. sq_setinstanceup(v, 1, self);
  47. sq_setreleasehook(v,1, gc_scope_alert_releasehook);
  48. return 1;
  49. }
  50. #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name), gc_scope_alert_##name,nparams,tycheck}
  51. static SQRegFunction gc_scope_alert_methods[] =
  52. {
  53. _DECL_FUNC(constructor, -2, _SC("xc.")),
  54. {0,0}
  55. };
  56. #ifdef __cplusplus
  57. extern "C" {
  58. #endif
  59. SQRESULT sqext_register_dad_utils(HSQUIRRELVM v)
  60. {
  61. sq_pushstring(v,_SC("dad_utils"),-1);
  62. sq_newtable(v);
  63. sq_pushstring(v,gc_scope_alert_TAG,-1);
  64. sq_newclass(v,SQFalse);
  65. sq_settypetag(v,-1,(void*)gc_scope_alert_TAG);
  66. sq_insert_reg_funcs(v, gc_scope_alert_methods);
  67. sq_rawset(v,-3);
  68. sq_rawset(v,-3);//insert dad_utils
  69. return 1;
  70. }
  71. #ifdef __cplusplus
  72. }
  73. #endif