val.go 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874
  1. package data
  2. import (
  3. "fmt"
  4. "fw/cp"
  5. "fw/cp/node"
  6. "fw/cp/object"
  7. // rtm "fw/rt2/module"
  8. "fw/rt2/scope"
  9. "fw/utils"
  10. "math"
  11. "math/big"
  12. "reflect"
  13. "strings"
  14. "ypk/assert"
  15. "ypk/halt"
  16. )
  17. type data struct {
  18. link object.Object
  19. val interface{}
  20. }
  21. type arr struct {
  22. link object.Object
  23. val []interface{}
  24. length int64
  25. }
  26. type dynarr struct {
  27. link object.Object
  28. val []interface{}
  29. }
  30. type proc struct {
  31. link object.Object
  32. }
  33. type rec struct {
  34. link object.Object
  35. scope.Record
  36. l *level
  37. }
  38. type ptr struct {
  39. link object.Object
  40. scope.Pointer
  41. val *ptrValue
  42. }
  43. type idx struct {
  44. some scope.Array
  45. idx int
  46. }
  47. func (i *idx) link() object.Object {
  48. switch a := i.some.(type) {
  49. case *arr:
  50. return a.link
  51. case *dynarr:
  52. return a.link
  53. default:
  54. panic(0)
  55. }
  56. }
  57. func (i *idx) base() (object.Type, object.ComplexType) {
  58. switch a := i.link().Complex().(type) {
  59. case object.ArrayType:
  60. return a.Base(), a.Complex()
  61. case object.DynArrayType:
  62. return a.Base(), nil
  63. default:
  64. panic(0)
  65. }
  66. }
  67. func (i *idx) val() []interface{} {
  68. switch a := i.some.(type) {
  69. case *arr:
  70. return a.val
  71. case *dynarr:
  72. return a.val
  73. default:
  74. panic(0)
  75. }
  76. }
  77. func (r *rec) String() string {
  78. return r.link.Name()
  79. }
  80. func (r *rec) Id() cp.ID {
  81. return r.link.Adr()
  82. }
  83. func (r *rec) Set(v scope.Value) {
  84. panic(0)
  85. }
  86. func (r *rec) Get(id cp.ID) scope.Value {
  87. k := r.l.k[id]
  88. if r.l.v[k] == nil { //ref
  89. //fmt.Println(r.Id(), id)
  90. assert.For(r.l.r[k] != nil, 20, id, k)
  91. return r.l.r[k]
  92. } else {
  93. return r.l.v[k]
  94. }
  95. }
  96. func newRec(o object.Object) *rec {
  97. _, ok := o.Complex().(object.RecordType)
  98. assert.For(ok, 20)
  99. return &rec{link: o}
  100. }
  101. func (p *proc) String() string {
  102. return fmt.Sprint(p.link.Adr(), p.link.Name())
  103. }
  104. func (x *data) Id() cp.ID { return x.link.Adr() }
  105. func (x *arr) Id() cp.ID { return x.link.Adr() }
  106. func (x *dynarr) Id() cp.ID { return x.link.Adr() }
  107. func (a *arr) Set(v scope.Value) {
  108. switch x := v.(type) {
  109. case *arr:
  110. a.Set(STRING(x.tryString()))
  111. case STRING:
  112. v := make([]interface{}, int(a.length))
  113. for i := 0; i < int(a.length) && i < len(x); i++ {
  114. v[i] = CHAR(x[i])
  115. }
  116. a.val = v
  117. case SHORTSTRING:
  118. v := make([]interface{}, int(a.length))
  119. for i := 0; i < int(a.length) && i < len(x); i++ {
  120. v[i] = SHORTCHAR(x[i])
  121. }
  122. a.val = v
  123. default:
  124. halt.As(100, reflect.TypeOf(x))
  125. }
  126. }
  127. func (a *dynarr) Set(v scope.Value) {
  128. switch x := v.(type) {
  129. case *data:
  130. a.Set(vfrom(x))
  131. case *arr:
  132. a.val = x.val
  133. case *dynarr:
  134. a.val = x.val
  135. case *idx:
  136. a.Set(x.Get())
  137. case STRING:
  138. z := []rune(string(x))
  139. v := make([]interface{}, len(z)+1)
  140. for i := 0; i < len(z); i++ {
  141. v[i] = CHAR(z[i])
  142. }
  143. if len(v) > 1 {
  144. v[len(v)-1] = CHAR(0)
  145. }
  146. a.val = v
  147. case SHORTSTRING:
  148. z := []rune(string(x))
  149. v := make([]interface{}, len(z)+1)
  150. for i := 0; i < len(z); i++ {
  151. v[i] = SHORTCHAR(z[i])
  152. }
  153. if len(v) > 0 {
  154. v[len(v)-1] = SHORTCHAR(0)
  155. }
  156. a.val = v
  157. case INTEGER:
  158. a.val = make([]interface{}, int(x))
  159. default:
  160. halt.As(100, reflect.TypeOf(x))
  161. }
  162. }
  163. func (a *arr) tryString() (ret string) {
  164. stop := false
  165. for i := 0; !stop && i < len(a.val) && a.val[i] != nil; i++ {
  166. switch x := a.val[i].(type) {
  167. case CHAR:
  168. stop = int(x) == 0
  169. if !stop {
  170. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  171. }
  172. case SHORTCHAR:
  173. stop = int(x) == 0
  174. if !stop {
  175. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  176. }
  177. default:
  178. halt.As(100, reflect.TypeOf(x))
  179. }
  180. }
  181. return ret
  182. }
  183. func (a *arr) String() (ret string) {
  184. ret = fmt.Sprint("array", "[", a.length, "]")
  185. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  186. switch x := a.val[i].(type) {
  187. case CHAR:
  188. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  189. case SHORTCHAR:
  190. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  191. case REAL:
  192. ret = fmt.Sprint(ret, ", ", x)
  193. case *ptr:
  194. ret = fmt.Sprintln(ret, ", ", x)
  195. default:
  196. halt.As(100, reflect.TypeOf(x))
  197. }
  198. }
  199. return ret
  200. }
  201. //возвращает *idx
  202. func (a *arr) Get(id scope.Value) scope.Value {
  203. switch i := id.(type) {
  204. case *data:
  205. return a.Get(i.val.(scope.Value))
  206. case INTEGER:
  207. assert.For(int64(i) < a.length, 20)
  208. if len(a.val) == 0 {
  209. a.val = make([]interface{}, int(a.length))
  210. }
  211. return &idx{some: a, idx: int(i)}
  212. default:
  213. halt.As(100, reflect.TypeOf(i))
  214. }
  215. panic(0)
  216. }
  217. //возвращает *idx
  218. func (a *dynarr) Get(id scope.Value) scope.Value {
  219. switch i := id.(type) {
  220. case *data:
  221. return a.Get(i.val.(scope.Value))
  222. case INTEGER:
  223. assert.For(int(i) < len(a.val), 20)
  224. if len(a.val) == 0 {
  225. panic(0)
  226. }
  227. return &idx{some: a, idx: int(i)}
  228. default:
  229. halt.As(100, reflect.TypeOf(i))
  230. }
  231. panic(0)
  232. }
  233. func (i *idx) Id() cp.ID {
  234. return i.some.Id()
  235. }
  236. func (i *idx) String() string {
  237. return fmt.Sprint("@", i.Id(), "[", i.idx, "]")
  238. }
  239. func (i *idx) Set(v scope.Value) {
  240. t := i.link().Complex()
  241. switch x := v.(type) {
  242. case *idx:
  243. var comp object.Type = object.NOTYPE
  244. switch xt := x.link().Complex().(type) {
  245. case object.ArrayType:
  246. comp = xt.Base()
  247. case object.DynArrayType:
  248. comp = xt.Base()
  249. default:
  250. halt.As(100, xt)
  251. }
  252. if comp != object.COMPLEX {
  253. i.val()[i.idx] = x.val()[x.idx]
  254. } else {
  255. switch z := x.val()[x.idx].(type) {
  256. case *arr:
  257. t := z.link.Complex().(object.ArrayType).Base()
  258. switch t {
  259. case object.CHAR:
  260. i.val()[i.idx].(*arr).Set(STRING(z.tryString()))
  261. default:
  262. halt.As(100, t)
  263. }
  264. default:
  265. halt.As(100, reflect.TypeOf(z))
  266. }
  267. }
  268. case *data:
  269. i.Set(x.val.(scope.Value))
  270. case CHAR:
  271. i.val()[i.idx] = x
  272. case STRING:
  273. _ = t.(object.ArrayType)
  274. i.val()[i.idx].(*arr).Set(x)
  275. case REAL:
  276. i.val()[i.idx] = x
  277. case *ptrValue:
  278. switch tt := t.(type) {
  279. case object.DynArrayType:
  280. _, ok := tt.Complex().(object.PointerType)
  281. assert.For(ok, 20)
  282. i.val()[i.idx] = &ptr{link: x.link, val: x}
  283. default:
  284. halt.As(100, reflect.TypeOf(tt))
  285. }
  286. default:
  287. halt.As(100, reflect.TypeOf(x), x, t)
  288. }
  289. }
  290. func (i *idx) Get() scope.Value {
  291. x := i.val()[i.idx]
  292. switch z := x.(type) {
  293. case *arr:
  294. return z
  295. case *ptr:
  296. return z
  297. case CHAR:
  298. return z
  299. case nil:
  300. b := i.link().Complex().(object.ArrayType).Base()
  301. switch b {
  302. case object.CHAR:
  303. return CHAR(rune(0))
  304. default:
  305. halt.As(101, reflect.TypeOf(b))
  306. }
  307. default:
  308. halt.As(100, i.idx, reflect.TypeOf(z))
  309. }
  310. panic(0)
  311. }
  312. func (a *dynarr) tryString() (ret string) {
  313. stop := false
  314. for i := 0; !stop && i < len(a.val) && a.val[i] != nil; i++ {
  315. switch x := a.val[i].(type) {
  316. case CHAR:
  317. stop = int(x) == 0
  318. if !stop {
  319. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  320. }
  321. case SHORTCHAR:
  322. stop = int(x) == 0
  323. if !stop {
  324. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  325. }
  326. default:
  327. halt.As(100, reflect.TypeOf(x))
  328. }
  329. }
  330. return ret
  331. }
  332. func (a *dynarr) String() (ret string) {
  333. ret = fmt.Sprint("dyn array")
  334. for i := 0; i < len(a.val) && a.val[i] != nil; i++ {
  335. switch x := a.val[i].(type) {
  336. case CHAR:
  337. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  338. case SHORTCHAR:
  339. ret = fmt.Sprint(ret, string([]rune{rune(x)}))
  340. case *ptr:
  341. ret = fmt.Sprint(ret, ", ", x)
  342. default:
  343. halt.As(100, reflect.TypeOf(x))
  344. }
  345. }
  346. return ret
  347. }
  348. func (d *data) Set(v scope.Value) {
  349. utils.PrintScope("set data")
  350. switch x := v.(type) {
  351. case *data:
  352. if d.link.Type() == x.link.Type() {
  353. d.val = x.val
  354. } else {
  355. d.Set(x.val.(scope.Value))
  356. }
  357. case *proc:
  358. assert.For(d.link.Type() == object.COMPLEX, 20)
  359. t, ok := d.link.Complex().(object.BasicType)
  360. assert.For(ok, 21, reflect.TypeOf(d.link.Complex()))
  361. assert.For(t.Type() == object.PROCEDURE, 22)
  362. d.val = x
  363. case *idx:
  364. d.val = x.val()[x.idx]
  365. case INTEGER:
  366. switch d.link.Type() {
  367. case object.INTEGER:
  368. d.val = x
  369. case object.LONGINT:
  370. d.val = LONGINT(x)
  371. case object.REAL:
  372. d.val = REAL(x)
  373. default:
  374. halt.As(20, d.link.Type())
  375. }
  376. case BOOLEAN:
  377. assert.For(d.link.Type() == object.BOOLEAN, 20)
  378. d.val = x
  379. case SHORTCHAR:
  380. assert.For(d.link.Type() == object.SHORTCHAR, 20)
  381. d.val = x
  382. case CHAR:
  383. assert.For(d.link.Type() == object.CHAR, 20)
  384. d.val = x
  385. case SHORTINT:
  386. assert.For(d.link.Type() == object.SHORTINT, 20)
  387. d.val = x
  388. case LONGINT:
  389. assert.For(d.link.Type() == object.LONGINT, 20)
  390. d.val = x
  391. case BYTE:
  392. assert.For(d.link.Type() == object.BYTE, 20)
  393. d.val = x
  394. case SET:
  395. assert.For(d.link.Type() == object.SET, 20)
  396. d.val = x
  397. case REAL:
  398. assert.For(d.link.Type() == object.REAL, 20)
  399. d.val = x
  400. case SHORTREAL:
  401. assert.For(d.link.Type() == object.SHORTREAL, 20)
  402. d.val = x
  403. default:
  404. panic(fmt.Sprintln(reflect.TypeOf(x)))
  405. }
  406. }
  407. func (d *data) String() string {
  408. return fmt.Sprint(d.link.Name(), "=", d.val)
  409. }
  410. func (p *ptr) String() string {
  411. if p.link.Complex() != nil {
  412. return fmt.Sprint("pointer ", p.link.Complex().(object.PointerType).Name(), "&", p.val)
  413. } else {
  414. return fmt.Sprint("pointer simple", p.link.Type())
  415. }
  416. }
  417. func (p *ptr) Id() cp.ID { return p.link.Adr() }
  418. func (p *ptr) Set(v scope.Value) {
  419. switch x := v.(type) {
  420. case *ptr:
  421. p.Set(x.val)
  422. case *ptrValue:
  423. p.val = x
  424. case PTR:
  425. assert.For(x == NIL, 40)
  426. p.val = nil
  427. default:
  428. halt.As(100, reflect.TypeOf(x))
  429. }
  430. }
  431. func (p *ptr) Get() scope.Value {
  432. if p.val == nil {
  433. return NIL
  434. } else {
  435. panic(0)
  436. //return p.val.scope.Select(p.val.id)
  437. }
  438. }
  439. func newPtr(o object.Object) scope.Variable {
  440. _, ok := o.Complex().(object.PointerType)
  441. assert.For(ok, 20)
  442. return &ptr{link: o}
  443. }
  444. type ptrValue struct {
  445. scope *area
  446. id cp.ID
  447. link object.Object
  448. }
  449. func (p *ptrValue) String() string {
  450. return fmt.Sprint(p.id)
  451. }
  452. type PTR int
  453. func (p PTR) String() string {
  454. return "NIL"
  455. }
  456. const NIL PTR = 0
  457. type INTEGER int32
  458. type BOOLEAN bool
  459. type BYTE int8
  460. type SHORTINT int16
  461. type LONGINT int64
  462. type SET struct {
  463. bits *big.Int
  464. }
  465. type CHAR rune
  466. type REAL float64
  467. type SHORTREAL float32
  468. type SHORTCHAR rune
  469. type STRING string
  470. type SHORTSTRING string
  471. func (x SHORTSTRING) String() string { return string(x) }
  472. func (x STRING) String() string { return string(x) }
  473. func (x SHORTCHAR) String() string { return fmt.Sprint(rune(x)) }
  474. func (x SHORTREAL) String() string { return fmt.Sprint(float32(x)) }
  475. func (x REAL) String() string { return fmt.Sprint(float64(x)) }
  476. func (x CHAR) String() string { return fmt.Sprint(rune(x)) }
  477. func (x SET) String() string { return fmt.Sprint(x.bits) }
  478. func (x LONGINT) String() string { return fmt.Sprint(int64(x)) }
  479. func (x SHORTINT) String() string { return fmt.Sprint(int16(x)) }
  480. func (x BYTE) String() string { return fmt.Sprint(int8(x)) }
  481. func (x INTEGER) String() string { return fmt.Sprint(int32(x)) }
  482. func (x BOOLEAN) String() string { return fmt.Sprint(bool(x)) }
  483. func newData(o object.Object) (ret scope.Variable) {
  484. switch o.Type() {
  485. case object.INTEGER:
  486. ret = &data{link: o, val: INTEGER(0)}
  487. case object.BOOLEAN:
  488. ret = &data{link: o, val: BOOLEAN(false)}
  489. case object.BYTE:
  490. ret = &data{link: o, val: BYTE(0)}
  491. case object.CHAR:
  492. ret = &data{link: o, val: CHAR(0)}
  493. case object.LONGINT:
  494. ret = &data{link: o, val: LONGINT(0)}
  495. case object.SHORTINT:
  496. ret = &data{link: o, val: SHORTINT(0)}
  497. case object.SET:
  498. ret = &data{link: o, val: SET{bits: big.NewInt(0)}}
  499. case object.REAL:
  500. ret = &data{link: o, val: REAL(0)}
  501. case object.SHORTREAL:
  502. ret = &data{link: o, val: SHORTREAL(0)}
  503. case object.SHORTCHAR:
  504. ret = &data{link: o, val: SHORTCHAR(0)}
  505. case object.COMPLEX:
  506. switch t := o.Complex().(type) {
  507. case object.BasicType:
  508. switch t.Type() {
  509. case object.PROCEDURE:
  510. ret = &data{link: o, val: nil}
  511. default:
  512. halt.As(100, t.Type())
  513. }
  514. case object.ArrayType:
  515. ret = &arr{link: o, length: t.Len()}
  516. if a := ret.(*arr); t.Base() == object.COMPLEX {
  517. a.val = make([]interface{}, int(t.Len()))
  518. for i := 0; i < int(t.Len()); i++ {
  519. fake := object.New(object.VARIABLE, cp.Some())
  520. fake.SetName("[?]")
  521. fake.SetType(object.COMPLEX)
  522. fake.SetComplex(t.Complex())
  523. a.val[i] = newData(fake)
  524. }
  525. }
  526. case object.DynArrayType:
  527. ret = &dynarr{link: o}
  528. default:
  529. halt.As(100, reflect.TypeOf(t))
  530. }
  531. case object.NOTYPE:
  532. switch t := o.Complex().(type) {
  533. case nil:
  534. ret = &ptr{link: o}
  535. default:
  536. halt.As(100, reflect.TypeOf(t))
  537. }
  538. default:
  539. panic(fmt.Sprintln("unsupported type", o, o.Type(), o.Complex()))
  540. }
  541. return ret
  542. }
  543. func fromg(x interface{}) scope.Value {
  544. switch x := x.(type) {
  545. case int32:
  546. return INTEGER(x)
  547. case bool:
  548. return BOOLEAN(x)
  549. case *big.Int:
  550. return SET{bits: x}
  551. case string:
  552. return STRING(x)
  553. case float64:
  554. return REAL(x)
  555. default:
  556. halt.As(100, reflect.TypeOf(x))
  557. }
  558. panic(100)
  559. }
  560. func newProc(o object.Object) scope.Value {
  561. p, ok := o.(object.ProcedureObject)
  562. assert.For(ok, 20, reflect.TypeOf(o))
  563. return &proc{link: p}
  564. }
  565. func newConst(n node.Node) scope.Value {
  566. switch x := n.(type) {
  567. case node.ConstantNode:
  568. switch x.Type() {
  569. case object.INTEGER:
  570. return INTEGER(x.Data().(int32))
  571. case object.REAL:
  572. return REAL(x.Data().(float64))
  573. case object.BOOLEAN:
  574. return BOOLEAN(x.Data().(bool))
  575. case object.SHORTCHAR:
  576. return SHORTCHAR(x.Data().(rune))
  577. case object.LONGINT:
  578. return LONGINT(x.Data().(int64))
  579. case object.SHORTINT:
  580. return SHORTINT(x.Data().(int16))
  581. case object.SHORTREAL:
  582. return SHORTREAL(x.Data().(float32))
  583. case object.BYTE:
  584. return BYTE(x.Data().(int8))
  585. case object.SET:
  586. return SET{bits: x.Data().(*big.Int)}
  587. case object.CHAR:
  588. return CHAR(x.Data().(rune))
  589. case object.STRING:
  590. return STRING(x.Data().(string))
  591. case object.SHORTSTRING:
  592. return SHORTSTRING(x.Data().(string))
  593. case object.NIL:
  594. return NIL
  595. case object.COMPLEX: //не может существовать в реальности, используется для передачи параметров от рантайма
  596. switch d := x.Data().(type) {
  597. case *ptrValue:
  598. return d
  599. default:
  600. halt.As(100, reflect.TypeOf(d))
  601. }
  602. default:
  603. panic(fmt.Sprintln(x.Type()))
  604. }
  605. }
  606. panic(0)
  607. }
  608. func vfrom(v scope.Value) scope.Value {
  609. switch n := v.(type) {
  610. case *data:
  611. switch n.link.Type() {
  612. case object.INTEGER:
  613. return n.val.(INTEGER)
  614. case object.BYTE:
  615. return n.val.(BYTE)
  616. case object.CHAR:
  617. return n.val.(CHAR)
  618. case object.SET:
  619. return n.val.(SET)
  620. case object.BOOLEAN:
  621. return n.val.(BOOLEAN)
  622. case object.REAL:
  623. return n.val.(REAL)
  624. case object.LONGINT:
  625. return n.val.(LONGINT)
  626. default:
  627. halt.As(100, n.link.Type())
  628. }
  629. case INTEGER, CHAR:
  630. return n
  631. default:
  632. halt.As(100, reflect.TypeOf(n))
  633. }
  634. return nil
  635. }
  636. func gfrom(v scope.Value) interface{} {
  637. switch n := v.(type) {
  638. case *data:
  639. if n.val == nil {
  640. return nil
  641. } else {
  642. return gfrom(n.val.(scope.Value))
  643. }
  644. case *rec:
  645. return n
  646. case *ptr:
  647. return n
  648. case *proc:
  649. return n.link
  650. case *dynarr:
  651. switch n.link.Complex().(object.DynArrayType).Base() {
  652. case object.SHORTCHAR:
  653. if n.val != nil {
  654. return n.tryString()
  655. } else {
  656. return ""
  657. }
  658. case object.CHAR:
  659. if n.val != nil {
  660. return n.tryString()
  661. } else {
  662. return ""
  663. }
  664. case object.COMPLEX:
  665. return n.val
  666. default:
  667. halt.As(100, n.link.Complex().(object.DynArrayType).Base())
  668. }
  669. panic(0)
  670. case *arr:
  671. switch n.link.Complex().(object.ArrayType).Base() {
  672. case object.SHORTCHAR:
  673. if n.val != nil {
  674. return n.tryString()
  675. } else {
  676. return ""
  677. }
  678. case object.CHAR:
  679. if n.val != nil {
  680. return n.tryString()
  681. } else {
  682. return ""
  683. }
  684. case object.REAL:
  685. ret := make([]float64, 0)
  686. for i := 0; i < len(n.val) && n.val[i] != nil; i++ {
  687. ret = append(ret, float64(n.val[i].(REAL)))
  688. }
  689. return ret
  690. default:
  691. halt.As(100, n.link.Complex().(object.ArrayType).Base())
  692. }
  693. panic(0)
  694. case *idx:
  695. switch t := n.link().Complex().(type) {
  696. case object.ArrayType:
  697. switch t.Base() {
  698. case object.CHAR:
  699. return rune(n.Get().(CHAR))
  700. default:
  701. halt.As(100, t.Base())
  702. }
  703. case object.DynArrayType:
  704. switch t.Base() {
  705. case object.CHAR:
  706. return rune(n.Get().(CHAR))
  707. default:
  708. halt.As(100, t.Base())
  709. }
  710. default:
  711. halt.As(100, reflect.TypeOf(t))
  712. }
  713. panic(0)
  714. case PTR:
  715. assert.For(n == NIL, 40)
  716. return nil
  717. case INTEGER:
  718. return int32(n)
  719. case BOOLEAN:
  720. return bool(n)
  721. case STRING:
  722. return string(n)
  723. case CHAR:
  724. return rune(n)
  725. default:
  726. halt.As(100, reflect.TypeOf(n))
  727. }
  728. return nil
  729. }
  730. type ops struct{}
  731. func (o *ops) Sum(a, b scope.Value) scope.Value {
  732. switch a.(type) {
  733. case *data:
  734. return o.Sum(vfrom(a), b)
  735. default:
  736. switch b.(type) {
  737. case *data:
  738. return o.Sum(a, vfrom(b))
  739. default:
  740. switch x := a.(type) {
  741. case INTEGER:
  742. switch y := b.(type) {
  743. case INTEGER:
  744. return INTEGER(int32(x) + int32(y))
  745. default:
  746. panic(fmt.Sprintln(reflect.TypeOf(y)))
  747. }
  748. case SET:
  749. switch y := b.(type) {
  750. case SET:
  751. res := big.NewInt(0)
  752. for i := 0; i < 64; i++ {
  753. if x.bits.Bit(i) == 1 {
  754. res.SetBit(res, i, 1)
  755. }
  756. if y.bits.Bit(i) == 1 {
  757. res.SetBit(res, i, 1)
  758. }
  759. }
  760. return SET{bits: res}
  761. case INTEGER: // INCL(SET, INTEGER)
  762. return SET{bits: x.bits.SetBit(x.bits, int(y), 1)}
  763. default:
  764. panic(fmt.Sprintln(reflect.TypeOf(y)))
  765. }
  766. case *arr:
  767. switch y := b.(type) {
  768. case *arr:
  769. switch {
  770. case x.link.Type() == y.link.Type() && x.link.Complex().(object.ArrayType).Base() == object.CHAR:
  771. return STRING(x.tryString() + y.tryString())
  772. default:
  773. halt.As(100, x.link.Type(), y.link.Type())
  774. }
  775. case STRING:
  776. switch {
  777. case x.link.Complex().(object.ArrayType).Base() == object.CHAR:
  778. return STRING(x.tryString() + string(y))
  779. default:
  780. halt.As(100, x.link.Type())
  781. }
  782. default:
  783. panic(fmt.Sprintln(reflect.TypeOf(y)))
  784. }
  785. case *dynarr:
  786. switch y := b.(type) {
  787. case STRING:
  788. switch {
  789. case x.link.Complex().(object.DynArrayType).Base() == object.CHAR:
  790. return STRING(x.tryString() + string(y))
  791. default:
  792. halt.As(100, x.link.Type())
  793. }
  794. default:
  795. panic(fmt.Sprintln(reflect.TypeOf(y)))
  796. }
  797. case STRING:
  798. switch y := b.(type) {
  799. case STRING:
  800. return STRING(string(x) + string(y))
  801. default:
  802. halt.As(100, reflect.TypeOf(y))
  803. }
  804. case REAL:
  805. switch y := b.(type) {
  806. case REAL:
  807. return REAL(x + y)
  808. default:
  809. halt.As(100, reflect.TypeOf(y))
  810. }
  811. case LONGINT:
  812. switch y := b.(type) {
  813. case LONGINT:
  814. return LONGINT(x + y)
  815. default:
  816. halt.As(100, reflect.TypeOf(y))
  817. }
  818. default:
  819. panic(fmt.Sprintln(reflect.TypeOf(x)))
  820. }
  821. }
  822. }
  823. panic(0)
  824. }
  825. func (o *ops) Sub(a, b scope.Value) scope.Value {
  826. switch a.(type) {
  827. case *data:
  828. return o.Sub(vfrom(a), b)
  829. default:
  830. switch b.(type) {
  831. case *data:
  832. return o.Sub(a, vfrom(b))
  833. default:
  834. switch x := a.(type) {
  835. case INTEGER:
  836. switch y := b.(type) {
  837. case INTEGER:
  838. return INTEGER(int32(x) - int32(y))
  839. default:
  840. panic(fmt.Sprintln(reflect.TypeOf(y)))
  841. }
  842. case REAL:
  843. switch y := b.(type) {
  844. case REAL:
  845. return REAL(x - y)
  846. default:
  847. panic(fmt.Sprintln(reflect.TypeOf(y)))
  848. }
  849. case LONGINT:
  850. switch y := b.(type) {
  851. case LONGINT:
  852. return INTEGER(int64(x) - int64(y))
  853. default:
  854. panic(fmt.Sprintln(reflect.TypeOf(y)))
  855. }
  856. case SET:
  857. switch y := b.(type) {
  858. case SET:
  859. res := big.NewInt(0).Set(x.bits)
  860. for i := 0; i < 64; i++ {
  861. if y.bits.Bit(i) == 1 {
  862. res.SetBit(res, i, 0)
  863. }
  864. }
  865. return SET{bits: res}
  866. case INTEGER:
  867. null := big.NewInt(0)
  868. res := null.SetBit(x.bits, int(y), 0)
  869. return SET{bits: res}
  870. default:
  871. panic(fmt.Sprintln(reflect.TypeOf(y)))
  872. }
  873. default:
  874. panic(fmt.Sprintln(reflect.TypeOf(x)))
  875. }
  876. }
  877. }
  878. panic(0)
  879. }
  880. func (o *ops) In(a, b scope.Value) scope.Value {
  881. switch a.(type) {
  882. case *data:
  883. return o.In(vfrom(a), b)
  884. default:
  885. switch b.(type) {
  886. case *data:
  887. return o.In(a, vfrom(b))
  888. default:
  889. switch x := a.(type) {
  890. case INTEGER:
  891. switch y := b.(type) {
  892. case SET:
  893. assert.For(int(x) < 64, 20)
  894. return BOOLEAN(y.bits.Bit(int(x)) == 1)
  895. default:
  896. panic(fmt.Sprintln(reflect.TypeOf(y)))
  897. }
  898. default:
  899. panic(fmt.Sprintln(reflect.TypeOf(x)))
  900. }
  901. }
  902. }
  903. panic(0)
  904. }
  905. func (o *ops) Min(a, b scope.Value) scope.Value {
  906. switch a.(type) {
  907. case *data:
  908. return o.Min(vfrom(a), b)
  909. default:
  910. switch b.(type) {
  911. case *data:
  912. return o.Min(a, vfrom(b))
  913. default:
  914. switch x := a.(type) {
  915. case INTEGER:
  916. switch y := b.(type) {
  917. case INTEGER:
  918. return INTEGER(int32(math.Min(float64(x), float64(y))))
  919. default:
  920. panic(fmt.Sprintln(reflect.TypeOf(y)))
  921. }
  922. default:
  923. panic(fmt.Sprintln(reflect.TypeOf(x)))
  924. }
  925. }
  926. }
  927. panic(0)
  928. }
  929. func (o *ops) Max(a, b scope.Value) scope.Value {
  930. switch a.(type) {
  931. case *data:
  932. return o.Max(vfrom(a), b)
  933. default:
  934. switch b.(type) {
  935. case *data:
  936. return o.Max(a, vfrom(b))
  937. default:
  938. switch x := a.(type) {
  939. case INTEGER:
  940. switch y := b.(type) {
  941. case INTEGER:
  942. return INTEGER(int32(math.Max(float64(x), float64(y))))
  943. default:
  944. panic(fmt.Sprintln(reflect.TypeOf(y)))
  945. }
  946. default:
  947. panic(fmt.Sprintln(reflect.TypeOf(x)))
  948. }
  949. }
  950. }
  951. panic(0)
  952. }
  953. func (o *ops) And(a, b scope.Value) scope.Value {
  954. switch a.(type) {
  955. case *data:
  956. return o.And(vfrom(a), b)
  957. default:
  958. switch b.(type) {
  959. case *data:
  960. return o.And(a, vfrom(b))
  961. default:
  962. switch x := a.(type) {
  963. case BOOLEAN:
  964. switch y := b.(type) {
  965. case BOOLEAN:
  966. return BOOLEAN(x && y)
  967. default:
  968. panic(fmt.Sprintln(reflect.TypeOf(y)))
  969. }
  970. default:
  971. panic(fmt.Sprintln(reflect.TypeOf(x)))
  972. }
  973. }
  974. }
  975. panic(0)
  976. }
  977. func (o *ops) Or(a, b scope.Value) scope.Value {
  978. switch a.(type) {
  979. case *data:
  980. return o.Or(vfrom(a), b)
  981. default:
  982. switch b.(type) {
  983. case *data:
  984. return o.Or(a, vfrom(b))
  985. default:
  986. switch x := a.(type) {
  987. case BOOLEAN:
  988. switch y := b.(type) {
  989. case BOOLEAN:
  990. return BOOLEAN(x || y)
  991. default:
  992. panic(fmt.Sprintln(reflect.TypeOf(y)))
  993. }
  994. default:
  995. panic(fmt.Sprintln(reflect.TypeOf(x)))
  996. }
  997. }
  998. }
  999. panic(0)
  1000. }
  1001. func (o *ops) Ash(a, b scope.Value) scope.Value {
  1002. switch a.(type) {
  1003. case *data:
  1004. return o.Ash(vfrom(a), b)
  1005. default:
  1006. switch b.(type) {
  1007. case *data:
  1008. return o.Ash(a, vfrom(b))
  1009. default:
  1010. switch x := a.(type) {
  1011. case INTEGER:
  1012. switch y := b.(type) {
  1013. case INTEGER:
  1014. return INTEGER(x << uint(y))
  1015. default:
  1016. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1017. }
  1018. default:
  1019. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1020. }
  1021. }
  1022. }
  1023. panic(0)
  1024. }
  1025. func (o *ops) Div(a, b scope.Value) scope.Value {
  1026. switch a.(type) {
  1027. case *data:
  1028. return o.Div(vfrom(a), b)
  1029. default:
  1030. switch b.(type) {
  1031. case *data:
  1032. return o.Div(a, vfrom(b))
  1033. default:
  1034. switch x := a.(type) {
  1035. case INTEGER:
  1036. switch y := b.(type) {
  1037. case INTEGER:
  1038. return INTEGER(math.Floor(float64(x) / float64(y)))
  1039. default:
  1040. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1041. }
  1042. case LONGINT:
  1043. switch y := b.(type) {
  1044. case LONGINT:
  1045. return LONGINT(x / y)
  1046. default:
  1047. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1048. }
  1049. default:
  1050. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1051. }
  1052. }
  1053. }
  1054. panic(0)
  1055. }
  1056. func (o *ops) Mod(a, b scope.Value) scope.Value {
  1057. switch a.(type) {
  1058. case *data:
  1059. return o.Mod(vfrom(a), b)
  1060. default:
  1061. switch b.(type) {
  1062. case *data:
  1063. return o.Mod(a, vfrom(b))
  1064. default:
  1065. switch x := a.(type) {
  1066. case INTEGER:
  1067. switch y := b.(type) {
  1068. case INTEGER:
  1069. z := x % y
  1070. switch {
  1071. case (x < 0) != (y < 0):
  1072. z = z + y
  1073. }
  1074. return INTEGER(z)
  1075. default:
  1076. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1077. }
  1078. case LONGINT:
  1079. switch y := b.(type) {
  1080. case LONGINT:
  1081. z := x % y
  1082. switch {
  1083. case (x < 0) != (y < 0):
  1084. z = z + y
  1085. }
  1086. return LONGINT(z)
  1087. default:
  1088. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1089. }
  1090. default:
  1091. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1092. }
  1093. }
  1094. }
  1095. panic(0)
  1096. }
  1097. func (o *ops) Msk(a, b scope.Value) scope.Value {
  1098. switch a.(type) {
  1099. case *data:
  1100. return o.Msk(vfrom(a), b)
  1101. default:
  1102. switch b.(type) {
  1103. case *data:
  1104. return o.Msk(a, vfrom(b))
  1105. default:
  1106. switch x := a.(type) {
  1107. case INTEGER:
  1108. switch y := b.(type) {
  1109. case INTEGER:
  1110. y = -y
  1111. z := x % y
  1112. switch {
  1113. case (x < 0) != (y < 0):
  1114. z = z + y
  1115. }
  1116. return INTEGER(z)
  1117. default:
  1118. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1119. }
  1120. case LONGINT:
  1121. switch y := b.(type) {
  1122. case LONGINT:
  1123. y = -y
  1124. z := x % y
  1125. switch {
  1126. case (x < 0) != (y < 0):
  1127. z = z + y
  1128. }
  1129. return LONGINT(z)
  1130. default:
  1131. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1132. }
  1133. default:
  1134. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1135. }
  1136. }
  1137. }
  1138. panic(0)
  1139. }
  1140. func (o *ops) Mult(a, b scope.Value) scope.Value {
  1141. switch a.(type) {
  1142. case *data:
  1143. return o.Mult(vfrom(a), b)
  1144. default:
  1145. switch b.(type) {
  1146. case *data:
  1147. return o.Mult(a, vfrom(b))
  1148. default:
  1149. switch x := a.(type) {
  1150. case INTEGER:
  1151. switch y := b.(type) {
  1152. case INTEGER:
  1153. return INTEGER(x * y)
  1154. default:
  1155. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1156. }
  1157. case REAL:
  1158. switch y := b.(type) {
  1159. case REAL:
  1160. return REAL(x * y)
  1161. default:
  1162. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1163. }
  1164. case SET:
  1165. switch y := b.(type) {
  1166. case SET:
  1167. res := big.NewInt(0)
  1168. for i := 0; i < 64; i++ {
  1169. if x.bits.Bit(i) == 1 && y.bits.Bit(i) == 1 {
  1170. res.SetBit(res, i, 1)
  1171. }
  1172. }
  1173. return SET{bits: res}
  1174. default:
  1175. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1176. }
  1177. default:
  1178. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1179. }
  1180. }
  1181. }
  1182. panic(0)
  1183. }
  1184. func (o *ops) Divide(a, b scope.Value) scope.Value {
  1185. switch a.(type) {
  1186. case *data:
  1187. return o.Divide(vfrom(a), b)
  1188. default:
  1189. switch b.(type) {
  1190. case *data:
  1191. return o.Divide(a, vfrom(b))
  1192. default:
  1193. switch x := a.(type) {
  1194. case INTEGER:
  1195. switch y := b.(type) {
  1196. case INTEGER:
  1197. return REAL(float64(x) / float64(y))
  1198. default:
  1199. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1200. }
  1201. case REAL:
  1202. switch y := b.(type) {
  1203. case REAL:
  1204. return REAL(float64(x) / float64(y))
  1205. default:
  1206. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1207. }
  1208. case SET:
  1209. switch y := b.(type) {
  1210. case SET:
  1211. res := big.NewInt(0)
  1212. for i := 0; i < 64; i++ {
  1213. if x.bits.Bit(i) != y.bits.Bit(i) {
  1214. res.SetBit(res, i, 1)
  1215. }
  1216. }
  1217. return SET{bits: res}
  1218. default:
  1219. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1220. }
  1221. default:
  1222. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1223. }
  1224. }
  1225. }
  1226. panic(0)
  1227. }
  1228. func (o *ops) Len(a object.Object, _a, _b scope.Value) (ret scope.Value) {
  1229. //assert.For(a != nil, 20)
  1230. assert.For(_b != nil, 21)
  1231. var b int32 = gfrom(_b).(int32)
  1232. assert.For(b == 0, 22)
  1233. if a != nil {
  1234. assert.For(a.Type() == object.COMPLEX, 23)
  1235. switch typ := a.Complex().(type) {
  1236. case object.ArrayType:
  1237. ret = INTEGER(int32(typ.Len()))
  1238. case object.DynArrayType:
  1239. switch t := _a.(type) {
  1240. case *arr:
  1241. ret = INTEGER(t.length)
  1242. case *dynarr:
  1243. ret = INTEGER(len(t.val))
  1244. default:
  1245. halt.As(100, "unsupported", reflect.TypeOf(t))
  1246. }
  1247. default:
  1248. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a.Complex())))
  1249. }
  1250. } else {
  1251. switch a := _a.(type) {
  1252. case *arr:
  1253. ret = INTEGER(int32(a.length))
  1254. case *dynarr:
  1255. ret = INTEGER(int32(len(a.val)))
  1256. case STRING:
  1257. rs := []rune(string(a))
  1258. ln := len(rs)
  1259. ret = INTEGER(0)
  1260. for l := 0; l < ln && rs[l] != 0; l++ {
  1261. ret = INTEGER(l + 1)
  1262. }
  1263. default:
  1264. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a)))
  1265. }
  1266. }
  1267. return ret
  1268. }
  1269. func (o *ops) Is(a scope.Value, typ object.ComplexType) scope.Value {
  1270. var compare func(x, a object.ComplexType) bool
  1271. compare = func(_x, _a object.ComplexType) bool {
  1272. switch x := _x.(type) {
  1273. case object.RecordType:
  1274. switch a := _a.(type) {
  1275. case object.RecordType:
  1276. switch {
  1277. case x.Name() == a.Name():
  1278. // fmt.Println("eq")
  1279. //fmt.Println("qid ", _x.Qualident(), _a.Qualident(), "names ", x.Name(), a.Name())
  1280. return true //опасно сравнивать имена конеш
  1281. case x.Complex() != nil:
  1282. // fmt.Println("go base")
  1283. return compare(x.Complex(), a)
  1284. default:
  1285. return false
  1286. }
  1287. case object.PointerType:
  1288. if a.Complex() != nil {
  1289. return compare(x, a.Complex())
  1290. } else {
  1291. fmt.Println("here")
  1292. return false
  1293. }
  1294. default:
  1295. halt.As(100, reflect.TypeOf(a))
  1296. }
  1297. case object.PointerType:
  1298. switch a := _a.(type) {
  1299. case object.PointerType:
  1300. switch {
  1301. case x.Name() == a.Name():
  1302. // fmt.Println("eq")
  1303. return true //опасно сравнивать имена конеш
  1304. case x.Complex() != nil:
  1305. // fmt.Println("go base")
  1306. return compare(x.Complex(), a)
  1307. default:
  1308. return false
  1309. }
  1310. default:
  1311. halt.As(100, reflect.TypeOf(a))
  1312. }
  1313. default:
  1314. halt.As(100, reflect.TypeOf(a))
  1315. }
  1316. panic(0)
  1317. }
  1318. switch x := a.(type) {
  1319. case *rec:
  1320. z, a := x.link.Complex().(object.RecordType)
  1321. y, b := typ.(object.RecordType)
  1322. //fmt.Println("compare rec", x.link.Complex(), typ, a, b, a && b && compare(z, y))
  1323. return BOOLEAN(a && b && compare(z, y))
  1324. case *ptr:
  1325. z, a := x.link.Complex().(object.PointerType)
  1326. if val := x.Get(); z.Name() == "ANYPTR" && val != NIL {
  1327. t, c := o.TypeOf(val)
  1328. assert.For(t == object.COMPLEX, 40)
  1329. z, a = c.(object.RecordType)
  1330. }
  1331. y, b := typ.(object.PointerType)
  1332. //fmt.Println("compare ptr", z, typ, a, b, a && b && compare(z, y))
  1333. return BOOLEAN(a && b && compare(z, y))
  1334. default:
  1335. halt.As(100, reflect.TypeOf(x))
  1336. }
  1337. panic(0)
  1338. }
  1339. func (o *ops) Conv(a scope.Value, typ object.Type, comp ...object.ComplexType) scope.Value {
  1340. switch typ {
  1341. case object.INTEGER:
  1342. switch x := a.(type) {
  1343. case *data:
  1344. return o.Conv(vfrom(x), typ, comp...)
  1345. case *idx:
  1346. //t, c := x.base()
  1347. return o.Conv(x.val()[x.idx].(scope.Value), typ, comp...)
  1348. case BYTE:
  1349. return INTEGER(x)
  1350. case SET:
  1351. return INTEGER(x.bits.Int64())
  1352. case REAL:
  1353. return INTEGER(x)
  1354. case LONGINT:
  1355. return INTEGER(x)
  1356. case CHAR:
  1357. return INTEGER(x)
  1358. default:
  1359. halt.As(100, reflect.TypeOf(x))
  1360. }
  1361. case object.LONGINT:
  1362. switch x := a.(type) {
  1363. case *data:
  1364. return o.Conv(vfrom(x), typ, comp...)
  1365. case INTEGER:
  1366. return LONGINT(x)
  1367. case REAL:
  1368. return LONGINT(math.Floor(float64(x)))
  1369. default:
  1370. halt.As(100, reflect.TypeOf(x))
  1371. }
  1372. case object.SET:
  1373. switch x := a.(type) {
  1374. case *data:
  1375. return o.Conv(vfrom(x), typ, comp...)
  1376. case INTEGER:
  1377. return SET{bits: big.NewInt(int64(x))}
  1378. default:
  1379. halt.As(100, reflect.TypeOf(x))
  1380. }
  1381. case object.REAL:
  1382. switch x := a.(type) {
  1383. case *data:
  1384. return o.Conv(vfrom(x), typ, comp...)
  1385. case INTEGER:
  1386. return REAL(float64(x))
  1387. default:
  1388. halt.As(100, reflect.TypeOf(x))
  1389. }
  1390. case object.CHAR:
  1391. switch x := a.(type) {
  1392. case *data:
  1393. return o.Conv(vfrom(x), typ, comp...)
  1394. case LONGINT:
  1395. return CHAR(rune(x))
  1396. case INTEGER:
  1397. return CHAR(rune(x))
  1398. case CHAR:
  1399. return x
  1400. default:
  1401. halt.As(100, reflect.TypeOf(x))
  1402. }
  1403. case object.NOTYPE:
  1404. assert.For(len(comp) > 0, 20)
  1405. switch t := comp[0].(type) {
  1406. case object.BasicType:
  1407. switch t.Type() {
  1408. case object.SHORTSTRING:
  1409. switch x := a.(type) {
  1410. case *dynarr:
  1411. return SHORTSTRING(x.tryString())
  1412. case *arr:
  1413. return SHORTSTRING(x.tryString())
  1414. case STRING:
  1415. return SHORTSTRING(x)
  1416. default:
  1417. halt.As(100, reflect.TypeOf(x))
  1418. }
  1419. default:
  1420. halt.As(100, t.Type())
  1421. }
  1422. default:
  1423. halt.As(100, reflect.TypeOf(t))
  1424. }
  1425. default:
  1426. halt.As(100, typ)
  1427. }
  1428. panic(100)
  1429. }
  1430. func (o *ops) Not(a scope.Value) scope.Value {
  1431. switch x := a.(type) {
  1432. case *data:
  1433. return o.Not(vfrom(x))
  1434. case BOOLEAN:
  1435. return BOOLEAN(!x)
  1436. default:
  1437. halt.As(100, reflect.TypeOf(x))
  1438. }
  1439. panic(100)
  1440. }
  1441. func (o *ops) Abs(a scope.Value) scope.Value {
  1442. switch x := a.(type) {
  1443. case *data:
  1444. return o.Abs(vfrom(x))
  1445. case INTEGER:
  1446. return INTEGER(int32(math.Abs(float64(x))))
  1447. default:
  1448. halt.As(100, reflect.TypeOf(x))
  1449. }
  1450. panic(100)
  1451. }
  1452. func (o *ops) Minus(a scope.Value) scope.Value {
  1453. switch x := a.(type) {
  1454. case *data:
  1455. return o.Minus(vfrom(x))
  1456. case INTEGER:
  1457. return INTEGER(-x)
  1458. case LONGINT:
  1459. return LONGINT(-x)
  1460. case REAL:
  1461. return REAL(-x)
  1462. default:
  1463. halt.As(100, reflect.TypeOf(x))
  1464. }
  1465. panic(100)
  1466. }
  1467. func (o *ops) Odd(a scope.Value) scope.Value {
  1468. switch x := a.(type) {
  1469. case *data:
  1470. return o.Odd(vfrom(x))
  1471. case INTEGER:
  1472. return BOOLEAN(int64(math.Abs(float64(x)))%2 == 1)
  1473. case LONGINT:
  1474. return BOOLEAN(int64(math.Abs(float64(x)))%2 == 1)
  1475. default:
  1476. halt.As(100, reflect.TypeOf(x))
  1477. }
  1478. panic(100)
  1479. }
  1480. func (o *ops) Cap(a scope.Value) scope.Value {
  1481. switch x := a.(type) {
  1482. case *data:
  1483. return o.Cap(vfrom(x))
  1484. case CHAR:
  1485. return CHAR([]rune(strings.ToUpper(string(x)))[0])
  1486. default:
  1487. halt.As(100, reflect.TypeOf(x))
  1488. }
  1489. panic(100)
  1490. }
  1491. func (o *ops) Bits(a scope.Value) scope.Value {
  1492. switch x := a.(type) {
  1493. case *data:
  1494. return o.Bits(vfrom(x))
  1495. case INTEGER:
  1496. return SET{bits: big.NewInt(0).SetBit(big.NewInt(0), int(x), 1)}
  1497. default:
  1498. halt.As(100, reflect.TypeOf(x))
  1499. }
  1500. panic(100)
  1501. }
  1502. func (o *ops) Eq(a, b scope.Value) scope.Value {
  1503. switch a.(type) {
  1504. case *data:
  1505. return o.Eq(vfrom(a), b)
  1506. default:
  1507. switch b.(type) {
  1508. case *data:
  1509. return o.Eq(a, vfrom(b))
  1510. default:
  1511. switch x := a.(type) {
  1512. case *ptr:
  1513. switch y := b.(type) {
  1514. case PTR:
  1515. assert.For(y == NIL, 40)
  1516. return BOOLEAN(x.val == nil || x.val.id == 0)
  1517. default:
  1518. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1519. }
  1520. case INTEGER:
  1521. switch y := b.(type) {
  1522. case INTEGER:
  1523. return BOOLEAN(x == y)
  1524. default:
  1525. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1526. }
  1527. case LONGINT:
  1528. switch y := b.(type) {
  1529. case LONGINT:
  1530. return BOOLEAN(x == y)
  1531. default:
  1532. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1533. }
  1534. case CHAR:
  1535. switch y := b.(type) {
  1536. case CHAR:
  1537. return BOOLEAN(x == y)
  1538. default:
  1539. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1540. }
  1541. default:
  1542. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1543. }
  1544. }
  1545. }
  1546. panic(0)
  1547. }
  1548. func (o *ops) Neq(a, b scope.Value) scope.Value {
  1549. switch i := a.(type) {
  1550. case *data:
  1551. return o.Neq(vfrom(a), b)
  1552. case *idx:
  1553. return o.Neq(vfrom(i.Get()), b)
  1554. default:
  1555. switch b.(type) {
  1556. case *data:
  1557. return o.Neq(a, vfrom(b))
  1558. default:
  1559. switch x := a.(type) {
  1560. case *ptr:
  1561. switch y := b.(type) {
  1562. case PTR:
  1563. assert.For(y == NIL, 40)
  1564. return BOOLEAN(x.val != nil && x.val.id != 0)
  1565. default:
  1566. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1567. }
  1568. case INTEGER:
  1569. switch y := b.(type) {
  1570. case INTEGER:
  1571. return BOOLEAN(x != y)
  1572. default:
  1573. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1574. }
  1575. case REAL:
  1576. switch y := b.(type) {
  1577. case REAL:
  1578. return BOOLEAN(x != y)
  1579. default:
  1580. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1581. }
  1582. case LONGINT:
  1583. switch y := b.(type) {
  1584. case LONGINT:
  1585. return BOOLEAN(x != y)
  1586. default:
  1587. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1588. }
  1589. case SET:
  1590. switch y := b.(type) {
  1591. case SET:
  1592. return BOOLEAN(x.bits.Cmp(y.bits) != 0)
  1593. default:
  1594. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1595. }
  1596. case BOOLEAN:
  1597. switch y := b.(type) {
  1598. case BOOLEAN:
  1599. return BOOLEAN(x != y)
  1600. default:
  1601. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1602. }
  1603. case CHAR:
  1604. switch y := b.(type) {
  1605. case CHAR:
  1606. return BOOLEAN(x != y)
  1607. default:
  1608. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1609. }
  1610. default:
  1611. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1612. }
  1613. }
  1614. }
  1615. panic(0)
  1616. }
  1617. func (o *ops) Lss(a, b scope.Value) scope.Value {
  1618. switch a.(type) {
  1619. case *data:
  1620. return o.Lss(vfrom(a), b)
  1621. default:
  1622. switch b.(type) {
  1623. case *data:
  1624. return o.Lss(a, vfrom(b))
  1625. default:
  1626. switch x := a.(type) {
  1627. case INTEGER:
  1628. switch y := b.(type) {
  1629. case INTEGER:
  1630. return BOOLEAN(x < y)
  1631. default:
  1632. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1633. }
  1634. case REAL:
  1635. switch y := b.(type) {
  1636. case REAL:
  1637. return BOOLEAN(x < y)
  1638. default:
  1639. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1640. }
  1641. case LONGINT:
  1642. switch y := b.(type) {
  1643. case LONGINT:
  1644. return BOOLEAN(x < y)
  1645. default:
  1646. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1647. }
  1648. case CHAR:
  1649. switch y := b.(type) {
  1650. case CHAR:
  1651. return BOOLEAN(x < y)
  1652. case INTEGER:
  1653. return BOOLEAN(uint(x) < uint(y))
  1654. default:
  1655. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1656. }
  1657. default:
  1658. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1659. }
  1660. }
  1661. }
  1662. panic(0)
  1663. }
  1664. func (o *ops) Gtr(a, b scope.Value) scope.Value {
  1665. switch a.(type) {
  1666. case *data:
  1667. return o.Gtr(vfrom(a), b)
  1668. default:
  1669. switch b.(type) {
  1670. case *data:
  1671. return o.Gtr(a, vfrom(b))
  1672. default:
  1673. switch x := a.(type) {
  1674. case INTEGER:
  1675. switch y := b.(type) {
  1676. case INTEGER:
  1677. return BOOLEAN(x > y)
  1678. default:
  1679. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1680. }
  1681. case STRING:
  1682. switch y := b.(type) {
  1683. case STRING:
  1684. //fmt.Println(x, y, x > y)
  1685. return BOOLEAN(x > y)
  1686. default:
  1687. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1688. }
  1689. case REAL:
  1690. switch y := b.(type) {
  1691. case REAL:
  1692. return BOOLEAN(x > y)
  1693. default:
  1694. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1695. }
  1696. case LONGINT:
  1697. switch y := b.(type) {
  1698. case LONGINT:
  1699. return BOOLEAN(x > y)
  1700. default:
  1701. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1702. }
  1703. default:
  1704. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1705. }
  1706. }
  1707. }
  1708. panic(0)
  1709. }
  1710. func (o *ops) Leq(a, b scope.Value) scope.Value {
  1711. switch a.(type) {
  1712. case *data:
  1713. return o.Leq(vfrom(a), b)
  1714. default:
  1715. switch b.(type) {
  1716. case *data:
  1717. return o.Leq(a, vfrom(b))
  1718. default:
  1719. switch x := a.(type) {
  1720. case INTEGER:
  1721. switch y := b.(type) {
  1722. case INTEGER:
  1723. return BOOLEAN(x <= y)
  1724. default:
  1725. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1726. }
  1727. default:
  1728. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1729. }
  1730. }
  1731. }
  1732. panic(0)
  1733. }
  1734. func (o *ops) Geq(a, b scope.Value) scope.Value {
  1735. switch a.(type) {
  1736. case *data:
  1737. return o.Geq(vfrom(a), b)
  1738. default:
  1739. switch b.(type) {
  1740. case *data:
  1741. return o.Geq(a, vfrom(b))
  1742. default:
  1743. switch x := a.(type) {
  1744. case INTEGER:
  1745. switch y := b.(type) {
  1746. case INTEGER:
  1747. return BOOLEAN(x >= y)
  1748. default:
  1749. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1750. }
  1751. case REAL:
  1752. switch y := b.(type) {
  1753. case REAL:
  1754. return BOOLEAN(x >= y)
  1755. default:
  1756. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1757. }
  1758. default:
  1759. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1760. }
  1761. }
  1762. }
  1763. panic(0)
  1764. }
  1765. func (o *ops) TypeOf(x scope.Value) (object.Type, object.ComplexType) {
  1766. switch v := x.(type) {
  1767. case *ptr:
  1768. //assert.For(v.val != nil, 20, v.Id())
  1769. if v.val != nil {
  1770. return v.val.link.Type(), v.val.link.Complex()
  1771. } else {
  1772. //return v.link.Type(), v.link.Complex()
  1773. }
  1774. case *rec:
  1775. return v.link.Type(), v.link.Complex()
  1776. case *dynarr:
  1777. return v.link.Type(), v.link.Complex()
  1778. case *arr:
  1779. return v.link.Type(), v.link.Complex()
  1780. case *data:
  1781. return v.link.Type(), v.link.Complex()
  1782. default:
  1783. halt.As(100, reflect.TypeOf(v))
  1784. }
  1785. return object.NOTYPE, nil
  1786. }
  1787. func init() {
  1788. scope.ValueFrom = vfrom
  1789. scope.GoTypeFrom = gfrom
  1790. scope.TypeFromGo = fromg
  1791. scope.Ops = &ops{}
  1792. }