feature_reflect_object.go 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "io"
  5. "reflect"
  6. "strings"
  7. "unicode"
  8. "unsafe"
  9. )
  10. func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (Encoder, error) {
  11. structEncoder_ := &structEncoder{}
  12. fields := map[string]*structFieldEncoder{}
  13. for _, field := range listStructFields(typ) {
  14. fieldEncoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
  15. var extensionProvidedFieldNames []string
  16. for _, extension := range extensions {
  17. alternativeFieldNames, fun, _ := extension(typ, field)
  18. if alternativeFieldNames != nil {
  19. extensionProvidedFieldNames = alternativeFieldNames
  20. }
  21. if fun != nil {
  22. fieldEncoders[fieldEncoderKey] = &funcEncoder{fun}
  23. }
  24. }
  25. for _, extension := range cfg.extensions {
  26. alternativeFieldNames, fun, _ := extension(typ, field)
  27. if alternativeFieldNames != nil {
  28. extensionProvidedFieldNames = alternativeFieldNames
  29. }
  30. if fun != nil {
  31. fieldEncoders[fieldEncoderKey] = &funcEncoder{fun}
  32. }
  33. }
  34. tagParts := strings.Split(field.Tag.Get("json"), ",")
  35. // if fieldNames set by extension, use theirs, otherwise try tags
  36. fieldNames := calcFieldNames(field.Name, tagParts[0], extensionProvidedFieldNames)
  37. omitempty := false
  38. for _, tagPart := range tagParts {
  39. if tagPart == "omitempty" {
  40. omitempty = true
  41. }
  42. }
  43. encoder := fieldEncoders[fieldEncoderKey]
  44. var err error
  45. if encoder == nil && len(fieldNames) > 0 {
  46. encoder, err = encoderOfType(cfg, field.Type)
  47. if err != nil {
  48. return prefix(fmt.Sprintf("{%s}", field.Name)).addToEncoder(encoder, err)
  49. }
  50. // map is stored as pointer in the struct
  51. if field.Type.Kind() == reflect.Map {
  52. encoder = &optionalEncoder{encoder}
  53. }
  54. }
  55. for _, fieldName := range fieldNames {
  56. fields[fieldName] = &structFieldEncoder{field, fieldName, encoder, omitempty}
  57. }
  58. }
  59. if len(fields) == 0 {
  60. return &emptyStructEncoder{}, nil
  61. }
  62. for _, field := range fields {
  63. structEncoder_.fields = append(structEncoder_.fields, field)
  64. }
  65. return structEncoder_, nil
  66. }
  67. func listStructFields(typ reflect.Type) []*reflect.StructField {
  68. fields := []*reflect.StructField{}
  69. for i := 0; i < typ.NumField(); i++ {
  70. field := typ.Field(i)
  71. if field.Anonymous {
  72. fields = append(fields, listStructFields(field.Type)...)
  73. } else {
  74. fields = append(fields, &field)
  75. }
  76. }
  77. return fields
  78. }
  79. func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (Decoder, error) {
  80. fields := map[string]*structFieldDecoder{}
  81. for i := 0; i < typ.NumField(); i++ {
  82. field := typ.Field(i)
  83. fieldDecoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
  84. var extensionProviedFieldNames []string
  85. for _, extension := range extensions {
  86. alternativeFieldNames, _, fun := extension(typ, &field)
  87. if alternativeFieldNames != nil {
  88. extensionProviedFieldNames = alternativeFieldNames
  89. }
  90. if fun != nil {
  91. fieldDecoders[fieldDecoderKey] = &funcDecoder{fun}
  92. }
  93. }
  94. for _, extension := range cfg.extensions {
  95. alternativeFieldNames, _, fun := extension(typ, &field)
  96. if alternativeFieldNames != nil {
  97. extensionProviedFieldNames = alternativeFieldNames
  98. }
  99. if fun != nil {
  100. fieldDecoders[fieldDecoderKey] = &funcDecoder{fun}
  101. }
  102. }
  103. decoder := fieldDecoders[fieldDecoderKey]
  104. tagParts := strings.Split(field.Tag.Get("json"), ",")
  105. fieldNames := calcFieldNames(field.Name, tagParts[0], extensionProviedFieldNames)
  106. if decoder == nil && len(fieldNames) > 0 {
  107. var err error
  108. decoder, err = decoderOfType(cfg, field.Type)
  109. if err != nil {
  110. return prefix(fmt.Sprintf("{%s}", field.Name)).addToDecoder(decoder, err)
  111. }
  112. }
  113. if len(tagParts) > 1 && tagParts[1] == "string" {
  114. decoder = &stringNumberDecoder{decoder}
  115. }
  116. for _, fieldName := range fieldNames {
  117. fields[fieldName] = &structFieldDecoder{&field, decoder}
  118. }
  119. }
  120. return createStructDecoder(typ, fields)
  121. }
  122. func calcFieldNames(originalFieldName string, tagProvidedFieldName string, extensionProvidedFieldNames []string) []string {
  123. // tag => extension => exported? => original
  124. isNotExported := unicode.IsLower(rune(originalFieldName[0]))
  125. var fieldNames []string
  126. /// tagParts[0] always present, even if no tags
  127. switch tagProvidedFieldName {
  128. case "":
  129. if extensionProvidedFieldNames != nil {
  130. fieldNames = extensionProvidedFieldNames
  131. } else {
  132. if isNotExported {
  133. fieldNames = []string{}
  134. } else {
  135. fieldNames = []string{originalFieldName}
  136. }
  137. }
  138. case "-":
  139. fieldNames = []string{}
  140. default:
  141. fieldNames = []string{tagProvidedFieldName}
  142. }
  143. return fieldNames
  144. }
  145. func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder) (Decoder, error) {
  146. knownHash := map[int32]struct{}{
  147. 0: {},
  148. }
  149. switch len(fields) {
  150. case 0:
  151. return &skipDecoder{typ}, nil
  152. case 1:
  153. for fieldName, fieldDecoder := range fields {
  154. fieldHash := calcHash(fieldName)
  155. _, known := knownHash[fieldHash]
  156. if known {
  157. return &generalStructDecoder{typ, fields}, nil
  158. } else {
  159. knownHash[fieldHash] = struct{}{}
  160. }
  161. return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}, nil
  162. }
  163. case 2:
  164. var fieldHash1 int32
  165. var fieldHash2 int32
  166. var fieldDecoder1 *structFieldDecoder
  167. var fieldDecoder2 *structFieldDecoder
  168. for fieldName, fieldDecoder := range fields {
  169. fieldHash := calcHash(fieldName)
  170. _, known := knownHash[fieldHash]
  171. if known {
  172. return &generalStructDecoder{typ, fields}, nil
  173. } else {
  174. knownHash[fieldHash] = struct{}{}
  175. }
  176. if fieldHash1 == 0 {
  177. fieldHash1 = fieldHash
  178. fieldDecoder1 = fieldDecoder
  179. } else {
  180. fieldHash2 = fieldHash
  181. fieldDecoder2 = fieldDecoder
  182. }
  183. }
  184. return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}, nil
  185. case 3:
  186. var fieldName1 int32
  187. var fieldName2 int32
  188. var fieldName3 int32
  189. var fieldDecoder1 *structFieldDecoder
  190. var fieldDecoder2 *structFieldDecoder
  191. var fieldDecoder3 *structFieldDecoder
  192. for fieldName, fieldDecoder := range fields {
  193. fieldHash := calcHash(fieldName)
  194. _, known := knownHash[fieldHash]
  195. if known {
  196. return &generalStructDecoder{typ, fields}, nil
  197. } else {
  198. knownHash[fieldHash] = struct{}{}
  199. }
  200. if fieldName1 == 0 {
  201. fieldName1 = fieldHash
  202. fieldDecoder1 = fieldDecoder
  203. } else if fieldName2 == 0 {
  204. fieldName2 = fieldHash
  205. fieldDecoder2 = fieldDecoder
  206. } else {
  207. fieldName3 = fieldHash
  208. fieldDecoder3 = fieldDecoder
  209. }
  210. }
  211. return &threeFieldsStructDecoder{typ,
  212. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  213. case 4:
  214. var fieldName1 int32
  215. var fieldName2 int32
  216. var fieldName3 int32
  217. var fieldName4 int32
  218. var fieldDecoder1 *structFieldDecoder
  219. var fieldDecoder2 *structFieldDecoder
  220. var fieldDecoder3 *structFieldDecoder
  221. var fieldDecoder4 *structFieldDecoder
  222. for fieldName, fieldDecoder := range fields {
  223. fieldHash := calcHash(fieldName)
  224. _, known := knownHash[fieldHash]
  225. if known {
  226. return &generalStructDecoder{typ, fields}, nil
  227. } else {
  228. knownHash[fieldHash] = struct{}{}
  229. }
  230. if fieldName1 == 0 {
  231. fieldName1 = fieldHash
  232. fieldDecoder1 = fieldDecoder
  233. } else if fieldName2 == 0 {
  234. fieldName2 = fieldHash
  235. fieldDecoder2 = fieldDecoder
  236. } else if fieldName3 == 0 {
  237. fieldName3 = fieldHash
  238. fieldDecoder3 = fieldDecoder
  239. } else {
  240. fieldName4 = fieldHash
  241. fieldDecoder4 = fieldDecoder
  242. }
  243. }
  244. return &fourFieldsStructDecoder{typ,
  245. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  246. fieldName4, fieldDecoder4}, nil
  247. case 5:
  248. var fieldName1 int32
  249. var fieldName2 int32
  250. var fieldName3 int32
  251. var fieldName4 int32
  252. var fieldName5 int32
  253. var fieldDecoder1 *structFieldDecoder
  254. var fieldDecoder2 *structFieldDecoder
  255. var fieldDecoder3 *structFieldDecoder
  256. var fieldDecoder4 *structFieldDecoder
  257. var fieldDecoder5 *structFieldDecoder
  258. for fieldName, fieldDecoder := range fields {
  259. fieldHash := calcHash(fieldName)
  260. _, known := knownHash[fieldHash]
  261. if known {
  262. return &generalStructDecoder{typ, fields}, nil
  263. } else {
  264. knownHash[fieldHash] = struct{}{}
  265. }
  266. if fieldName1 == 0 {
  267. fieldName1 = fieldHash
  268. fieldDecoder1 = fieldDecoder
  269. } else if fieldName2 == 0 {
  270. fieldName2 = fieldHash
  271. fieldDecoder2 = fieldDecoder
  272. } else if fieldName3 == 0 {
  273. fieldName3 = fieldHash
  274. fieldDecoder3 = fieldDecoder
  275. } else if fieldName4 == 0 {
  276. fieldName4 = fieldHash
  277. fieldDecoder4 = fieldDecoder
  278. } else {
  279. fieldName5 = fieldHash
  280. fieldDecoder5 = fieldDecoder
  281. }
  282. }
  283. return &fiveFieldsStructDecoder{typ,
  284. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  285. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil
  286. case 6:
  287. var fieldName1 int32
  288. var fieldName2 int32
  289. var fieldName3 int32
  290. var fieldName4 int32
  291. var fieldName5 int32
  292. var fieldName6 int32
  293. var fieldDecoder1 *structFieldDecoder
  294. var fieldDecoder2 *structFieldDecoder
  295. var fieldDecoder3 *structFieldDecoder
  296. var fieldDecoder4 *structFieldDecoder
  297. var fieldDecoder5 *structFieldDecoder
  298. var fieldDecoder6 *structFieldDecoder
  299. for fieldName, fieldDecoder := range fields {
  300. fieldHash := calcHash(fieldName)
  301. _, known := knownHash[fieldHash]
  302. if known {
  303. return &generalStructDecoder{typ, fields}, nil
  304. } else {
  305. knownHash[fieldHash] = struct{}{}
  306. }
  307. if fieldName1 == 0 {
  308. fieldName1 = fieldHash
  309. fieldDecoder1 = fieldDecoder
  310. } else if fieldName2 == 0 {
  311. fieldName2 = fieldHash
  312. fieldDecoder2 = fieldDecoder
  313. } else if fieldName3 == 0 {
  314. fieldName3 = fieldHash
  315. fieldDecoder3 = fieldDecoder
  316. } else if fieldName4 == 0 {
  317. fieldName4 = fieldHash
  318. fieldDecoder4 = fieldDecoder
  319. } else if fieldName5 == 0 {
  320. fieldName5 = fieldHash
  321. fieldDecoder5 = fieldDecoder
  322. } else {
  323. fieldName6 = fieldHash
  324. fieldDecoder6 = fieldDecoder
  325. }
  326. }
  327. return &sixFieldsStructDecoder{typ,
  328. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  329. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil
  330. case 7:
  331. var fieldName1 int32
  332. var fieldName2 int32
  333. var fieldName3 int32
  334. var fieldName4 int32
  335. var fieldName5 int32
  336. var fieldName6 int32
  337. var fieldName7 int32
  338. var fieldDecoder1 *structFieldDecoder
  339. var fieldDecoder2 *structFieldDecoder
  340. var fieldDecoder3 *structFieldDecoder
  341. var fieldDecoder4 *structFieldDecoder
  342. var fieldDecoder5 *structFieldDecoder
  343. var fieldDecoder6 *structFieldDecoder
  344. var fieldDecoder7 *structFieldDecoder
  345. for fieldName, fieldDecoder := range fields {
  346. fieldHash := calcHash(fieldName)
  347. _, known := knownHash[fieldHash]
  348. if known {
  349. return &generalStructDecoder{typ, fields}, nil
  350. } else {
  351. knownHash[fieldHash] = struct{}{}
  352. }
  353. if fieldName1 == 0 {
  354. fieldName1 = fieldHash
  355. fieldDecoder1 = fieldDecoder
  356. } else if fieldName2 == 0 {
  357. fieldName2 = fieldHash
  358. fieldDecoder2 = fieldDecoder
  359. } else if fieldName3 == 0 {
  360. fieldName3 = fieldHash
  361. fieldDecoder3 = fieldDecoder
  362. } else if fieldName4 == 0 {
  363. fieldName4 = fieldHash
  364. fieldDecoder4 = fieldDecoder
  365. } else if fieldName5 == 0 {
  366. fieldName5 = fieldHash
  367. fieldDecoder5 = fieldDecoder
  368. } else if fieldName6 == 0 {
  369. fieldName6 = fieldHash
  370. fieldDecoder6 = fieldDecoder
  371. } else {
  372. fieldName7 = fieldHash
  373. fieldDecoder7 = fieldDecoder
  374. }
  375. }
  376. return &sevenFieldsStructDecoder{typ,
  377. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  378. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  379. fieldName7, fieldDecoder7}, nil
  380. case 8:
  381. var fieldName1 int32
  382. var fieldName2 int32
  383. var fieldName3 int32
  384. var fieldName4 int32
  385. var fieldName5 int32
  386. var fieldName6 int32
  387. var fieldName7 int32
  388. var fieldName8 int32
  389. var fieldDecoder1 *structFieldDecoder
  390. var fieldDecoder2 *structFieldDecoder
  391. var fieldDecoder3 *structFieldDecoder
  392. var fieldDecoder4 *structFieldDecoder
  393. var fieldDecoder5 *structFieldDecoder
  394. var fieldDecoder6 *structFieldDecoder
  395. var fieldDecoder7 *structFieldDecoder
  396. var fieldDecoder8 *structFieldDecoder
  397. for fieldName, fieldDecoder := range fields {
  398. fieldHash := calcHash(fieldName)
  399. _, known := knownHash[fieldHash]
  400. if known {
  401. return &generalStructDecoder{typ, fields}, nil
  402. } else {
  403. knownHash[fieldHash] = struct{}{}
  404. }
  405. if fieldName1 == 0 {
  406. fieldName1 = fieldHash
  407. fieldDecoder1 = fieldDecoder
  408. } else if fieldName2 == 0 {
  409. fieldName2 = fieldHash
  410. fieldDecoder2 = fieldDecoder
  411. } else if fieldName3 == 0 {
  412. fieldName3 = fieldHash
  413. fieldDecoder3 = fieldDecoder
  414. } else if fieldName4 == 0 {
  415. fieldName4 = fieldHash
  416. fieldDecoder4 = fieldDecoder
  417. } else if fieldName5 == 0 {
  418. fieldName5 = fieldHash
  419. fieldDecoder5 = fieldDecoder
  420. } else if fieldName6 == 0 {
  421. fieldName6 = fieldHash
  422. fieldDecoder6 = fieldDecoder
  423. } else if fieldName7 == 0 {
  424. fieldName7 = fieldHash
  425. fieldDecoder7 = fieldDecoder
  426. } else {
  427. fieldName8 = fieldHash
  428. fieldDecoder8 = fieldDecoder
  429. }
  430. }
  431. return &eightFieldsStructDecoder{typ,
  432. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  433. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  434. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil
  435. case 9:
  436. var fieldName1 int32
  437. var fieldName2 int32
  438. var fieldName3 int32
  439. var fieldName4 int32
  440. var fieldName5 int32
  441. var fieldName6 int32
  442. var fieldName7 int32
  443. var fieldName8 int32
  444. var fieldName9 int32
  445. var fieldDecoder1 *structFieldDecoder
  446. var fieldDecoder2 *structFieldDecoder
  447. var fieldDecoder3 *structFieldDecoder
  448. var fieldDecoder4 *structFieldDecoder
  449. var fieldDecoder5 *structFieldDecoder
  450. var fieldDecoder6 *structFieldDecoder
  451. var fieldDecoder7 *structFieldDecoder
  452. var fieldDecoder8 *structFieldDecoder
  453. var fieldDecoder9 *structFieldDecoder
  454. for fieldName, fieldDecoder := range fields {
  455. fieldHash := calcHash(fieldName)
  456. _, known := knownHash[fieldHash]
  457. if known {
  458. return &generalStructDecoder{typ, fields}, nil
  459. } else {
  460. knownHash[fieldHash] = struct{}{}
  461. }
  462. if fieldName1 == 0 {
  463. fieldName1 = fieldHash
  464. fieldDecoder1 = fieldDecoder
  465. } else if fieldName2 == 0 {
  466. fieldName2 = fieldHash
  467. fieldDecoder2 = fieldDecoder
  468. } else if fieldName3 == 0 {
  469. fieldName3 = fieldHash
  470. fieldDecoder3 = fieldDecoder
  471. } else if fieldName4 == 0 {
  472. fieldName4 = fieldHash
  473. fieldDecoder4 = fieldDecoder
  474. } else if fieldName5 == 0 {
  475. fieldName5 = fieldHash
  476. fieldDecoder5 = fieldDecoder
  477. } else if fieldName6 == 0 {
  478. fieldName6 = fieldHash
  479. fieldDecoder6 = fieldDecoder
  480. } else if fieldName7 == 0 {
  481. fieldName7 = fieldHash
  482. fieldDecoder7 = fieldDecoder
  483. } else if fieldName8 == 0 {
  484. fieldName8 = fieldHash
  485. fieldDecoder8 = fieldDecoder
  486. } else {
  487. fieldName9 = fieldHash
  488. fieldDecoder9 = fieldDecoder
  489. }
  490. }
  491. return &nineFieldsStructDecoder{typ,
  492. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  493. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  494. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil
  495. case 10:
  496. var fieldName1 int32
  497. var fieldName2 int32
  498. var fieldName3 int32
  499. var fieldName4 int32
  500. var fieldName5 int32
  501. var fieldName6 int32
  502. var fieldName7 int32
  503. var fieldName8 int32
  504. var fieldName9 int32
  505. var fieldName10 int32
  506. var fieldDecoder1 *structFieldDecoder
  507. var fieldDecoder2 *structFieldDecoder
  508. var fieldDecoder3 *structFieldDecoder
  509. var fieldDecoder4 *structFieldDecoder
  510. var fieldDecoder5 *structFieldDecoder
  511. var fieldDecoder6 *structFieldDecoder
  512. var fieldDecoder7 *structFieldDecoder
  513. var fieldDecoder8 *structFieldDecoder
  514. var fieldDecoder9 *structFieldDecoder
  515. var fieldDecoder10 *structFieldDecoder
  516. for fieldName, fieldDecoder := range fields {
  517. fieldHash := calcHash(fieldName)
  518. _, known := knownHash[fieldHash]
  519. if known {
  520. return &generalStructDecoder{typ, fields}, nil
  521. } else {
  522. knownHash[fieldHash] = struct{}{}
  523. }
  524. if fieldName1 == 0 {
  525. fieldName1 = fieldHash
  526. fieldDecoder1 = fieldDecoder
  527. } else if fieldName2 == 0 {
  528. fieldName2 = fieldHash
  529. fieldDecoder2 = fieldDecoder
  530. } else if fieldName3 == 0 {
  531. fieldName3 = fieldHash
  532. fieldDecoder3 = fieldDecoder
  533. } else if fieldName4 == 0 {
  534. fieldName4 = fieldHash
  535. fieldDecoder4 = fieldDecoder
  536. } else if fieldName5 == 0 {
  537. fieldName5 = fieldHash
  538. fieldDecoder5 = fieldDecoder
  539. } else if fieldName6 == 0 {
  540. fieldName6 = fieldHash
  541. fieldDecoder6 = fieldDecoder
  542. } else if fieldName7 == 0 {
  543. fieldName7 = fieldHash
  544. fieldDecoder7 = fieldDecoder
  545. } else if fieldName8 == 0 {
  546. fieldName8 = fieldHash
  547. fieldDecoder8 = fieldDecoder
  548. } else if fieldName9 == 0 {
  549. fieldName9 = fieldHash
  550. fieldDecoder9 = fieldDecoder
  551. } else {
  552. fieldName10 = fieldHash
  553. fieldDecoder10 = fieldDecoder
  554. }
  555. }
  556. return &tenFieldsStructDecoder{typ,
  557. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  558. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  559. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9,
  560. fieldName10, fieldDecoder10}, nil
  561. }
  562. return &generalStructDecoder{typ, fields}, nil
  563. }
  564. type generalStructDecoder struct {
  565. typ reflect.Type
  566. fields map[string]*structFieldDecoder
  567. }
  568. func (decoder *generalStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  569. if !iter.readObjectStart() {
  570. return
  571. }
  572. fieldBytes := iter.readObjectFieldAsBytes()
  573. field := *(*string)(unsafe.Pointer(&fieldBytes))
  574. fieldDecoder := decoder.fields[field]
  575. if fieldDecoder == nil {
  576. iter.Skip()
  577. } else {
  578. fieldDecoder.decode(ptr, iter)
  579. }
  580. for iter.nextToken() == ',' {
  581. fieldBytes = iter.readObjectFieldAsBytes()
  582. field = *(*string)(unsafe.Pointer(&fieldBytes))
  583. fieldDecoder = decoder.fields[field]
  584. if fieldDecoder == nil {
  585. iter.Skip()
  586. } else {
  587. fieldDecoder.decode(ptr, iter)
  588. }
  589. }
  590. if iter.Error != nil && iter.Error != io.EOF {
  591. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  592. }
  593. }
  594. type skipDecoder struct {
  595. typ reflect.Type
  596. }
  597. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  598. iter.Skip()
  599. if iter.Error != nil && iter.Error != io.EOF {
  600. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  601. }
  602. }
  603. type oneFieldStructDecoder struct {
  604. typ reflect.Type
  605. fieldHash int32
  606. fieldDecoder *structFieldDecoder
  607. }
  608. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  609. if !iter.readObjectStart() {
  610. return
  611. }
  612. for {
  613. if iter.readFieldHash() == decoder.fieldHash {
  614. decoder.fieldDecoder.decode(ptr, iter)
  615. } else {
  616. iter.Skip()
  617. }
  618. if iter.nextToken() != ',' {
  619. break
  620. }
  621. }
  622. if iter.Error != nil && iter.Error != io.EOF {
  623. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  624. }
  625. }
  626. type twoFieldsStructDecoder struct {
  627. typ reflect.Type
  628. fieldHash1 int32
  629. fieldDecoder1 *structFieldDecoder
  630. fieldHash2 int32
  631. fieldDecoder2 *structFieldDecoder
  632. }
  633. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  634. if !iter.readObjectStart() {
  635. return
  636. }
  637. for {
  638. switch iter.readFieldHash() {
  639. case decoder.fieldHash1:
  640. decoder.fieldDecoder1.decode(ptr, iter)
  641. case decoder.fieldHash2:
  642. decoder.fieldDecoder2.decode(ptr, iter)
  643. default:
  644. iter.Skip()
  645. }
  646. if iter.nextToken() != ',' {
  647. break
  648. }
  649. }
  650. if iter.Error != nil && iter.Error != io.EOF {
  651. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  652. }
  653. }
  654. type threeFieldsStructDecoder struct {
  655. typ reflect.Type
  656. fieldHash1 int32
  657. fieldDecoder1 *structFieldDecoder
  658. fieldHash2 int32
  659. fieldDecoder2 *structFieldDecoder
  660. fieldHash3 int32
  661. fieldDecoder3 *structFieldDecoder
  662. }
  663. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  664. if !iter.readObjectStart() {
  665. return
  666. }
  667. for {
  668. switch iter.readFieldHash() {
  669. case decoder.fieldHash1:
  670. decoder.fieldDecoder1.decode(ptr, iter)
  671. case decoder.fieldHash2:
  672. decoder.fieldDecoder2.decode(ptr, iter)
  673. case decoder.fieldHash3:
  674. decoder.fieldDecoder3.decode(ptr, iter)
  675. default:
  676. iter.Skip()
  677. }
  678. if iter.nextToken() != ',' {
  679. break
  680. }
  681. }
  682. if iter.Error != nil && iter.Error != io.EOF {
  683. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  684. }
  685. }
  686. type fourFieldsStructDecoder struct {
  687. typ reflect.Type
  688. fieldHash1 int32
  689. fieldDecoder1 *structFieldDecoder
  690. fieldHash2 int32
  691. fieldDecoder2 *structFieldDecoder
  692. fieldHash3 int32
  693. fieldDecoder3 *structFieldDecoder
  694. fieldHash4 int32
  695. fieldDecoder4 *structFieldDecoder
  696. }
  697. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  698. if !iter.readObjectStart() {
  699. return
  700. }
  701. for {
  702. switch iter.readFieldHash() {
  703. case decoder.fieldHash1:
  704. decoder.fieldDecoder1.decode(ptr, iter)
  705. case decoder.fieldHash2:
  706. decoder.fieldDecoder2.decode(ptr, iter)
  707. case decoder.fieldHash3:
  708. decoder.fieldDecoder3.decode(ptr, iter)
  709. case decoder.fieldHash4:
  710. decoder.fieldDecoder4.decode(ptr, iter)
  711. default:
  712. iter.Skip()
  713. }
  714. if iter.nextToken() != ',' {
  715. break
  716. }
  717. }
  718. if iter.Error != nil && iter.Error != io.EOF {
  719. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  720. }
  721. }
  722. type fiveFieldsStructDecoder struct {
  723. typ reflect.Type
  724. fieldHash1 int32
  725. fieldDecoder1 *structFieldDecoder
  726. fieldHash2 int32
  727. fieldDecoder2 *structFieldDecoder
  728. fieldHash3 int32
  729. fieldDecoder3 *structFieldDecoder
  730. fieldHash4 int32
  731. fieldDecoder4 *structFieldDecoder
  732. fieldHash5 int32
  733. fieldDecoder5 *structFieldDecoder
  734. }
  735. func (decoder *fiveFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  736. if !iter.readObjectStart() {
  737. return
  738. }
  739. for {
  740. switch iter.readFieldHash() {
  741. case decoder.fieldHash1:
  742. decoder.fieldDecoder1.decode(ptr, iter)
  743. case decoder.fieldHash2:
  744. decoder.fieldDecoder2.decode(ptr, iter)
  745. case decoder.fieldHash3:
  746. decoder.fieldDecoder3.decode(ptr, iter)
  747. case decoder.fieldHash4:
  748. decoder.fieldDecoder4.decode(ptr, iter)
  749. case decoder.fieldHash5:
  750. decoder.fieldDecoder5.decode(ptr, iter)
  751. default:
  752. iter.Skip()
  753. }
  754. if iter.nextToken() != ',' {
  755. break
  756. }
  757. }
  758. if iter.Error != nil && iter.Error != io.EOF {
  759. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  760. }
  761. }
  762. type sixFieldsStructDecoder struct {
  763. typ reflect.Type
  764. fieldHash1 int32
  765. fieldDecoder1 *structFieldDecoder
  766. fieldHash2 int32
  767. fieldDecoder2 *structFieldDecoder
  768. fieldHash3 int32
  769. fieldDecoder3 *structFieldDecoder
  770. fieldHash4 int32
  771. fieldDecoder4 *structFieldDecoder
  772. fieldHash5 int32
  773. fieldDecoder5 *structFieldDecoder
  774. fieldHash6 int32
  775. fieldDecoder6 *structFieldDecoder
  776. }
  777. func (decoder *sixFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  778. if !iter.readObjectStart() {
  779. return
  780. }
  781. for {
  782. switch iter.readFieldHash() {
  783. case decoder.fieldHash1:
  784. decoder.fieldDecoder1.decode(ptr, iter)
  785. case decoder.fieldHash2:
  786. decoder.fieldDecoder2.decode(ptr, iter)
  787. case decoder.fieldHash3:
  788. decoder.fieldDecoder3.decode(ptr, iter)
  789. case decoder.fieldHash4:
  790. decoder.fieldDecoder4.decode(ptr, iter)
  791. case decoder.fieldHash5:
  792. decoder.fieldDecoder5.decode(ptr, iter)
  793. case decoder.fieldHash6:
  794. decoder.fieldDecoder6.decode(ptr, iter)
  795. default:
  796. iter.Skip()
  797. }
  798. if iter.nextToken() != ',' {
  799. break
  800. }
  801. }
  802. if iter.Error != nil && iter.Error != io.EOF {
  803. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  804. }
  805. }
  806. type sevenFieldsStructDecoder struct {
  807. typ reflect.Type
  808. fieldHash1 int32
  809. fieldDecoder1 *structFieldDecoder
  810. fieldHash2 int32
  811. fieldDecoder2 *structFieldDecoder
  812. fieldHash3 int32
  813. fieldDecoder3 *structFieldDecoder
  814. fieldHash4 int32
  815. fieldDecoder4 *structFieldDecoder
  816. fieldHash5 int32
  817. fieldDecoder5 *structFieldDecoder
  818. fieldHash6 int32
  819. fieldDecoder6 *structFieldDecoder
  820. fieldHash7 int32
  821. fieldDecoder7 *structFieldDecoder
  822. }
  823. func (decoder *sevenFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  824. if !iter.readObjectStart() {
  825. return
  826. }
  827. for {
  828. switch iter.readFieldHash() {
  829. case decoder.fieldHash1:
  830. decoder.fieldDecoder1.decode(ptr, iter)
  831. case decoder.fieldHash2:
  832. decoder.fieldDecoder2.decode(ptr, iter)
  833. case decoder.fieldHash3:
  834. decoder.fieldDecoder3.decode(ptr, iter)
  835. case decoder.fieldHash4:
  836. decoder.fieldDecoder4.decode(ptr, iter)
  837. case decoder.fieldHash5:
  838. decoder.fieldDecoder5.decode(ptr, iter)
  839. case decoder.fieldHash6:
  840. decoder.fieldDecoder6.decode(ptr, iter)
  841. case decoder.fieldHash7:
  842. decoder.fieldDecoder7.decode(ptr, iter)
  843. default:
  844. iter.Skip()
  845. }
  846. if iter.nextToken() != ',' {
  847. break
  848. }
  849. }
  850. if iter.Error != nil && iter.Error != io.EOF {
  851. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  852. }
  853. }
  854. type eightFieldsStructDecoder struct {
  855. typ reflect.Type
  856. fieldHash1 int32
  857. fieldDecoder1 *structFieldDecoder
  858. fieldHash2 int32
  859. fieldDecoder2 *structFieldDecoder
  860. fieldHash3 int32
  861. fieldDecoder3 *structFieldDecoder
  862. fieldHash4 int32
  863. fieldDecoder4 *structFieldDecoder
  864. fieldHash5 int32
  865. fieldDecoder5 *structFieldDecoder
  866. fieldHash6 int32
  867. fieldDecoder6 *structFieldDecoder
  868. fieldHash7 int32
  869. fieldDecoder7 *structFieldDecoder
  870. fieldHash8 int32
  871. fieldDecoder8 *structFieldDecoder
  872. }
  873. func (decoder *eightFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  874. if !iter.readObjectStart() {
  875. return
  876. }
  877. for {
  878. switch iter.readFieldHash() {
  879. case decoder.fieldHash1:
  880. decoder.fieldDecoder1.decode(ptr, iter)
  881. case decoder.fieldHash2:
  882. decoder.fieldDecoder2.decode(ptr, iter)
  883. case decoder.fieldHash3:
  884. decoder.fieldDecoder3.decode(ptr, iter)
  885. case decoder.fieldHash4:
  886. decoder.fieldDecoder4.decode(ptr, iter)
  887. case decoder.fieldHash5:
  888. decoder.fieldDecoder5.decode(ptr, iter)
  889. case decoder.fieldHash6:
  890. decoder.fieldDecoder6.decode(ptr, iter)
  891. case decoder.fieldHash7:
  892. decoder.fieldDecoder7.decode(ptr, iter)
  893. case decoder.fieldHash8:
  894. decoder.fieldDecoder8.decode(ptr, iter)
  895. default:
  896. iter.Skip()
  897. }
  898. if iter.nextToken() != ',' {
  899. break
  900. }
  901. }
  902. if iter.Error != nil && iter.Error != io.EOF {
  903. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  904. }
  905. }
  906. type nineFieldsStructDecoder struct {
  907. typ reflect.Type
  908. fieldHash1 int32
  909. fieldDecoder1 *structFieldDecoder
  910. fieldHash2 int32
  911. fieldDecoder2 *structFieldDecoder
  912. fieldHash3 int32
  913. fieldDecoder3 *structFieldDecoder
  914. fieldHash4 int32
  915. fieldDecoder4 *structFieldDecoder
  916. fieldHash5 int32
  917. fieldDecoder5 *structFieldDecoder
  918. fieldHash6 int32
  919. fieldDecoder6 *structFieldDecoder
  920. fieldHash7 int32
  921. fieldDecoder7 *structFieldDecoder
  922. fieldHash8 int32
  923. fieldDecoder8 *structFieldDecoder
  924. fieldHash9 int32
  925. fieldDecoder9 *structFieldDecoder
  926. }
  927. func (decoder *nineFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  928. if !iter.readObjectStart() {
  929. return
  930. }
  931. for {
  932. switch iter.readFieldHash() {
  933. case decoder.fieldHash1:
  934. decoder.fieldDecoder1.decode(ptr, iter)
  935. case decoder.fieldHash2:
  936. decoder.fieldDecoder2.decode(ptr, iter)
  937. case decoder.fieldHash3:
  938. decoder.fieldDecoder3.decode(ptr, iter)
  939. case decoder.fieldHash4:
  940. decoder.fieldDecoder4.decode(ptr, iter)
  941. case decoder.fieldHash5:
  942. decoder.fieldDecoder5.decode(ptr, iter)
  943. case decoder.fieldHash6:
  944. decoder.fieldDecoder6.decode(ptr, iter)
  945. case decoder.fieldHash7:
  946. decoder.fieldDecoder7.decode(ptr, iter)
  947. case decoder.fieldHash8:
  948. decoder.fieldDecoder8.decode(ptr, iter)
  949. case decoder.fieldHash9:
  950. decoder.fieldDecoder9.decode(ptr, iter)
  951. default:
  952. iter.Skip()
  953. }
  954. if iter.nextToken() != ',' {
  955. break
  956. }
  957. }
  958. if iter.Error != nil && iter.Error != io.EOF {
  959. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  960. }
  961. }
  962. type tenFieldsStructDecoder struct {
  963. typ reflect.Type
  964. fieldHash1 int32
  965. fieldDecoder1 *structFieldDecoder
  966. fieldHash2 int32
  967. fieldDecoder2 *structFieldDecoder
  968. fieldHash3 int32
  969. fieldDecoder3 *structFieldDecoder
  970. fieldHash4 int32
  971. fieldDecoder4 *structFieldDecoder
  972. fieldHash5 int32
  973. fieldDecoder5 *structFieldDecoder
  974. fieldHash6 int32
  975. fieldDecoder6 *structFieldDecoder
  976. fieldHash7 int32
  977. fieldDecoder7 *structFieldDecoder
  978. fieldHash8 int32
  979. fieldDecoder8 *structFieldDecoder
  980. fieldHash9 int32
  981. fieldDecoder9 *structFieldDecoder
  982. fieldHash10 int32
  983. fieldDecoder10 *structFieldDecoder
  984. }
  985. func (decoder *tenFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  986. if !iter.readObjectStart() {
  987. return
  988. }
  989. for {
  990. switch iter.readFieldHash() {
  991. case decoder.fieldHash1:
  992. decoder.fieldDecoder1.decode(ptr, iter)
  993. case decoder.fieldHash2:
  994. decoder.fieldDecoder2.decode(ptr, iter)
  995. case decoder.fieldHash3:
  996. decoder.fieldDecoder3.decode(ptr, iter)
  997. case decoder.fieldHash4:
  998. decoder.fieldDecoder4.decode(ptr, iter)
  999. case decoder.fieldHash5:
  1000. decoder.fieldDecoder5.decode(ptr, iter)
  1001. case decoder.fieldHash6:
  1002. decoder.fieldDecoder6.decode(ptr, iter)
  1003. case decoder.fieldHash7:
  1004. decoder.fieldDecoder7.decode(ptr, iter)
  1005. case decoder.fieldHash8:
  1006. decoder.fieldDecoder8.decode(ptr, iter)
  1007. case decoder.fieldHash9:
  1008. decoder.fieldDecoder9.decode(ptr, iter)
  1009. case decoder.fieldHash10:
  1010. decoder.fieldDecoder10.decode(ptr, iter)
  1011. default:
  1012. iter.Skip()
  1013. }
  1014. if iter.nextToken() != ',' {
  1015. break
  1016. }
  1017. }
  1018. if iter.Error != nil && iter.Error != io.EOF {
  1019. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  1020. }
  1021. }
  1022. type structFieldDecoder struct {
  1023. field *reflect.StructField
  1024. fieldDecoder Decoder
  1025. }
  1026. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  1027. fieldPtr := uintptr(ptr) + decoder.field.Offset
  1028. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  1029. if iter.Error != nil && iter.Error != io.EOF {
  1030. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  1031. }
  1032. }
  1033. type structFieldEncoder struct {
  1034. field *reflect.StructField
  1035. fieldName string
  1036. fieldEncoder Encoder
  1037. omitempty bool
  1038. }
  1039. func (encoder *structFieldEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  1040. fieldPtr := uintptr(ptr) + encoder.field.Offset
  1041. stream.WriteObjectField(encoder.fieldName)
  1042. encoder.fieldEncoder.encode(unsafe.Pointer(fieldPtr), stream)
  1043. if stream.Error != nil && stream.Error != io.EOF {
  1044. stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error())
  1045. }
  1046. }
  1047. func (encoder *structFieldEncoder) encodeInterface(val interface{}, stream *Stream) {
  1048. writeToStream(val, stream, encoder)
  1049. }
  1050. func (encoder *structFieldEncoder) isEmpty(ptr unsafe.Pointer) bool {
  1051. fieldPtr := uintptr(ptr) + encoder.field.Offset
  1052. return encoder.fieldEncoder.isEmpty(unsafe.Pointer(fieldPtr))
  1053. }
  1054. type structEncoder struct {
  1055. fields []*structFieldEncoder
  1056. }
  1057. func (encoder *structEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  1058. stream.WriteObjectStart()
  1059. isNotFirst := false
  1060. for _, field := range encoder.fields {
  1061. if field.omitempty && field.isEmpty(ptr) {
  1062. continue
  1063. }
  1064. if isNotFirst {
  1065. stream.WriteMore()
  1066. }
  1067. field.encode(ptr, stream)
  1068. isNotFirst = true
  1069. }
  1070. stream.WriteObjectEnd()
  1071. }
  1072. func (encoder *structEncoder) encodeInterface(val interface{}, stream *Stream) {
  1073. var encoderToUse Encoder
  1074. encoderToUse = encoder
  1075. if len(encoder.fields) == 1 {
  1076. firstEncoder := encoder.fields[0].fieldEncoder
  1077. firstEncoderName := reflect.TypeOf(firstEncoder).String()
  1078. // interface{} has inline optimization for this case
  1079. if firstEncoderName == "*jsoniter.optionalEncoder" {
  1080. encoderToUse = &structEncoder{
  1081. fields: []*structFieldEncoder{{
  1082. field: encoder.fields[0].field,
  1083. fieldName: encoder.fields[0].fieldName,
  1084. fieldEncoder: firstEncoder.(*optionalEncoder).valueEncoder,
  1085. omitempty: encoder.fields[0].omitempty,
  1086. }},
  1087. }
  1088. }
  1089. }
  1090. writeToStream(val, stream, encoderToUse)
  1091. }
  1092. func (encoder *structEncoder) isEmpty(ptr unsafe.Pointer) bool {
  1093. for _, field := range encoder.fields {
  1094. if !field.isEmpty(ptr) {
  1095. return false
  1096. }
  1097. }
  1098. return true
  1099. }
  1100. type emptyStructEncoder struct {
  1101. }
  1102. func (encoder *emptyStructEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  1103. stream.WriteEmptyObject()
  1104. }
  1105. func (encoder *emptyStructEncoder) encodeInterface(val interface{}, stream *Stream) {
  1106. writeToStream(val, stream, encoder)
  1107. }
  1108. func (encoder *emptyStructEncoder) isEmpty(ptr unsafe.Pointer) bool {
  1109. return true
  1110. }