val.go 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873
  1. package modern
  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. return p.val.scope.Select(p.val.id)
  436. }
  437. }
  438. func newPtr(o object.Object) scope.Variable {
  439. _, ok := o.Complex().(object.PointerType)
  440. assert.For(ok, 20)
  441. return &ptr{link: o}
  442. }
  443. type ptrValue struct {
  444. scope *area
  445. id cp.ID
  446. link object.Object
  447. }
  448. func (p *ptrValue) String() string {
  449. return fmt.Sprint(p.id)
  450. }
  451. type PTR int
  452. func (p PTR) String() string {
  453. return "NIL"
  454. }
  455. const NIL PTR = 0
  456. type INTEGER int32
  457. type BOOLEAN bool
  458. type BYTE int8
  459. type SHORTINT int16
  460. type LONGINT int64
  461. type SET struct {
  462. bits *big.Int
  463. }
  464. type CHAR rune
  465. type REAL float64
  466. type SHORTREAL float32
  467. type SHORTCHAR rune
  468. type STRING string
  469. type SHORTSTRING string
  470. func (x SHORTSTRING) String() string { return string(x) }
  471. func (x STRING) String() string { return string(x) }
  472. func (x SHORTCHAR) String() string { return fmt.Sprint(rune(x)) }
  473. func (x SHORTREAL) String() string { return fmt.Sprint(float32(x)) }
  474. func (x REAL) String() string { return fmt.Sprint(float64(x)) }
  475. func (x CHAR) String() string { return fmt.Sprint(rune(x)) }
  476. func (x SET) String() string { return fmt.Sprint(x.bits) }
  477. func (x LONGINT) String() string { return fmt.Sprint(int64(x)) }
  478. func (x SHORTINT) String() string { return fmt.Sprint(int16(x)) }
  479. func (x BYTE) String() string { return fmt.Sprint(int8(x)) }
  480. func (x INTEGER) String() string { return fmt.Sprint(int32(x)) }
  481. func (x BOOLEAN) String() string { return fmt.Sprint(bool(x)) }
  482. func newData(o object.Object) (ret scope.Variable) {
  483. switch o.Type() {
  484. case object.INTEGER:
  485. ret = &data{link: o, val: INTEGER(0)}
  486. case object.BOOLEAN:
  487. ret = &data{link: o, val: BOOLEAN(false)}
  488. case object.BYTE:
  489. ret = &data{link: o, val: BYTE(0)}
  490. case object.CHAR:
  491. ret = &data{link: o, val: CHAR(0)}
  492. case object.LONGINT:
  493. ret = &data{link: o, val: LONGINT(0)}
  494. case object.SHORTINT:
  495. ret = &data{link: o, val: SHORTINT(0)}
  496. case object.SET:
  497. ret = &data{link: o, val: SET{bits: big.NewInt(0)}}
  498. case object.REAL:
  499. ret = &data{link: o, val: REAL(0)}
  500. case object.SHORTREAL:
  501. ret = &data{link: o, val: SHORTREAL(0)}
  502. case object.SHORTCHAR:
  503. ret = &data{link: o, val: SHORTCHAR(0)}
  504. case object.COMPLEX:
  505. switch t := o.Complex().(type) {
  506. case object.BasicType:
  507. switch t.Type() {
  508. case object.PROCEDURE:
  509. ret = &data{link: o, val: nil}
  510. default:
  511. halt.As(100, t.Type())
  512. }
  513. case object.ArrayType:
  514. ret = &arr{link: o, length: t.Len()}
  515. if a := ret.(*arr); t.Base() == object.COMPLEX {
  516. a.val = make([]interface{}, int(t.Len()))
  517. for i := 0; i < int(t.Len()); i++ {
  518. fake := object.New(object.VARIABLE, cp.Some())
  519. fake.SetName("[?]")
  520. fake.SetType(object.COMPLEX)
  521. fake.SetComplex(t.Complex())
  522. a.val[i] = newData(fake)
  523. }
  524. }
  525. case object.DynArrayType:
  526. ret = &dynarr{link: o}
  527. default:
  528. halt.As(100, reflect.TypeOf(t))
  529. }
  530. case object.NOTYPE:
  531. switch t := o.Complex().(type) {
  532. case nil:
  533. ret = &ptr{link: o}
  534. default:
  535. halt.As(100, reflect.TypeOf(t))
  536. }
  537. default:
  538. panic(fmt.Sprintln("unsupported type", o, o.Type(), o.Complex()))
  539. }
  540. return ret
  541. }
  542. func fromg(x interface{}) scope.Value {
  543. switch x := x.(type) {
  544. case int32:
  545. return INTEGER(x)
  546. case bool:
  547. return BOOLEAN(x)
  548. case *big.Int:
  549. return SET{bits: x}
  550. case string:
  551. return STRING(x)
  552. case float64:
  553. return REAL(x)
  554. default:
  555. halt.As(100, reflect.TypeOf(x))
  556. }
  557. panic(100)
  558. }
  559. func newProc(o object.Object) scope.Value {
  560. p, ok := o.(object.ProcedureObject)
  561. assert.For(ok, 20, reflect.TypeOf(o))
  562. return &proc{link: p}
  563. }
  564. func newConst(n node.Node) scope.Value {
  565. switch x := n.(type) {
  566. case node.ConstantNode:
  567. switch x.Type() {
  568. case object.INTEGER:
  569. return INTEGER(x.Data().(int32))
  570. case object.REAL:
  571. return REAL(x.Data().(float64))
  572. case object.BOOLEAN:
  573. return BOOLEAN(x.Data().(bool))
  574. case object.SHORTCHAR:
  575. return SHORTCHAR(x.Data().(rune))
  576. case object.LONGINT:
  577. return LONGINT(x.Data().(int64))
  578. case object.SHORTINT:
  579. return SHORTINT(x.Data().(int16))
  580. case object.SHORTREAL:
  581. return SHORTREAL(x.Data().(float32))
  582. case object.BYTE:
  583. return BYTE(x.Data().(int8))
  584. case object.SET:
  585. return SET{bits: x.Data().(*big.Int)}
  586. case object.CHAR:
  587. return CHAR(x.Data().(rune))
  588. case object.STRING:
  589. return STRING(x.Data().(string))
  590. case object.SHORTSTRING:
  591. return SHORTSTRING(x.Data().(string))
  592. case object.NIL:
  593. return NIL
  594. case object.COMPLEX: //не может существовать в реальности, используется для передачи параметров от рантайма
  595. switch d := x.Data().(type) {
  596. case *ptrValue:
  597. return d
  598. default:
  599. halt.As(100, reflect.TypeOf(d))
  600. }
  601. default:
  602. panic(fmt.Sprintln(x.Type()))
  603. }
  604. }
  605. panic(0)
  606. }
  607. func vfrom(v scope.Value) scope.Value {
  608. switch n := v.(type) {
  609. case *data:
  610. switch n.link.Type() {
  611. case object.INTEGER:
  612. return n.val.(INTEGER)
  613. case object.BYTE:
  614. return n.val.(BYTE)
  615. case object.CHAR:
  616. return n.val.(CHAR)
  617. case object.SET:
  618. return n.val.(SET)
  619. case object.BOOLEAN:
  620. return n.val.(BOOLEAN)
  621. case object.REAL:
  622. return n.val.(REAL)
  623. case object.LONGINT:
  624. return n.val.(LONGINT)
  625. default:
  626. halt.As(100, n.link.Type())
  627. }
  628. case INTEGER, CHAR:
  629. return n
  630. default:
  631. halt.As(100, reflect.TypeOf(n))
  632. }
  633. return nil
  634. }
  635. func gfrom(v scope.Value) interface{} {
  636. switch n := v.(type) {
  637. case *data:
  638. if n.val == nil {
  639. return nil
  640. } else {
  641. return gfrom(n.val.(scope.Value))
  642. }
  643. case *rec:
  644. return n
  645. case *ptr:
  646. return n
  647. case *proc:
  648. return n.link
  649. case *dynarr:
  650. switch n.link.Complex().(object.DynArrayType).Base() {
  651. case object.SHORTCHAR:
  652. if n.val != nil {
  653. return n.tryString()
  654. } else {
  655. return ""
  656. }
  657. case object.CHAR:
  658. if n.val != nil {
  659. return n.tryString()
  660. } else {
  661. return ""
  662. }
  663. case object.COMPLEX:
  664. return n.val
  665. default:
  666. halt.As(100, n.link.Complex().(object.DynArrayType).Base())
  667. }
  668. panic(0)
  669. case *arr:
  670. switch n.link.Complex().(object.ArrayType).Base() {
  671. case object.SHORTCHAR:
  672. if n.val != nil {
  673. return n.tryString()
  674. } else {
  675. return ""
  676. }
  677. case object.CHAR:
  678. if n.val != nil {
  679. return n.tryString()
  680. } else {
  681. return ""
  682. }
  683. case object.REAL:
  684. ret := make([]float64, 0)
  685. for i := 0; i < len(n.val) && n.val[i] != nil; i++ {
  686. ret = append(ret, float64(n.val[i].(REAL)))
  687. }
  688. return ret
  689. default:
  690. halt.As(100, n.link.Complex().(object.ArrayType).Base())
  691. }
  692. panic(0)
  693. case *idx:
  694. switch t := n.link().Complex().(type) {
  695. case object.ArrayType:
  696. switch t.Base() {
  697. case object.CHAR:
  698. return rune(n.Get().(CHAR))
  699. default:
  700. halt.As(100, t.Base())
  701. }
  702. case object.DynArrayType:
  703. switch t.Base() {
  704. case object.CHAR:
  705. return rune(n.Get().(CHAR))
  706. default:
  707. halt.As(100, t.Base())
  708. }
  709. default:
  710. halt.As(100, reflect.TypeOf(t))
  711. }
  712. panic(0)
  713. case PTR:
  714. assert.For(n == NIL, 40)
  715. return nil
  716. case INTEGER:
  717. return int32(n)
  718. case BOOLEAN:
  719. return bool(n)
  720. case STRING:
  721. return string(n)
  722. case CHAR:
  723. return rune(n)
  724. default:
  725. halt.As(100, reflect.TypeOf(n))
  726. }
  727. return nil
  728. }
  729. type ops struct{}
  730. func (o *ops) Sum(a, b scope.Value) scope.Value {
  731. switch a.(type) {
  732. case *data:
  733. return o.Sum(vfrom(a), b)
  734. default:
  735. switch b.(type) {
  736. case *data:
  737. return o.Sum(a, vfrom(b))
  738. default:
  739. switch x := a.(type) {
  740. case INTEGER:
  741. switch y := b.(type) {
  742. case INTEGER:
  743. return INTEGER(int32(x) + int32(y))
  744. default:
  745. panic(fmt.Sprintln(reflect.TypeOf(y)))
  746. }
  747. case SET:
  748. switch y := b.(type) {
  749. case SET:
  750. res := big.NewInt(0)
  751. for i := 0; i < 64; i++ {
  752. if x.bits.Bit(i) == 1 {
  753. res.SetBit(res, i, 1)
  754. }
  755. if y.bits.Bit(i) == 1 {
  756. res.SetBit(res, i, 1)
  757. }
  758. }
  759. return SET{bits: res}
  760. case INTEGER: // INCL(SET, INTEGER)
  761. return SET{bits: x.bits.SetBit(x.bits, int(y), 1)}
  762. default:
  763. panic(fmt.Sprintln(reflect.TypeOf(y)))
  764. }
  765. case *arr:
  766. switch y := b.(type) {
  767. case *arr:
  768. switch {
  769. case x.link.Type() == y.link.Type() && x.link.Complex().(object.ArrayType).Base() == object.CHAR:
  770. return STRING(x.tryString() + y.tryString())
  771. default:
  772. halt.As(100, x.link.Type(), y.link.Type())
  773. }
  774. case STRING:
  775. switch {
  776. case x.link.Complex().(object.ArrayType).Base() == object.CHAR:
  777. return STRING(x.tryString() + string(y))
  778. default:
  779. halt.As(100, x.link.Type())
  780. }
  781. default:
  782. panic(fmt.Sprintln(reflect.TypeOf(y)))
  783. }
  784. case *dynarr:
  785. switch y := b.(type) {
  786. case STRING:
  787. switch {
  788. case x.link.Complex().(object.DynArrayType).Base() == object.CHAR:
  789. return STRING(x.tryString() + string(y))
  790. default:
  791. halt.As(100, x.link.Type())
  792. }
  793. default:
  794. panic(fmt.Sprintln(reflect.TypeOf(y)))
  795. }
  796. case STRING:
  797. switch y := b.(type) {
  798. case STRING:
  799. return STRING(string(x) + string(y))
  800. default:
  801. halt.As(100, reflect.TypeOf(y))
  802. }
  803. case REAL:
  804. switch y := b.(type) {
  805. case REAL:
  806. return REAL(x + y)
  807. default:
  808. halt.As(100, reflect.TypeOf(y))
  809. }
  810. case LONGINT:
  811. switch y := b.(type) {
  812. case LONGINT:
  813. return LONGINT(x + y)
  814. default:
  815. halt.As(100, reflect.TypeOf(y))
  816. }
  817. default:
  818. panic(fmt.Sprintln(reflect.TypeOf(x)))
  819. }
  820. }
  821. }
  822. panic(0)
  823. }
  824. func (o *ops) Sub(a, b scope.Value) scope.Value {
  825. switch a.(type) {
  826. case *data:
  827. return o.Sub(vfrom(a), b)
  828. default:
  829. switch b.(type) {
  830. case *data:
  831. return o.Sub(a, vfrom(b))
  832. default:
  833. switch x := a.(type) {
  834. case INTEGER:
  835. switch y := b.(type) {
  836. case INTEGER:
  837. return INTEGER(int32(x) - int32(y))
  838. default:
  839. panic(fmt.Sprintln(reflect.TypeOf(y)))
  840. }
  841. case REAL:
  842. switch y := b.(type) {
  843. case REAL:
  844. return REAL(x - y)
  845. default:
  846. panic(fmt.Sprintln(reflect.TypeOf(y)))
  847. }
  848. case LONGINT:
  849. switch y := b.(type) {
  850. case LONGINT:
  851. return INTEGER(int64(x) - int64(y))
  852. default:
  853. panic(fmt.Sprintln(reflect.TypeOf(y)))
  854. }
  855. case SET:
  856. switch y := b.(type) {
  857. case SET:
  858. res := big.NewInt(0).Set(x.bits)
  859. for i := 0; i < 64; i++ {
  860. if y.bits.Bit(i) == 1 {
  861. res.SetBit(res, i, 0)
  862. }
  863. }
  864. return SET{bits: res}
  865. case INTEGER:
  866. null := big.NewInt(0)
  867. res := null.SetBit(x.bits, int(y), 0)
  868. return SET{bits: res}
  869. default:
  870. panic(fmt.Sprintln(reflect.TypeOf(y)))
  871. }
  872. default:
  873. panic(fmt.Sprintln(reflect.TypeOf(x)))
  874. }
  875. }
  876. }
  877. panic(0)
  878. }
  879. func (o *ops) In(a, b scope.Value) scope.Value {
  880. switch a.(type) {
  881. case *data:
  882. return o.In(vfrom(a), b)
  883. default:
  884. switch b.(type) {
  885. case *data:
  886. return o.In(a, vfrom(b))
  887. default:
  888. switch x := a.(type) {
  889. case INTEGER:
  890. switch y := b.(type) {
  891. case SET:
  892. assert.For(int(x) < 64, 20)
  893. return BOOLEAN(y.bits.Bit(int(x)) == 1)
  894. default:
  895. panic(fmt.Sprintln(reflect.TypeOf(y)))
  896. }
  897. default:
  898. panic(fmt.Sprintln(reflect.TypeOf(x)))
  899. }
  900. }
  901. }
  902. panic(0)
  903. }
  904. func (o *ops) Min(a, b scope.Value) scope.Value {
  905. switch a.(type) {
  906. case *data:
  907. return o.Min(vfrom(a), b)
  908. default:
  909. switch b.(type) {
  910. case *data:
  911. return o.Min(a, vfrom(b))
  912. default:
  913. switch x := a.(type) {
  914. case INTEGER:
  915. switch y := b.(type) {
  916. case INTEGER:
  917. return INTEGER(int32(math.Min(float64(x), float64(y))))
  918. default:
  919. panic(fmt.Sprintln(reflect.TypeOf(y)))
  920. }
  921. default:
  922. panic(fmt.Sprintln(reflect.TypeOf(x)))
  923. }
  924. }
  925. }
  926. panic(0)
  927. }
  928. func (o *ops) Max(a, b scope.Value) scope.Value {
  929. switch a.(type) {
  930. case *data:
  931. return o.Max(vfrom(a), b)
  932. default:
  933. switch b.(type) {
  934. case *data:
  935. return o.Max(a, vfrom(b))
  936. default:
  937. switch x := a.(type) {
  938. case INTEGER:
  939. switch y := b.(type) {
  940. case INTEGER:
  941. return INTEGER(int32(math.Max(float64(x), float64(y))))
  942. default:
  943. panic(fmt.Sprintln(reflect.TypeOf(y)))
  944. }
  945. default:
  946. panic(fmt.Sprintln(reflect.TypeOf(x)))
  947. }
  948. }
  949. }
  950. panic(0)
  951. }
  952. func (o *ops) And(a, b scope.Value) scope.Value {
  953. switch a.(type) {
  954. case *data:
  955. return o.And(vfrom(a), b)
  956. default:
  957. switch b.(type) {
  958. case *data:
  959. return o.And(a, vfrom(b))
  960. default:
  961. switch x := a.(type) {
  962. case BOOLEAN:
  963. switch y := b.(type) {
  964. case BOOLEAN:
  965. return BOOLEAN(x && y)
  966. default:
  967. panic(fmt.Sprintln(reflect.TypeOf(y)))
  968. }
  969. default:
  970. panic(fmt.Sprintln(reflect.TypeOf(x)))
  971. }
  972. }
  973. }
  974. panic(0)
  975. }
  976. func (o *ops) Or(a, b scope.Value) scope.Value {
  977. switch a.(type) {
  978. case *data:
  979. return o.Or(vfrom(a), b)
  980. default:
  981. switch b.(type) {
  982. case *data:
  983. return o.Or(a, vfrom(b))
  984. default:
  985. switch x := a.(type) {
  986. case BOOLEAN:
  987. switch y := b.(type) {
  988. case BOOLEAN:
  989. return BOOLEAN(x || y)
  990. default:
  991. panic(fmt.Sprintln(reflect.TypeOf(y)))
  992. }
  993. default:
  994. panic(fmt.Sprintln(reflect.TypeOf(x)))
  995. }
  996. }
  997. }
  998. panic(0)
  999. }
  1000. func (o *ops) Ash(a, b scope.Value) scope.Value {
  1001. switch a.(type) {
  1002. case *data:
  1003. return o.Ash(vfrom(a), b)
  1004. default:
  1005. switch b.(type) {
  1006. case *data:
  1007. return o.Ash(a, vfrom(b))
  1008. default:
  1009. switch x := a.(type) {
  1010. case INTEGER:
  1011. switch y := b.(type) {
  1012. case INTEGER:
  1013. return INTEGER(x << uint(y))
  1014. default:
  1015. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1016. }
  1017. default:
  1018. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1019. }
  1020. }
  1021. }
  1022. panic(0)
  1023. }
  1024. func (o *ops) Div(a, b scope.Value) scope.Value {
  1025. switch a.(type) {
  1026. case *data:
  1027. return o.Div(vfrom(a), b)
  1028. default:
  1029. switch b.(type) {
  1030. case *data:
  1031. return o.Div(a, vfrom(b))
  1032. default:
  1033. switch x := a.(type) {
  1034. case INTEGER:
  1035. switch y := b.(type) {
  1036. case INTEGER:
  1037. return INTEGER(math.Floor(float64(x) / float64(y)))
  1038. default:
  1039. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1040. }
  1041. case LONGINT:
  1042. switch y := b.(type) {
  1043. case LONGINT:
  1044. return LONGINT(x / y)
  1045. default:
  1046. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1047. }
  1048. default:
  1049. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1050. }
  1051. }
  1052. }
  1053. panic(0)
  1054. }
  1055. func (o *ops) Mod(a, b scope.Value) scope.Value {
  1056. switch a.(type) {
  1057. case *data:
  1058. return o.Mod(vfrom(a), b)
  1059. default:
  1060. switch b.(type) {
  1061. case *data:
  1062. return o.Mod(a, vfrom(b))
  1063. default:
  1064. switch x := a.(type) {
  1065. case INTEGER:
  1066. switch y := b.(type) {
  1067. case INTEGER:
  1068. z := x % y
  1069. switch {
  1070. case (x < 0) != (y < 0):
  1071. z = z + y
  1072. }
  1073. return INTEGER(z)
  1074. default:
  1075. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1076. }
  1077. case LONGINT:
  1078. switch y := b.(type) {
  1079. case LONGINT:
  1080. z := x % y
  1081. switch {
  1082. case (x < 0) != (y < 0):
  1083. z = z + y
  1084. }
  1085. return LONGINT(z)
  1086. default:
  1087. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1088. }
  1089. default:
  1090. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1091. }
  1092. }
  1093. }
  1094. panic(0)
  1095. }
  1096. func (o *ops) Msk(a, b scope.Value) scope.Value {
  1097. switch a.(type) {
  1098. case *data:
  1099. return o.Msk(vfrom(a), b)
  1100. default:
  1101. switch b.(type) {
  1102. case *data:
  1103. return o.Msk(a, vfrom(b))
  1104. default:
  1105. switch x := a.(type) {
  1106. case INTEGER:
  1107. switch y := b.(type) {
  1108. case INTEGER:
  1109. y = -y
  1110. z := x % y
  1111. switch {
  1112. case (x < 0) != (y < 0):
  1113. z = z + y
  1114. }
  1115. return INTEGER(z)
  1116. default:
  1117. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1118. }
  1119. case LONGINT:
  1120. switch y := b.(type) {
  1121. case LONGINT:
  1122. y = -y
  1123. z := x % y
  1124. switch {
  1125. case (x < 0) != (y < 0):
  1126. z = z + y
  1127. }
  1128. return LONGINT(z)
  1129. default:
  1130. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1131. }
  1132. default:
  1133. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1134. }
  1135. }
  1136. }
  1137. panic(0)
  1138. }
  1139. func (o *ops) Mult(a, b scope.Value) scope.Value {
  1140. switch a.(type) {
  1141. case *data:
  1142. return o.Mult(vfrom(a), b)
  1143. default:
  1144. switch b.(type) {
  1145. case *data:
  1146. return o.Mult(a, vfrom(b))
  1147. default:
  1148. switch x := a.(type) {
  1149. case INTEGER:
  1150. switch y := b.(type) {
  1151. case INTEGER:
  1152. return INTEGER(x * y)
  1153. default:
  1154. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1155. }
  1156. case REAL:
  1157. switch y := b.(type) {
  1158. case REAL:
  1159. return REAL(x * y)
  1160. default:
  1161. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1162. }
  1163. case SET:
  1164. switch y := b.(type) {
  1165. case SET:
  1166. res := big.NewInt(0)
  1167. for i := 0; i < 64; i++ {
  1168. if x.bits.Bit(i) == 1 && y.bits.Bit(i) == 1 {
  1169. res.SetBit(res, i, 1)
  1170. }
  1171. }
  1172. return SET{bits: res}
  1173. default:
  1174. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1175. }
  1176. default:
  1177. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1178. }
  1179. }
  1180. }
  1181. panic(0)
  1182. }
  1183. func (o *ops) Divide(a, b scope.Value) scope.Value {
  1184. switch a.(type) {
  1185. case *data:
  1186. return o.Divide(vfrom(a), b)
  1187. default:
  1188. switch b.(type) {
  1189. case *data:
  1190. return o.Divide(a, vfrom(b))
  1191. default:
  1192. switch x := a.(type) {
  1193. case INTEGER:
  1194. switch y := b.(type) {
  1195. case INTEGER:
  1196. return REAL(float64(x) / float64(y))
  1197. default:
  1198. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1199. }
  1200. case REAL:
  1201. switch y := b.(type) {
  1202. case REAL:
  1203. return REAL(float64(x) / float64(y))
  1204. default:
  1205. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1206. }
  1207. case SET:
  1208. switch y := b.(type) {
  1209. case SET:
  1210. res := big.NewInt(0)
  1211. for i := 0; i < 64; i++ {
  1212. if x.bits.Bit(i) != y.bits.Bit(i) {
  1213. res.SetBit(res, i, 1)
  1214. }
  1215. }
  1216. return SET{bits: res}
  1217. default:
  1218. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1219. }
  1220. default:
  1221. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1222. }
  1223. }
  1224. }
  1225. panic(0)
  1226. }
  1227. func (o *ops) Len(a object.Object, _a, _b scope.Value) (ret scope.Value) {
  1228. //assert.For(a != nil, 20)
  1229. assert.For(_b != nil, 21)
  1230. var b int32 = gfrom(_b).(int32)
  1231. assert.For(b == 0, 22)
  1232. if a != nil {
  1233. assert.For(a.Type() == object.COMPLEX, 23)
  1234. switch typ := a.Complex().(type) {
  1235. case object.ArrayType:
  1236. ret = INTEGER(int32(typ.Len()))
  1237. case object.DynArrayType:
  1238. switch t := _a.(type) {
  1239. case *arr:
  1240. ret = INTEGER(t.length)
  1241. case *dynarr:
  1242. ret = INTEGER(len(t.val))
  1243. default:
  1244. halt.As(100, "unsupported", reflect.TypeOf(t))
  1245. }
  1246. default:
  1247. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a.Complex())))
  1248. }
  1249. } else {
  1250. switch a := _a.(type) {
  1251. case *arr:
  1252. ret = INTEGER(int32(a.length))
  1253. case *dynarr:
  1254. ret = INTEGER(int32(len(a.val)))
  1255. case STRING:
  1256. rs := []rune(string(a))
  1257. ln := len(rs)
  1258. ret = INTEGER(0)
  1259. for l := 0; l < ln && rs[l] != 0; l++ {
  1260. ret = INTEGER(l + 1)
  1261. }
  1262. default:
  1263. panic(fmt.Sprintln("unsupported", reflect.TypeOf(a)))
  1264. }
  1265. }
  1266. return ret
  1267. }
  1268. func (o *ops) Is(a scope.Value, typ object.ComplexType) scope.Value {
  1269. var compare func(x, a object.ComplexType) bool
  1270. compare = func(_x, _a object.ComplexType) bool {
  1271. switch x := _x.(type) {
  1272. case object.RecordType:
  1273. switch a := _a.(type) {
  1274. case object.RecordType:
  1275. switch {
  1276. case x.Name() == a.Name():
  1277. // fmt.Println("eq")
  1278. //fmt.Println("qid ", _x.Qualident(), _a.Qualident(), "names ", x.Name(), a.Name())
  1279. return true //опасно сравнивать имена конеш
  1280. case x.Complex() != nil:
  1281. // fmt.Println("go base")
  1282. return compare(x.Complex(), a)
  1283. default:
  1284. return false
  1285. }
  1286. case object.PointerType:
  1287. if a.Complex() != nil {
  1288. return compare(x, a.Complex())
  1289. } else {
  1290. fmt.Println("here")
  1291. return false
  1292. }
  1293. default:
  1294. halt.As(100, reflect.TypeOf(a))
  1295. }
  1296. case object.PointerType:
  1297. switch a := _a.(type) {
  1298. case object.PointerType:
  1299. switch {
  1300. case x.Name() == a.Name():
  1301. // fmt.Println("eq")
  1302. return true //опасно сравнивать имена конеш
  1303. case x.Complex() != nil:
  1304. // fmt.Println("go base")
  1305. return compare(x.Complex(), a)
  1306. default:
  1307. return false
  1308. }
  1309. default:
  1310. halt.As(100, reflect.TypeOf(a))
  1311. }
  1312. default:
  1313. halt.As(100, reflect.TypeOf(a))
  1314. }
  1315. panic(0)
  1316. }
  1317. switch x := a.(type) {
  1318. case *rec:
  1319. z, a := x.link.Complex().(object.RecordType)
  1320. y, b := typ.(object.RecordType)
  1321. //fmt.Println("compare rec", x.link.Complex(), typ, a, b, a && b && compare(z, y))
  1322. return BOOLEAN(a && b && compare(z, y))
  1323. case *ptr:
  1324. z, a := x.link.Complex().(object.PointerType)
  1325. if val := x.Get(); z.Name() == "ANYPTR" && val != NIL {
  1326. t, c := o.TypeOf(val)
  1327. assert.For(t == object.COMPLEX, 40)
  1328. z, a = c.(object.RecordType)
  1329. }
  1330. y, b := typ.(object.PointerType)
  1331. //fmt.Println("compare ptr", z, typ, a, b, a && b && compare(z, y))
  1332. return BOOLEAN(a && b && compare(z, y))
  1333. default:
  1334. halt.As(100, reflect.TypeOf(x))
  1335. }
  1336. panic(0)
  1337. }
  1338. func (o *ops) Conv(a scope.Value, typ object.Type, comp ...object.ComplexType) scope.Value {
  1339. switch typ {
  1340. case object.INTEGER:
  1341. switch x := a.(type) {
  1342. case *data:
  1343. return o.Conv(vfrom(x), typ, comp...)
  1344. case *idx:
  1345. //t, c := x.base()
  1346. return o.Conv(x.val()[x.idx].(scope.Value), typ, comp...)
  1347. case BYTE:
  1348. return INTEGER(x)
  1349. case SET:
  1350. return INTEGER(x.bits.Int64())
  1351. case REAL:
  1352. return INTEGER(x)
  1353. case LONGINT:
  1354. return INTEGER(x)
  1355. case CHAR:
  1356. return INTEGER(x)
  1357. default:
  1358. halt.As(100, reflect.TypeOf(x))
  1359. }
  1360. case object.LONGINT:
  1361. switch x := a.(type) {
  1362. case *data:
  1363. return o.Conv(vfrom(x), typ, comp...)
  1364. case INTEGER:
  1365. return LONGINT(x)
  1366. case REAL:
  1367. return LONGINT(math.Floor(float64(x)))
  1368. default:
  1369. halt.As(100, reflect.TypeOf(x))
  1370. }
  1371. case object.SET:
  1372. switch x := a.(type) {
  1373. case *data:
  1374. return o.Conv(vfrom(x), typ, comp...)
  1375. case INTEGER:
  1376. return SET{bits: big.NewInt(int64(x))}
  1377. default:
  1378. halt.As(100, reflect.TypeOf(x))
  1379. }
  1380. case object.REAL:
  1381. switch x := a.(type) {
  1382. case *data:
  1383. return o.Conv(vfrom(x), typ, comp...)
  1384. case INTEGER:
  1385. return REAL(float64(x))
  1386. default:
  1387. halt.As(100, reflect.TypeOf(x))
  1388. }
  1389. case object.CHAR:
  1390. switch x := a.(type) {
  1391. case *data:
  1392. return o.Conv(vfrom(x), typ, comp...)
  1393. case LONGINT:
  1394. return CHAR(rune(x))
  1395. case INTEGER:
  1396. return CHAR(rune(x))
  1397. case CHAR:
  1398. return x
  1399. default:
  1400. halt.As(100, reflect.TypeOf(x))
  1401. }
  1402. case object.NOTYPE:
  1403. assert.For(len(comp) > 0, 20)
  1404. switch t := comp[0].(type) {
  1405. case object.BasicType:
  1406. switch t.Type() {
  1407. case object.SHORTSTRING:
  1408. switch x := a.(type) {
  1409. case *dynarr:
  1410. return SHORTSTRING(x.tryString())
  1411. case *arr:
  1412. return SHORTSTRING(x.tryString())
  1413. case STRING:
  1414. return SHORTSTRING(x)
  1415. default:
  1416. halt.As(100, reflect.TypeOf(x))
  1417. }
  1418. default:
  1419. halt.As(100, t.Type())
  1420. }
  1421. default:
  1422. halt.As(100, reflect.TypeOf(t))
  1423. }
  1424. default:
  1425. halt.As(100, typ)
  1426. }
  1427. panic(100)
  1428. }
  1429. func (o *ops) Not(a scope.Value) scope.Value {
  1430. switch x := a.(type) {
  1431. case *data:
  1432. return o.Not(vfrom(x))
  1433. case BOOLEAN:
  1434. return BOOLEAN(!x)
  1435. default:
  1436. halt.As(100, reflect.TypeOf(x))
  1437. }
  1438. panic(100)
  1439. }
  1440. func (o *ops) Abs(a scope.Value) scope.Value {
  1441. switch x := a.(type) {
  1442. case *data:
  1443. return o.Abs(vfrom(x))
  1444. case INTEGER:
  1445. return INTEGER(int32(math.Abs(float64(x))))
  1446. default:
  1447. halt.As(100, reflect.TypeOf(x))
  1448. }
  1449. panic(100)
  1450. }
  1451. func (o *ops) Minus(a scope.Value) scope.Value {
  1452. switch x := a.(type) {
  1453. case *data:
  1454. return o.Minus(vfrom(x))
  1455. case INTEGER:
  1456. return INTEGER(-x)
  1457. case LONGINT:
  1458. return LONGINT(-x)
  1459. case REAL:
  1460. return REAL(-x)
  1461. default:
  1462. halt.As(100, reflect.TypeOf(x))
  1463. }
  1464. panic(100)
  1465. }
  1466. func (o *ops) Odd(a scope.Value) scope.Value {
  1467. switch x := a.(type) {
  1468. case *data:
  1469. return o.Odd(vfrom(x))
  1470. case INTEGER:
  1471. return BOOLEAN(int64(math.Abs(float64(x)))%2 == 1)
  1472. case LONGINT:
  1473. return BOOLEAN(int64(math.Abs(float64(x)))%2 == 1)
  1474. default:
  1475. halt.As(100, reflect.TypeOf(x))
  1476. }
  1477. panic(100)
  1478. }
  1479. func (o *ops) Cap(a scope.Value) scope.Value {
  1480. switch x := a.(type) {
  1481. case *data:
  1482. return o.Cap(vfrom(x))
  1483. case CHAR:
  1484. return CHAR([]rune(strings.ToUpper(string(x)))[0])
  1485. default:
  1486. halt.As(100, reflect.TypeOf(x))
  1487. }
  1488. panic(100)
  1489. }
  1490. func (o *ops) Bits(a scope.Value) scope.Value {
  1491. switch x := a.(type) {
  1492. case *data:
  1493. return o.Bits(vfrom(x))
  1494. case INTEGER:
  1495. return SET{bits: big.NewInt(0).SetBit(big.NewInt(0), int(x), 1)}
  1496. default:
  1497. halt.As(100, reflect.TypeOf(x))
  1498. }
  1499. panic(100)
  1500. }
  1501. func (o *ops) Eq(a, b scope.Value) scope.Value {
  1502. switch a.(type) {
  1503. case *data:
  1504. return o.Eq(vfrom(a), b)
  1505. default:
  1506. switch b.(type) {
  1507. case *data:
  1508. return o.Eq(a, vfrom(b))
  1509. default:
  1510. switch x := a.(type) {
  1511. case *ptr:
  1512. switch y := b.(type) {
  1513. case PTR:
  1514. assert.For(y == NIL, 40)
  1515. return BOOLEAN(x.val == nil || x.val.id == 0)
  1516. default:
  1517. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1518. }
  1519. case INTEGER:
  1520. switch y := b.(type) {
  1521. case INTEGER:
  1522. return BOOLEAN(x == y)
  1523. default:
  1524. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1525. }
  1526. case LONGINT:
  1527. switch y := b.(type) {
  1528. case LONGINT:
  1529. return BOOLEAN(x == y)
  1530. default:
  1531. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1532. }
  1533. case CHAR:
  1534. switch y := b.(type) {
  1535. case CHAR:
  1536. return BOOLEAN(x == y)
  1537. default:
  1538. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1539. }
  1540. default:
  1541. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1542. }
  1543. }
  1544. }
  1545. panic(0)
  1546. }
  1547. func (o *ops) Neq(a, b scope.Value) scope.Value {
  1548. switch i := a.(type) {
  1549. case *data:
  1550. return o.Neq(vfrom(a), b)
  1551. case *idx:
  1552. return o.Neq(vfrom(i.Get()), b)
  1553. default:
  1554. switch b.(type) {
  1555. case *data:
  1556. return o.Neq(a, vfrom(b))
  1557. default:
  1558. switch x := a.(type) {
  1559. case *ptr:
  1560. switch y := b.(type) {
  1561. case PTR:
  1562. assert.For(y == NIL, 40)
  1563. return BOOLEAN(x.val != nil && x.val.id != 0)
  1564. default:
  1565. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1566. }
  1567. case INTEGER:
  1568. switch y := b.(type) {
  1569. case INTEGER:
  1570. return BOOLEAN(x != y)
  1571. default:
  1572. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1573. }
  1574. case REAL:
  1575. switch y := b.(type) {
  1576. case REAL:
  1577. return BOOLEAN(x != y)
  1578. default:
  1579. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1580. }
  1581. case LONGINT:
  1582. switch y := b.(type) {
  1583. case LONGINT:
  1584. return BOOLEAN(x != y)
  1585. default:
  1586. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1587. }
  1588. case SET:
  1589. switch y := b.(type) {
  1590. case SET:
  1591. return BOOLEAN(x.bits.Cmp(y.bits) != 0)
  1592. default:
  1593. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1594. }
  1595. case BOOLEAN:
  1596. switch y := b.(type) {
  1597. case BOOLEAN:
  1598. return BOOLEAN(x != y)
  1599. default:
  1600. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1601. }
  1602. case CHAR:
  1603. switch y := b.(type) {
  1604. case CHAR:
  1605. return BOOLEAN(x != y)
  1606. default:
  1607. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1608. }
  1609. default:
  1610. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1611. }
  1612. }
  1613. }
  1614. panic(0)
  1615. }
  1616. func (o *ops) Lss(a, b scope.Value) scope.Value {
  1617. switch a.(type) {
  1618. case *data:
  1619. return o.Lss(vfrom(a), b)
  1620. default:
  1621. switch b.(type) {
  1622. case *data:
  1623. return o.Lss(a, vfrom(b))
  1624. default:
  1625. switch x := a.(type) {
  1626. case INTEGER:
  1627. switch y := b.(type) {
  1628. case INTEGER:
  1629. return BOOLEAN(x < y)
  1630. default:
  1631. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1632. }
  1633. case REAL:
  1634. switch y := b.(type) {
  1635. case REAL:
  1636. return BOOLEAN(x < y)
  1637. default:
  1638. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1639. }
  1640. case LONGINT:
  1641. switch y := b.(type) {
  1642. case LONGINT:
  1643. return BOOLEAN(x < y)
  1644. default:
  1645. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1646. }
  1647. case CHAR:
  1648. switch y := b.(type) {
  1649. case CHAR:
  1650. return BOOLEAN(x < y)
  1651. case INTEGER:
  1652. return BOOLEAN(uint(x) < uint(y))
  1653. default:
  1654. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1655. }
  1656. default:
  1657. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1658. }
  1659. }
  1660. }
  1661. panic(0)
  1662. }
  1663. func (o *ops) Gtr(a, b scope.Value) scope.Value {
  1664. switch a.(type) {
  1665. case *data:
  1666. return o.Gtr(vfrom(a), b)
  1667. default:
  1668. switch b.(type) {
  1669. case *data:
  1670. return o.Gtr(a, vfrom(b))
  1671. default:
  1672. switch x := a.(type) {
  1673. case INTEGER:
  1674. switch y := b.(type) {
  1675. case INTEGER:
  1676. return BOOLEAN(x > y)
  1677. default:
  1678. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1679. }
  1680. case STRING:
  1681. switch y := b.(type) {
  1682. case STRING:
  1683. //fmt.Println(x, y, x > y)
  1684. return BOOLEAN(x > y)
  1685. default:
  1686. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1687. }
  1688. case REAL:
  1689. switch y := b.(type) {
  1690. case REAL:
  1691. return BOOLEAN(x > y)
  1692. default:
  1693. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1694. }
  1695. case LONGINT:
  1696. switch y := b.(type) {
  1697. case LONGINT:
  1698. return BOOLEAN(x > y)
  1699. default:
  1700. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1701. }
  1702. default:
  1703. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1704. }
  1705. }
  1706. }
  1707. panic(0)
  1708. }
  1709. func (o *ops) Leq(a, b scope.Value) scope.Value {
  1710. switch a.(type) {
  1711. case *data:
  1712. return o.Leq(vfrom(a), b)
  1713. default:
  1714. switch b.(type) {
  1715. case *data:
  1716. return o.Leq(a, vfrom(b))
  1717. default:
  1718. switch x := a.(type) {
  1719. case INTEGER:
  1720. switch y := b.(type) {
  1721. case INTEGER:
  1722. return BOOLEAN(x <= y)
  1723. default:
  1724. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1725. }
  1726. default:
  1727. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1728. }
  1729. }
  1730. }
  1731. panic(0)
  1732. }
  1733. func (o *ops) Geq(a, b scope.Value) scope.Value {
  1734. switch a.(type) {
  1735. case *data:
  1736. return o.Geq(vfrom(a), b)
  1737. default:
  1738. switch b.(type) {
  1739. case *data:
  1740. return o.Geq(a, vfrom(b))
  1741. default:
  1742. switch x := a.(type) {
  1743. case INTEGER:
  1744. switch y := b.(type) {
  1745. case INTEGER:
  1746. return BOOLEAN(x >= y)
  1747. default:
  1748. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1749. }
  1750. case REAL:
  1751. switch y := b.(type) {
  1752. case REAL:
  1753. return BOOLEAN(x >= y)
  1754. default:
  1755. panic(fmt.Sprintln(reflect.TypeOf(y)))
  1756. }
  1757. default:
  1758. panic(fmt.Sprintln(reflect.TypeOf(x)))
  1759. }
  1760. }
  1761. }
  1762. panic(0)
  1763. }
  1764. func (o *ops) TypeOf(x scope.Value) (object.Type, object.ComplexType) {
  1765. switch v := x.(type) {
  1766. case *ptr:
  1767. //assert.For(v.val != nil, 20, v.Id())
  1768. if v.val != nil {
  1769. return v.val.link.Type(), v.val.link.Complex()
  1770. } else {
  1771. //return v.link.Type(), v.link.Complex()
  1772. }
  1773. case *rec:
  1774. return v.link.Type(), v.link.Complex()
  1775. case *dynarr:
  1776. return v.link.Type(), v.link.Complex()
  1777. case *arr:
  1778. return v.link.Type(), v.link.Complex()
  1779. case *data:
  1780. return v.link.Type(), v.link.Complex()
  1781. default:
  1782. halt.As(100, reflect.TypeOf(v))
  1783. }
  1784. return object.NOTYPE, nil
  1785. }
  1786. func init() {
  1787. scope.ValueFrom = vfrom
  1788. scope.GoTypeFrom = gfrom
  1789. scope.TypeFromGo = fromg
  1790. scope.Ops = &ops{}
  1791. }