builtin_object.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. package goja
  2. import (
  3. "fmt"
  4. )
  5. func (r *Runtime) builtin_Object(args []Value, newTarget *Object) *Object {
  6. if newTarget != nil && newTarget != r.global.Object {
  7. proto := r.getPrototypeFromCtor(newTarget, nil, r.global.ObjectPrototype)
  8. return r.newBaseObject(proto, classObject).val
  9. }
  10. if len(args) > 0 {
  11. arg := args[0]
  12. if arg != _undefined && arg != _null {
  13. return arg.ToObject(r)
  14. }
  15. }
  16. return r.NewObject()
  17. }
  18. func (r *Runtime) object_getPrototypeOf(call FunctionCall) Value {
  19. o := call.Argument(0).ToObject(r)
  20. p := o.self.proto()
  21. if p == nil {
  22. return _null
  23. }
  24. return p
  25. }
  26. func (r *Runtime) valuePropToDescriptorObject(desc Value) Value {
  27. if desc == nil {
  28. return _undefined
  29. }
  30. var writable, configurable, enumerable, accessor bool
  31. var get, set *Object
  32. var value Value
  33. if v, ok := desc.(*valueProperty); ok {
  34. writable = v.writable
  35. configurable = v.configurable
  36. enumerable = v.enumerable
  37. accessor = v.accessor
  38. value = v.value
  39. get = v.getterFunc
  40. set = v.setterFunc
  41. } else {
  42. writable = true
  43. configurable = true
  44. enumerable = true
  45. value = desc
  46. }
  47. ret := r.NewObject()
  48. obj := ret.self
  49. if !accessor {
  50. obj.setOwnStr("value", value, false)
  51. obj.setOwnStr("writable", r.toBoolean(writable), false)
  52. } else {
  53. if get != nil {
  54. obj.setOwnStr("get", get, false)
  55. } else {
  56. obj.setOwnStr("get", _undefined, false)
  57. }
  58. if set != nil {
  59. obj.setOwnStr("set", set, false)
  60. } else {
  61. obj.setOwnStr("set", _undefined, false)
  62. }
  63. }
  64. obj.setOwnStr("enumerable", r.toBoolean(enumerable), false)
  65. obj.setOwnStr("configurable", r.toBoolean(configurable), false)
  66. return ret
  67. }
  68. func (r *Runtime) object_getOwnPropertyDescriptor(call FunctionCall) Value {
  69. o := call.Argument(0).ToObject(r)
  70. propName := toPropertyKey(call.Argument(1))
  71. return r.valuePropToDescriptorObject(o.getOwnProp(propName))
  72. }
  73. func (r *Runtime) object_getOwnPropertyDescriptors(call FunctionCall) Value {
  74. o := call.Argument(0).ToObject(r)
  75. result := r.newBaseObject(r.global.ObjectPrototype, classObject).val
  76. for item, next := o.self.iterateKeys()(); next != nil; item, next = next() {
  77. var prop Value
  78. if item.value == nil {
  79. prop = o.getOwnProp(item.name)
  80. if prop == nil {
  81. continue
  82. }
  83. } else {
  84. prop = item.value
  85. }
  86. descriptor := r.valuePropToDescriptorObject(prop)
  87. if descriptor != _undefined {
  88. createDataPropertyOrThrow(result, item.name, descriptor)
  89. }
  90. }
  91. return result
  92. }
  93. func (r *Runtime) object_getOwnPropertyNames(call FunctionCall) Value {
  94. obj := call.Argument(0).ToObject(r)
  95. return r.newArrayValues(obj.self.stringKeys(true, nil))
  96. }
  97. func (r *Runtime) object_getOwnPropertySymbols(call FunctionCall) Value {
  98. obj := call.Argument(0).ToObject(r)
  99. return r.newArrayValues(obj.self.symbols(true, nil))
  100. }
  101. func (r *Runtime) toValueProp(v Value) *valueProperty {
  102. if v == nil || v == _undefined {
  103. return nil
  104. }
  105. obj := r.toObject(v)
  106. getter := obj.self.getStr("get", nil)
  107. setter := obj.self.getStr("set", nil)
  108. writable := obj.self.getStr("writable", nil)
  109. value := obj.self.getStr("value", nil)
  110. if (getter != nil || setter != nil) && (value != nil || writable != nil) {
  111. r.typeErrorResult(true, "Invalid property descriptor. Cannot both specify accessors and a value or writable attribute")
  112. }
  113. ret := &valueProperty{}
  114. if writable != nil && writable.ToBoolean() {
  115. ret.writable = true
  116. }
  117. if e := obj.self.getStr("enumerable", nil); e != nil && e.ToBoolean() {
  118. ret.enumerable = true
  119. }
  120. if c := obj.self.getStr("configurable", nil); c != nil && c.ToBoolean() {
  121. ret.configurable = true
  122. }
  123. ret.value = value
  124. if getter != nil && getter != _undefined {
  125. o := r.toObject(getter)
  126. if _, ok := o.self.assertCallable(); !ok {
  127. r.typeErrorResult(true, "getter must be a function")
  128. }
  129. ret.getterFunc = o
  130. }
  131. if setter != nil && setter != _undefined {
  132. o := r.toObject(setter)
  133. if _, ok := o.self.assertCallable(); !ok {
  134. r.typeErrorResult(true, "setter must be a function")
  135. }
  136. ret.setterFunc = o
  137. }
  138. if ret.getterFunc != nil || ret.setterFunc != nil {
  139. ret.accessor = true
  140. }
  141. return ret
  142. }
  143. func (r *Runtime) toPropertyDescriptor(v Value) (ret PropertyDescriptor) {
  144. if o, ok := v.(*Object); ok {
  145. descr := o.self
  146. // Save the original descriptor for reference
  147. ret.jsDescriptor = o
  148. ret.Value = descr.getStr("value", nil)
  149. if p := descr.getStr("writable", nil); p != nil {
  150. ret.Writable = ToFlag(p.ToBoolean())
  151. }
  152. if p := descr.getStr("enumerable", nil); p != nil {
  153. ret.Enumerable = ToFlag(p.ToBoolean())
  154. }
  155. if p := descr.getStr("configurable", nil); p != nil {
  156. ret.Configurable = ToFlag(p.ToBoolean())
  157. }
  158. ret.Getter = descr.getStr("get", nil)
  159. ret.Setter = descr.getStr("set", nil)
  160. if ret.Getter != nil && ret.Getter != _undefined {
  161. if _, ok := r.toObject(ret.Getter).self.assertCallable(); !ok {
  162. r.typeErrorResult(true, "getter must be a function")
  163. }
  164. }
  165. if ret.Setter != nil && ret.Setter != _undefined {
  166. if _, ok := r.toObject(ret.Setter).self.assertCallable(); !ok {
  167. r.typeErrorResult(true, "setter must be a function")
  168. }
  169. }
  170. if (ret.Getter != nil || ret.Setter != nil) && (ret.Value != nil || ret.Writable != FLAG_NOT_SET) {
  171. r.typeErrorResult(true, "Invalid property descriptor. Cannot both specify accessors and a value or writable attribute")
  172. }
  173. } else {
  174. r.typeErrorResult(true, "Property description must be an object: %s", v.String())
  175. }
  176. return
  177. }
  178. func (r *Runtime) _defineProperties(o *Object, p Value) {
  179. type propItem struct {
  180. name Value
  181. prop PropertyDescriptor
  182. }
  183. props := p.ToObject(r)
  184. var list []propItem
  185. for item, next := iterateEnumerableProperties(props)(); next != nil; item, next = next() {
  186. list = append(list, propItem{
  187. name: item.name,
  188. prop: r.toPropertyDescriptor(item.value),
  189. })
  190. }
  191. for _, prop := range list {
  192. o.defineOwnProperty(prop.name, prop.prop, true)
  193. }
  194. }
  195. func (r *Runtime) object_create(call FunctionCall) Value {
  196. var proto *Object
  197. if arg := call.Argument(0); arg != _null {
  198. if o, ok := arg.(*Object); ok {
  199. proto = o
  200. } else {
  201. r.typeErrorResult(true, "Object prototype may only be an Object or null: %s", arg.String())
  202. }
  203. }
  204. o := r.newBaseObject(proto, classObject).val
  205. if props := call.Argument(1); props != _undefined {
  206. r._defineProperties(o, props)
  207. }
  208. return o
  209. }
  210. func (r *Runtime) object_defineProperty(call FunctionCall) (ret Value) {
  211. if obj, ok := call.Argument(0).(*Object); ok {
  212. descr := r.toPropertyDescriptor(call.Argument(2))
  213. obj.defineOwnProperty(toPropertyKey(call.Argument(1)), descr, true)
  214. ret = call.Argument(0)
  215. } else {
  216. r.typeErrorResult(true, "Object.defineProperty called on non-object")
  217. }
  218. return
  219. }
  220. func (r *Runtime) object_defineProperties(call FunctionCall) Value {
  221. obj := r.toObject(call.Argument(0))
  222. r._defineProperties(obj, call.Argument(1))
  223. return obj
  224. }
  225. func (r *Runtime) object_seal(call FunctionCall) Value {
  226. // ES6
  227. arg := call.Argument(0)
  228. if obj, ok := arg.(*Object); ok {
  229. obj.self.preventExtensions(true)
  230. descr := PropertyDescriptor{
  231. Configurable: FLAG_FALSE,
  232. }
  233. for item, next := obj.self.iterateKeys()(); next != nil; item, next = next() {
  234. if prop, ok := item.value.(*valueProperty); ok {
  235. prop.configurable = false
  236. } else {
  237. obj.defineOwnProperty(item.name, descr, true)
  238. }
  239. }
  240. return obj
  241. }
  242. return arg
  243. }
  244. func (r *Runtime) object_freeze(call FunctionCall) Value {
  245. arg := call.Argument(0)
  246. if obj, ok := arg.(*Object); ok {
  247. obj.self.preventExtensions(true)
  248. for item, next := obj.self.iterateKeys()(); next != nil; item, next = next() {
  249. if prop, ok := item.value.(*valueProperty); ok {
  250. prop.configurable = false
  251. if !prop.accessor {
  252. prop.writable = false
  253. }
  254. } else {
  255. prop := obj.getOwnProp(item.name)
  256. descr := PropertyDescriptor{
  257. Configurable: FLAG_FALSE,
  258. }
  259. if prop, ok := prop.(*valueProperty); ok && prop.accessor {
  260. // no-op
  261. } else {
  262. descr.Writable = FLAG_FALSE
  263. }
  264. obj.defineOwnProperty(item.name, descr, true)
  265. }
  266. }
  267. return obj
  268. } else {
  269. // ES6 behavior
  270. return arg
  271. }
  272. }
  273. func (r *Runtime) object_preventExtensions(call FunctionCall) (ret Value) {
  274. arg := call.Argument(0)
  275. if obj, ok := arg.(*Object); ok {
  276. obj.self.preventExtensions(true)
  277. }
  278. return arg
  279. }
  280. func (r *Runtime) object_isSealed(call FunctionCall) Value {
  281. if obj, ok := call.Argument(0).(*Object); ok {
  282. if obj.self.isExtensible() {
  283. return valueFalse
  284. }
  285. for item, next := obj.self.iterateKeys()(); next != nil; item, next = next() {
  286. var prop Value
  287. if item.value == nil {
  288. prop = obj.getOwnProp(item.name)
  289. if prop == nil {
  290. continue
  291. }
  292. } else {
  293. prop = item.value
  294. }
  295. if prop, ok := prop.(*valueProperty); ok {
  296. if prop.configurable {
  297. return valueFalse
  298. }
  299. } else {
  300. return valueFalse
  301. }
  302. }
  303. }
  304. return valueTrue
  305. }
  306. func (r *Runtime) object_isFrozen(call FunctionCall) Value {
  307. if obj, ok := call.Argument(0).(*Object); ok {
  308. if obj.self.isExtensible() {
  309. return valueFalse
  310. }
  311. for item, next := obj.self.iterateKeys()(); next != nil; item, next = next() {
  312. var prop Value
  313. if item.value == nil {
  314. prop = obj.getOwnProp(item.name)
  315. if prop == nil {
  316. continue
  317. }
  318. } else {
  319. prop = item.value
  320. }
  321. if prop, ok := prop.(*valueProperty); ok {
  322. if prop.configurable || prop.value != nil && prop.writable {
  323. return valueFalse
  324. }
  325. } else {
  326. return valueFalse
  327. }
  328. }
  329. }
  330. return valueTrue
  331. }
  332. func (r *Runtime) object_isExtensible(call FunctionCall) Value {
  333. if obj, ok := call.Argument(0).(*Object); ok {
  334. if obj.self.isExtensible() {
  335. return valueTrue
  336. }
  337. return valueFalse
  338. } else {
  339. // ES6
  340. //r.typeErrorResult(true, "Object.isExtensible called on non-object")
  341. return valueFalse
  342. }
  343. }
  344. func (r *Runtime) object_keys(call FunctionCall) Value {
  345. obj := call.Argument(0).ToObject(r)
  346. return r.newArrayValues(obj.self.stringKeys(false, nil))
  347. }
  348. func (r *Runtime) object_entries(call FunctionCall) Value {
  349. obj := call.Argument(0).ToObject(r)
  350. var values []Value
  351. for item, next := iterateEnumerableStringProperties(obj)(); next != nil; item, next = next() {
  352. values = append(values, r.newArrayValues([]Value{item.name, item.value}))
  353. }
  354. return r.newArrayValues(values)
  355. }
  356. func (r *Runtime) object_values(call FunctionCall) Value {
  357. obj := call.Argument(0).ToObject(r)
  358. var values []Value
  359. for item, next := iterateEnumerableStringProperties(obj)(); next != nil; item, next = next() {
  360. values = append(values, item.value)
  361. }
  362. return r.newArrayValues(values)
  363. }
  364. func (r *Runtime) objectproto_hasOwnProperty(call FunctionCall) Value {
  365. p := toPropertyKey(call.Argument(0))
  366. o := call.This.ToObject(r)
  367. if o.hasOwnProperty(p) {
  368. return valueTrue
  369. } else {
  370. return valueFalse
  371. }
  372. }
  373. func (r *Runtime) objectproto_isPrototypeOf(call FunctionCall) Value {
  374. if v, ok := call.Argument(0).(*Object); ok {
  375. o := call.This.ToObject(r)
  376. for {
  377. v = v.self.proto()
  378. if v == nil {
  379. break
  380. }
  381. if v == o {
  382. return valueTrue
  383. }
  384. }
  385. }
  386. return valueFalse
  387. }
  388. func (r *Runtime) objectproto_propertyIsEnumerable(call FunctionCall) Value {
  389. p := toPropertyKey(call.Argument(0))
  390. o := call.This.ToObject(r)
  391. pv := o.getOwnProp(p)
  392. if pv == nil {
  393. return valueFalse
  394. }
  395. if prop, ok := pv.(*valueProperty); ok {
  396. if !prop.enumerable {
  397. return valueFalse
  398. }
  399. }
  400. return valueTrue
  401. }
  402. func (r *Runtime) objectproto_toString(call FunctionCall) Value {
  403. switch o := call.This.(type) {
  404. case valueNull:
  405. return stringObjectNull
  406. case valueUndefined:
  407. return stringObjectUndefined
  408. default:
  409. obj := o.ToObject(r)
  410. var clsName string
  411. if isArray(obj) {
  412. clsName = classArray
  413. } else {
  414. clsName = obj.self.className()
  415. }
  416. if tag := obj.self.getSym(SymToStringTag, nil); tag != nil {
  417. if str, ok := tag.(valueString); ok {
  418. clsName = str.String()
  419. }
  420. }
  421. return newStringValue(fmt.Sprintf("[object %s]", clsName))
  422. }
  423. }
  424. func (r *Runtime) objectproto_toLocaleString(call FunctionCall) Value {
  425. toString := toMethod(r.getVStr(call.This, "toString"))
  426. return toString(FunctionCall{This: call.This})
  427. }
  428. func (r *Runtime) objectproto_getProto(call FunctionCall) Value {
  429. proto := call.This.ToObject(r).self.proto()
  430. if proto != nil {
  431. return proto
  432. }
  433. return _null
  434. }
  435. func (r *Runtime) setObjectProto(o, arg Value) {
  436. r.checkObjectCoercible(o)
  437. var proto *Object
  438. if arg != _null {
  439. if obj, ok := arg.(*Object); ok {
  440. proto = obj
  441. } else {
  442. return
  443. }
  444. }
  445. if o, ok := o.(*Object); ok {
  446. o.self.setProto(proto, true)
  447. }
  448. }
  449. func (r *Runtime) objectproto_setProto(call FunctionCall) Value {
  450. r.setObjectProto(call.This, call.Argument(0))
  451. return _undefined
  452. }
  453. func (r *Runtime) objectproto_valueOf(call FunctionCall) Value {
  454. return call.This.ToObject(r)
  455. }
  456. func (r *Runtime) object_assign(call FunctionCall) Value {
  457. to := call.Argument(0).ToObject(r)
  458. if len(call.Arguments) > 1 {
  459. for _, arg := range call.Arguments[1:] {
  460. if arg != _undefined && arg != _null {
  461. source := arg.ToObject(r)
  462. for item, next := iterateEnumerableProperties(source)(); next != nil; item, next = next() {
  463. to.setOwn(item.name, item.value, true)
  464. }
  465. }
  466. }
  467. }
  468. return to
  469. }
  470. func (r *Runtime) object_is(call FunctionCall) Value {
  471. return r.toBoolean(call.Argument(0).SameAs(call.Argument(1)))
  472. }
  473. func (r *Runtime) toProto(proto Value) *Object {
  474. if proto != _null {
  475. if obj, ok := proto.(*Object); ok {
  476. return obj
  477. } else {
  478. panic(r.NewTypeError("Object prototype may only be an Object or null: %s", proto))
  479. }
  480. }
  481. return nil
  482. }
  483. func (r *Runtime) object_setPrototypeOf(call FunctionCall) Value {
  484. o := call.Argument(0)
  485. r.checkObjectCoercible(o)
  486. proto := r.toProto(call.Argument(1))
  487. if o, ok := o.(*Object); ok {
  488. o.self.setProto(proto, true)
  489. }
  490. return o
  491. }
  492. func (r *Runtime) object_fromEntries(call FunctionCall) Value {
  493. o := call.Argument(0)
  494. r.checkObjectCoercible(o)
  495. result := r.newBaseObject(r.global.ObjectPrototype, classObject).val
  496. iter := r.getIterator(o, nil)
  497. iter.iterate(func(nextValue Value) {
  498. i0 := valueInt(0)
  499. i1 := valueInt(1)
  500. itemObj := r.toObject(nextValue)
  501. k := itemObj.self.getIdx(i0, nil)
  502. v := itemObj.self.getIdx(i1, nil)
  503. key := toPropertyKey(k)
  504. createDataPropertyOrThrow(result, key, v)
  505. })
  506. return result
  507. }
  508. func (r *Runtime) object_hasOwn(call FunctionCall) Value {
  509. o := call.Argument(0)
  510. obj := o.ToObject(r)
  511. p := toPropertyKey(call.Argument(1))
  512. if obj.hasOwnProperty(p) {
  513. return valueTrue
  514. } else {
  515. return valueFalse
  516. }
  517. }
  518. func (r *Runtime) initObject() {
  519. o := r.global.ObjectPrototype.self
  520. o._putProp("toString", r.newNativeFunc(r.objectproto_toString, nil, "toString", nil, 0), true, false, true)
  521. o._putProp("toLocaleString", r.newNativeFunc(r.objectproto_toLocaleString, nil, "toLocaleString", nil, 0), true, false, true)
  522. o._putProp("valueOf", r.newNativeFunc(r.objectproto_valueOf, nil, "valueOf", nil, 0), true, false, true)
  523. o._putProp("hasOwnProperty", r.newNativeFunc(r.objectproto_hasOwnProperty, nil, "hasOwnProperty", nil, 1), true, false, true)
  524. o._putProp("isPrototypeOf", r.newNativeFunc(r.objectproto_isPrototypeOf, nil, "isPrototypeOf", nil, 1), true, false, true)
  525. o._putProp("propertyIsEnumerable", r.newNativeFunc(r.objectproto_propertyIsEnumerable, nil, "propertyIsEnumerable", nil, 1), true, false, true)
  526. o.defineOwnPropertyStr(__proto__, PropertyDescriptor{
  527. Getter: r.newNativeFunc(r.objectproto_getProto, nil, "get __proto__", nil, 0),
  528. Setter: r.newNativeFunc(r.objectproto_setProto, nil, "set __proto__", nil, 1),
  529. Configurable: FLAG_TRUE,
  530. }, true)
  531. r.global.Object = r.newNativeConstructOnly(nil, r.builtin_Object, r.global.ObjectPrototype, "Object", 1).val
  532. r.global.ObjectPrototype.self._putProp("constructor", r.global.Object, true, false, true)
  533. o = r.global.Object.self
  534. o._putProp("assign", r.newNativeFunc(r.object_assign, nil, "assign", nil, 2), true, false, true)
  535. o._putProp("defineProperty", r.newNativeFunc(r.object_defineProperty, nil, "defineProperty", nil, 3), true, false, true)
  536. o._putProp("defineProperties", r.newNativeFunc(r.object_defineProperties, nil, "defineProperties", nil, 2), true, false, true)
  537. o._putProp("entries", r.newNativeFunc(r.object_entries, nil, "entries", nil, 1), true, false, true)
  538. o._putProp("getOwnPropertyDescriptor", r.newNativeFunc(r.object_getOwnPropertyDescriptor, nil, "getOwnPropertyDescriptor", nil, 2), true, false, true)
  539. o._putProp("getOwnPropertyDescriptors", r.newNativeFunc(r.object_getOwnPropertyDescriptors, nil, "getOwnPropertyDescriptors", nil, 1), true, false, true)
  540. o._putProp("getPrototypeOf", r.newNativeFunc(r.object_getPrototypeOf, nil, "getPrototypeOf", nil, 1), true, false, true)
  541. o._putProp("is", r.newNativeFunc(r.object_is, nil, "is", nil, 2), true, false, true)
  542. o._putProp("getOwnPropertyNames", r.newNativeFunc(r.object_getOwnPropertyNames, nil, "getOwnPropertyNames", nil, 1), true, false, true)
  543. o._putProp("getOwnPropertySymbols", r.newNativeFunc(r.object_getOwnPropertySymbols, nil, "getOwnPropertySymbols", nil, 1), true, false, true)
  544. o._putProp("create", r.newNativeFunc(r.object_create, nil, "create", nil, 2), true, false, true)
  545. o._putProp("seal", r.newNativeFunc(r.object_seal, nil, "seal", nil, 1), true, false, true)
  546. o._putProp("freeze", r.newNativeFunc(r.object_freeze, nil, "freeze", nil, 1), true, false, true)
  547. o._putProp("preventExtensions", r.newNativeFunc(r.object_preventExtensions, nil, "preventExtensions", nil, 1), true, false, true)
  548. o._putProp("isSealed", r.newNativeFunc(r.object_isSealed, nil, "isSealed", nil, 1), true, false, true)
  549. o._putProp("isFrozen", r.newNativeFunc(r.object_isFrozen, nil, "isFrozen", nil, 1), true, false, true)
  550. o._putProp("isExtensible", r.newNativeFunc(r.object_isExtensible, nil, "isExtensible", nil, 1), true, false, true)
  551. o._putProp("keys", r.newNativeFunc(r.object_keys, nil, "keys", nil, 1), true, false, true)
  552. o._putProp("setPrototypeOf", r.newNativeFunc(r.object_setPrototypeOf, nil, "setPrototypeOf", nil, 2), true, false, true)
  553. o._putProp("values", r.newNativeFunc(r.object_values, nil, "values", nil, 1), true, false, true)
  554. o._putProp("fromEntries", r.newNativeFunc(r.object_fromEntries, nil, "fromEntries", nil, 1), true, false, true)
  555. o._putProp("hasOwn", r.newNativeFunc(r.object_hasOwn, nil, "hasOwn", nil, 2), true, false, true)
  556. r.addToGlobal("Object", r.global.Object)
  557. }