You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

class_dec.js 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // copied from \ign\xf\nginx_tx\j9_dep\i0.js
  2. glob_u.cls_dec = glob_u.cls_dec || {
  3. orig_map:new Map(),
  4. }
  5. glob_u.cls_dec.get_proto_chain = function get_proto_chain(cls){
  6. var r = {
  7. arr:[],
  8. arr_:[],
  9. }
  10. var _cls
  11. if (typeof(cls.__proto__) == "function"){
  12. _cls = cls.prototype
  13. } else {
  14. _cls = cls.__proto__
  15. }
  16. // r.arr.push(_cls)
  17. while (_cls != Object.prototype){
  18. if (r.arr.includes(_cls)){
  19. clog("CLS includes",cls)
  20. break
  21. }
  22. r.arr.push(_cls)
  23. _cls = _cls.__proto__
  24. r.arr_.push(_cls)
  25. }
  26. return r
  27. }
  28. function save_orig_class(cls){
  29. var m = glob_u.cls_dec.orig_map
  30. var _cls = cls.prototype
  31. if (m.has(_cls)){
  32. clog("cls already saved",_cls)
  33. return
  34. }
  35. var o = {
  36. methods:{},
  37. // methods:{},
  38. // desc:
  39. }
  40. m.set(_cls,o)
  41. o.desc = Object.getOwnPropertyDescriptors(_cls)
  42. o.proto_chain = glob_u.cls_dec.get_proto_chain(cls)
  43. var k,v
  44. for ([k,v] of Object.entries(o.desc)){
  45. o.methods[k] = v.value
  46. }
  47. o.inherited_methods = {}
  48. }
  49. function dec_class_method_v2(cls,fn_name,fn1=nop,fn2=nop,o={}){
  50. var _cls = cls.prototype
  51. clog("j9_",{_cls,cls})
  52. if (!glob_u.cls_dec.orig_map.has(_cls)){
  53. save_orig_class(cls)
  54. }
  55. var ocls = glob_u.cls_dec.orig_map.get(_cls)
  56. // var orig_method = ocls.methods[fn_name]
  57. var orig_method = ocls.methods[fn_name] || ocls.inherited_methods[fn_name]
  58. if (!orig_method && _cls[fn_name]){
  59. orig_method = ocls.inherited_methods[fn_name] = _cls[fn_name]
  60. }
  61. // cls.prototype[fn_name] = _method_dec_v3(orig_method,fn1,fn2,fn_name,cls)
  62. _cls[fn_name] = _method_dec_v1(orig_method,fn1,fn2,fn_name,_cls,o)
  63. // cls[fn_name].ao = {orig_method,fn1,fn2,fn_name,cls,o}
  64. }
  65. function dec_class_method_v1(cls,fn_name,fn1=nop,fn2=nop,o={}){
  66. var ocls = glob_u.cls_dec.orig_map.get(cls)
  67. // var orig_method = ocls.methods[fn_name]
  68. var orig_method = ocls.methods[fn_name] || ocls.inherited_methods[fn_name]
  69. if (!orig_method && cls[fn_name]){
  70. orig_method = ocls.inherited_methods[fn_name] = cls[fn_name]
  71. }
  72. // cls.prototype[fn_name] = _method_dec_v3(orig_method,fn1,fn2,fn_name,cls)
  73. cls[fn_name] = _method_dec_v1(orig_method,fn1,fn2,fn_name,cls,o)
  74. // cls[fn_name].ao = {orig_method,fn1,fn2,fn_name,cls,o}
  75. }
  76. function dec_class_method_v0(cls,fn_name,fn1=nop,fn2=nop,o={}){
  77. var ocls = glob_u.cls_dec.orig_map.get(cls)
  78. // var orig_method = ocls.methods[fn_name]
  79. clog("j9_",ocls)
  80. var orig_method = ocls.methods[fn_name] || ocls.inherited_methods[fn_name]
  81. if (!orig_method && cls[fn_name]){
  82. orig_method = ocls.inherited_methods[fn_name] = cls[fn_name]
  83. }
  84. // cls.prototype[fn_name] = _method_dec_v3(orig_method,fn1,fn2,fn_name,cls)
  85. cls[fn_name] = _method_dec_v0(orig_method,fn1,fn2,fn_name,cls,o)
  86. // cls[fn_name].ao = {orig_method,fn1,fn2,fn_name,cls,o}
  87. }
  88. // [ret_flag,ret]
  89. function _method_dec_v00(fn,fn1,fn2,fn_name,cls,o){
  90. var args_dec = {fn,fn1,fn2,fn_name,cls,o}
  91. return function() {
  92. try {
  93. // const ret1 = fn1 ? fn1({that:this, args:arguments,args_dec}) : 0
  94. const ret1 = fn1 ? fn1.call(this,{that:this, args:arguments,args_dec}) : 0
  95. if (ret1?.ret_flag == "ret"){
  96. return ret1.ret
  97. }
  98. const ret = fn.apply(this, arguments);
  99. // const ret2 = fn2 ? fn2({that:this, args:arguments,args_dec,ret,ret1}) : 0
  100. const ret2 = fn2 ? fn2.call(this,{that:this, args:arguments,args_dec,ret,ret1}) : 0
  101. if (ret2?.ret_flag == "ret"){
  102. return ret2.ret
  103. }
  104. return ret
  105. } catch (err){
  106. console.error("_method_dec_v0 ERR:",err)
  107. return fn.apply(this, arguments);
  108. }
  109. }
  110. }
  111. function _method_dec_v0(fn,fn1,fn2,fn_name,cls,o){
  112. // clog("IDK?",{fn,fn1,fn2,fn_name,cls,o})
  113. var args_dec = {fn,fn1,fn2,fn_name,cls,o}
  114. const ret = function() {
  115. try {
  116. const ret1 = fn1 ? fn1({that:this, args:arguments,args_dec}) : 0
  117. // const ret1 = fn1 ? fn1.call(this,{that:this, args:arguments,args_dec}) : 0
  118. if (ret1?.ret_flag == "ret"){
  119. return ret1.ret
  120. }
  121. const ret = fn.apply(this, arguments);
  122. const ret2 = fn2 ? fn2({that:this, args:arguments,args_dec,ret,ret1}) : 0
  123. // const ret2 = fn2 ? fn2.call(this,{that:this, args:arguments,args_dec,ret,ret1}) : 0
  124. if (ret2?.ret_flag == "ret"){
  125. return ret2.ret
  126. }
  127. return ret
  128. } catch (err){
  129. console.error("_method_dec_v0 ERR:",err)
  130. return fn.apply(this, arguments);
  131. }
  132. }
  133. ret.isDecorator = true
  134. return ret
  135. }
  136. function _method_dec_v1(fn,fn1,fn2,fn_name,cls,o){
  137. // clog("IDK?",{fn,fn1,fn2,fn_name,cls,o})
  138. var args_dec = {fn,fn1,fn2,fn_name,cls,o}
  139. const ret = function() {
  140. try {
  141. const ret1 = fn1 ? fn1.apply(this,[{that:this, args:arguments,args_dec}]) : 0
  142. // const ret1 = fn1 ? fn1.call(this,{that:this, args:arguments,args_dec}) : 0
  143. if (ret1?.ret_flag == "ret"){
  144. return ret1.ret
  145. }
  146. const ret = fn.apply(this, arguments);
  147. const ret2 = fn2 ? fn2.apply(this,[{that:this, args:arguments,args_dec,ret,ret1}]) : 0
  148. // const ret2 = fn2 ? fn2.call(this,{that:this, args:arguments,args_dec,ret,ret1}) : 0
  149. if (ret2?.ret_flag == "ret"){
  150. return ret2.ret
  151. }
  152. return ret
  153. } catch (err){
  154. console.error("_method_dec_v0 ERR:",err)
  155. return fn.apply(this, arguments);
  156. }
  157. }
  158. ret.isDecorator = true
  159. return ret
  160. }