builtin_reflect.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package goja
  2. func (r *Runtime) builtin_reflect_apply(call FunctionCall) Value {
  3. return r.toCallable(call.Argument(0))(FunctionCall{
  4. This: call.Argument(1),
  5. Arguments: r.createListFromArrayLike(call.Argument(2))})
  6. }
  7. func (r *Runtime) toConstructor(v Value) func(args []Value, newTarget *Object) *Object {
  8. if ctor := r.toObject(v).self.assertConstructor(); ctor != nil {
  9. return ctor
  10. }
  11. panic(r.NewTypeError("Value is not a constructor"))
  12. }
  13. func (r *Runtime) builtin_reflect_construct(call FunctionCall) Value {
  14. target := call.Argument(0)
  15. ctor := r.toConstructor(target)
  16. var newTarget Value
  17. if len(call.Arguments) > 2 {
  18. newTarget = call.Argument(2)
  19. r.toConstructor(newTarget)
  20. } else {
  21. newTarget = target
  22. }
  23. return ctor(r.createListFromArrayLike(call.Argument(1)), r.toObject(newTarget))
  24. }
  25. func (r *Runtime) builtin_reflect_defineProperty(call FunctionCall) Value {
  26. target := r.toObject(call.Argument(0))
  27. key := toPropertyKey(call.Argument(1))
  28. desc := r.toPropertyDescriptor(call.Argument(2))
  29. return r.toBoolean(target.defineOwnProperty(key, desc, false))
  30. }
  31. func (r *Runtime) builtin_reflect_deleteProperty(call FunctionCall) Value {
  32. target := r.toObject(call.Argument(0))
  33. key := toPropertyKey(call.Argument(1))
  34. return r.toBoolean(target.delete(key, false))
  35. }
  36. func (r *Runtime) builtin_reflect_get(call FunctionCall) Value {
  37. target := r.toObject(call.Argument(0))
  38. key := toPropertyKey(call.Argument(1))
  39. var receiver Value
  40. if len(call.Arguments) > 2 {
  41. receiver = call.Arguments[2]
  42. }
  43. return target.get(key, receiver)
  44. }
  45. func (r *Runtime) builtin_reflect_getOwnPropertyDescriptor(call FunctionCall) Value {
  46. target := r.toObject(call.Argument(0))
  47. key := toPropertyKey(call.Argument(1))
  48. return r.valuePropToDescriptorObject(target.getOwnProp(key))
  49. }
  50. func (r *Runtime) builtin_reflect_getPrototypeOf(call FunctionCall) Value {
  51. target := r.toObject(call.Argument(0))
  52. if proto := target.self.proto(); proto != nil {
  53. return proto
  54. }
  55. return _null
  56. }
  57. func (r *Runtime) builtin_reflect_has(call FunctionCall) Value {
  58. target := r.toObject(call.Argument(0))
  59. key := toPropertyKey(call.Argument(1))
  60. return r.toBoolean(target.hasProperty(key))
  61. }
  62. func (r *Runtime) builtin_reflect_isExtensible(call FunctionCall) Value {
  63. target := r.toObject(call.Argument(0))
  64. return r.toBoolean(target.self.isExtensible())
  65. }
  66. func (r *Runtime) builtin_reflect_ownKeys(call FunctionCall) Value {
  67. target := r.toObject(call.Argument(0))
  68. return r.newArrayValues(target.self.keys(true, nil))
  69. }
  70. func (r *Runtime) builtin_reflect_preventExtensions(call FunctionCall) Value {
  71. target := r.toObject(call.Argument(0))
  72. return r.toBoolean(target.self.preventExtensions(false))
  73. }
  74. func (r *Runtime) builtin_reflect_set(call FunctionCall) Value {
  75. target := r.toObject(call.Argument(0))
  76. var receiver Value
  77. if len(call.Arguments) >= 4 {
  78. receiver = call.Argument(3)
  79. } else {
  80. receiver = target
  81. }
  82. return r.toBoolean(target.set(call.Argument(1), call.Argument(2), receiver, false))
  83. }
  84. func (r *Runtime) builtin_reflect_setPrototypeOf(call FunctionCall) Value {
  85. target := r.toObject(call.Argument(0))
  86. var proto *Object
  87. if arg := call.Argument(1); arg != _null {
  88. proto = r.toObject(arg)
  89. }
  90. return r.toBoolean(target.self.setProto(proto, false))
  91. }
  92. func (r *Runtime) createReflect(val *Object) objectImpl {
  93. o := newBaseObjectObj(val, r.global.ObjectPrototype, classObject)
  94. o._putProp("apply", r.newNativeFunc(r.builtin_reflect_apply, "apply", 3), true, false, true)
  95. o._putProp("construct", r.newNativeFunc(r.builtin_reflect_construct, "construct", 2), true, false, true)
  96. o._putProp("defineProperty", r.newNativeFunc(r.builtin_reflect_defineProperty, "defineProperty", 3), true, false, true)
  97. o._putProp("deleteProperty", r.newNativeFunc(r.builtin_reflect_deleteProperty, "deleteProperty", 2), true, false, true)
  98. o._putProp("get", r.newNativeFunc(r.builtin_reflect_get, "get", 2), true, false, true)
  99. o._putProp("getOwnPropertyDescriptor", r.newNativeFunc(r.builtin_reflect_getOwnPropertyDescriptor, "getOwnPropertyDescriptor", 2), true, false, true)
  100. o._putProp("getPrototypeOf", r.newNativeFunc(r.builtin_reflect_getPrototypeOf, "getPrototypeOf", 1), true, false, true)
  101. o._putProp("has", r.newNativeFunc(r.builtin_reflect_has, "has", 2), true, false, true)
  102. o._putProp("isExtensible", r.newNativeFunc(r.builtin_reflect_isExtensible, "isExtensible", 1), true, false, true)
  103. o._putProp("ownKeys", r.newNativeFunc(r.builtin_reflect_ownKeys, "ownKeys", 1), true, false, true)
  104. o._putProp("preventExtensions", r.newNativeFunc(r.builtin_reflect_preventExtensions, "preventExtensions", 1), true, false, true)
  105. o._putProp("set", r.newNativeFunc(r.builtin_reflect_set, "set", 3), true, false, true)
  106. o._putProp("setPrototypeOf", r.newNativeFunc(r.builtin_reflect_setPrototypeOf, "setPrototypeOf", 2), true, false, true)
  107. o._putSym(SymToStringTag, valueProp(asciiString("Reflect"), false, false, true))
  108. return o
  109. }
  110. func (r *Runtime) getReflect() *Object {
  111. ret := r.global.Reflect
  112. if ret == nil {
  113. ret = &Object{runtime: r}
  114. r.global.Reflect = ret
  115. ret.self = r.createReflect(ret)
  116. }
  117. return ret
  118. }