Reflect.hx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * Copyright (C)2005-2019 Haxe Foundation
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  20. * DEALINGS IN THE SOFTWARE.
  21. */
  22. @:coreApi
  23. class Reflect {
  24. public static function hasField(o:Dynamic, field:String):Bool {
  25. if (field == null)
  26. return false;
  27. var hash = @:privateAccess field.bytes.hash();
  28. return hl.Api.hasField(o, hash);
  29. }
  30. public static function field(o:Dynamic, field:String):Dynamic {
  31. if (field == null)
  32. return null;
  33. var hash = @:privateAccess field.bytes.hash();
  34. return hl.Api.getField(o, hash);
  35. }
  36. public static function setField(o:Dynamic, field:String, value:Dynamic):Void {
  37. var hash = @:privateAccess field.bytes.hash();
  38. hl.Api.setField(o, hash, value);
  39. }
  40. public static function getProperty(o:Dynamic, field:String):Dynamic {
  41. var f:Dynamic = Reflect.field(o, "get_" + field);
  42. if (f != null)
  43. return f();
  44. return Reflect.field(o, field);
  45. }
  46. public static function setProperty(o:Dynamic, field:String, value:Dynamic):Void {
  47. var f:Dynamic = Reflect.field(o, "set_" + field);
  48. if (f != null)
  49. f(value);
  50. else
  51. setField(o, field, value);
  52. }
  53. public static function callMethod(o:Dynamic, func:haxe.Constraints.Function, args:Array<Dynamic>):Dynamic {
  54. var args:hl.types.ArrayDyn = cast args;
  55. var ft = hl.Type.getDynamic(func);
  56. if (ft.kind != HFun)
  57. throw "Invalid function " + func;
  58. var count = args.length;
  59. var need = ft.getArgsCount();
  60. var nargs = count < need ? need : count;
  61. var cval:Dynamic = hl.Api.getClosureValue(func);
  62. if (cval != null) {
  63. func = hl.Api.noClosure(func);
  64. nargs++;
  65. }
  66. var a = new hl.NativeArray<Dynamic>(nargs);
  67. if (cval == null) {
  68. for (i in 0...count)
  69. a[i] = args.getDyn(i);
  70. } else {
  71. a[0] = cval;
  72. for (i in 0...count)
  73. a[i + 1] = args.getDyn(i);
  74. }
  75. return hl.Api.callMethod(func, a);
  76. }
  77. @:hlNative("std", "obj_fields") static function getObjectFields(v:Dynamic):hl.NativeArray<hl.Bytes> {
  78. return null;
  79. }
  80. public static function fields(o:Dynamic):Array<String> {
  81. var fields = getObjectFields(o);
  82. if (fields == null)
  83. return [];
  84. return [for (f in fields) @:privateAccess String.fromUCS2(f)];
  85. }
  86. public static inline function isFunction(f:Dynamic):Bool {
  87. return hl.Type.getDynamic(f).kind == HFun;
  88. }
  89. @:hlNative("std", "dyn_compare")
  90. public static function compare<T>(a:T, b:T):Int {
  91. return 0;
  92. }
  93. @:hlNative("std", "fun_compare")
  94. public static function compareMethods(f1:Dynamic, f2:Dynamic):Bool {
  95. return false;
  96. }
  97. public static function isObject(v:Dynamic):Bool {
  98. var t = hl.Type.getDynamic(v);
  99. return switch (t.kind) {
  100. case HObj, HDynObj, HVirtual: true;
  101. default: false;
  102. }
  103. }
  104. public static function isEnumValue(v:Dynamic):Bool {
  105. var t = hl.Type.getDynamic(v);
  106. return t.kind == HEnum;
  107. }
  108. public static function deleteField(o:Dynamic, field:String):Bool {
  109. return hl.Api.deleteField(o, @:privateAccess field.bytes.hash());
  110. }
  111. @:hlNative("std", "obj_copy")
  112. public static function copy<T>(o:Null<T>):Null<T> {
  113. return null;
  114. }
  115. @:overload(function(f:Array<Dynamic>->Void):Dynamic {})
  116. extern public static function makeVarArgs(f:Array<Dynamic>->Dynamic):Dynamic;
  117. @:ifFeature("Reflect.makeVarArgs") static function _makeVarArgs(f:Array<Dynamic>->Dynamic):Dynamic {
  118. return hl.Api.makeVarArgs(function(args:hl.NativeArray<Dynamic>) {
  119. var arr = hl.types.ArrayDyn.alloc(hl.types.ArrayObj.alloc(args), true);
  120. return f(cast arr);
  121. });
  122. }
  123. }