@@ -224,11 +224,6 @@ func (c *compiler) IdentifierNode(node *ast.IdentifierNode) {
224
224
} else {
225
225
c .emit (OpLoadConst , c .addConstant (node .Value ))
226
226
}
227
- if node .Deref {
228
- c .emit (OpDeref )
229
- } else if node .Type () == nil {
230
- c .emit (OpDeref )
231
- }
232
227
}
233
228
234
229
func (c * compiler ) IntegerNode (node * ast.IntegerNode ) {
@@ -289,6 +284,7 @@ func (c *compiler) ConstantNode(node *ast.ConstantNode) {
289
284
290
285
func (c * compiler ) UnaryNode (node * ast.UnaryNode ) {
291
286
c .compile (node .Node )
287
+ c .derefInNeeded (node .Node )
292
288
293
289
switch node .Operator {
294
290
@@ -313,7 +309,9 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) {
313
309
switch node .Operator {
314
310
case "==" :
315
311
c .compile (node .Left )
312
+ c .derefInNeeded (node .Left )
316
313
c .compile (node .Right )
314
+ c .derefInNeeded (node .Left )
317
315
318
316
if l == r && l == reflect .Int {
319
317
c .emit (OpEqualInt )
@@ -325,114 +323,155 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) {
325
323
326
324
case "!=" :
327
325
c .compile (node .Left )
326
+ c .derefInNeeded (node .Left )
328
327
c .compile (node .Right )
328
+ c .derefInNeeded (node .Left )
329
329
c .emit (OpEqual )
330
330
c .emit (OpNot )
331
331
332
332
case "or" , "||" :
333
333
c .compile (node .Left )
334
+ c .derefInNeeded (node .Left )
334
335
end := c .emit (OpJumpIfTrue , placeholder )
335
336
c .emit (OpPop )
336
337
c .compile (node .Right )
338
+ c .derefInNeeded (node .Right )
337
339
c .patchJump (end )
338
340
339
341
case "and" , "&&" :
340
342
c .compile (node .Left )
343
+ c .derefInNeeded (node .Left )
341
344
end := c .emit (OpJumpIfFalse , placeholder )
342
345
c .emit (OpPop )
343
346
c .compile (node .Right )
347
+ c .derefInNeeded (node .Right )
344
348
c .patchJump (end )
345
349
346
350
case "<" :
347
351
c .compile (node .Left )
352
+ c .derefInNeeded (node .Left )
348
353
c .compile (node .Right )
354
+ c .derefInNeeded (node .Right )
349
355
c .emit (OpLess )
350
356
351
357
case ">" :
352
358
c .compile (node .Left )
359
+ c .derefInNeeded (node .Left )
353
360
c .compile (node .Right )
361
+ c .derefInNeeded (node .Right )
354
362
c .emit (OpMore )
355
363
356
364
case "<=" :
357
365
c .compile (node .Left )
366
+ c .derefInNeeded (node .Left )
358
367
c .compile (node .Right )
368
+ c .derefInNeeded (node .Right )
359
369
c .emit (OpLessOrEqual )
360
370
361
371
case ">=" :
362
372
c .compile (node .Left )
373
+ c .derefInNeeded (node .Left )
363
374
c .compile (node .Right )
375
+ c .derefInNeeded (node .Right )
364
376
c .emit (OpMoreOrEqual )
365
377
366
378
case "+" :
367
379
c .compile (node .Left )
380
+ c .derefInNeeded (node .Left )
368
381
c .compile (node .Right )
382
+ c .derefInNeeded (node .Right )
369
383
c .emit (OpAdd )
370
384
371
385
case "-" :
372
386
c .compile (node .Left )
387
+ c .derefInNeeded (node .Left )
373
388
c .compile (node .Right )
389
+ c .derefInNeeded (node .Right )
374
390
c .emit (OpSubtract )
375
391
376
392
case "*" :
377
393
c .compile (node .Left )
394
+ c .derefInNeeded (node .Left )
378
395
c .compile (node .Right )
396
+ c .derefInNeeded (node .Right )
379
397
c .emit (OpMultiply )
380
398
381
399
case "/" :
382
400
c .compile (node .Left )
401
+ c .derefInNeeded (node .Left )
383
402
c .compile (node .Right )
403
+ c .derefInNeeded (node .Right )
384
404
c .emit (OpDivide )
385
405
386
406
case "%" :
387
407
c .compile (node .Left )
408
+ c .derefInNeeded (node .Left )
388
409
c .compile (node .Right )
410
+ c .derefInNeeded (node .Right )
389
411
c .emit (OpModulo )
390
412
391
413
case "**" , "^" :
392
414
c .compile (node .Left )
415
+ c .derefInNeeded (node .Left )
393
416
c .compile (node .Right )
417
+ c .derefInNeeded (node .Right )
394
418
c .emit (OpExponent )
395
419
396
420
case "in" :
397
421
c .compile (node .Left )
422
+ c .derefInNeeded (node .Left )
398
423
c .compile (node .Right )
424
+ c .derefInNeeded (node .Right )
399
425
c .emit (OpIn )
400
426
401
427
case "matches" :
402
428
if node .Regexp != nil {
403
429
c .compile (node .Left )
430
+ c .derefInNeeded (node .Left )
404
431
c .emit (OpMatchesConst , c .addConstant (node .Regexp ))
405
432
} else {
406
433
c .compile (node .Left )
434
+ c .derefInNeeded (node .Left )
407
435
c .compile (node .Right )
436
+ c .derefInNeeded (node .Right )
408
437
c .emit (OpMatches )
409
438
}
410
439
411
440
case "contains" :
412
441
c .compile (node .Left )
442
+ c .derefInNeeded (node .Left )
413
443
c .compile (node .Right )
444
+ c .derefInNeeded (node .Right )
414
445
c .emit (OpContains )
415
446
416
447
case "startsWith" :
417
448
c .compile (node .Left )
449
+ c .derefInNeeded (node .Left )
418
450
c .compile (node .Right )
451
+ c .derefInNeeded (node .Right )
419
452
c .emit (OpStartsWith )
420
453
421
454
case "endsWith" :
422
455
c .compile (node .Left )
456
+ c .derefInNeeded (node .Left )
423
457
c .compile (node .Right )
458
+ c .derefInNeeded (node .Right )
424
459
c .emit (OpEndsWith )
425
460
426
461
case ".." :
427
462
c .compile (node .Left )
463
+ c .derefInNeeded (node .Left )
428
464
c .compile (node .Right )
465
+ c .derefInNeeded (node .Right )
429
466
c .emit (OpRange )
430
467
431
468
case "??" :
432
469
c .compile (node .Left )
470
+ c .derefInNeeded (node .Left )
433
471
end := c .emit (OpJumpIfNotNil , placeholder )
434
472
c .emit (OpPop )
435
473
c .compile (node .Right )
474
+ c .derefInNeeded (node .Right )
436
475
c .patchJump (end )
437
476
438
477
default :
@@ -461,7 +500,6 @@ func (c *compiler) MemberNode(node *ast.MemberNode) {
461
500
return
462
501
}
463
502
op := OpFetch
464
- original := node
465
503
index := node .FieldIndex
466
504
path := []string {node .Name }
467
505
base := node .Node
@@ -470,21 +508,15 @@ func (c *compiler) MemberNode(node *ast.MemberNode) {
470
508
for ! node .Optional {
471
509
ident , ok := base .(* ast.IdentifierNode )
472
510
if ok && len (ident .FieldIndex ) > 0 {
473
- if ident .Deref {
474
- panic ("IdentifierNode should not be dereferenced" )
475
- }
476
511
index = append (ident .FieldIndex , index ... )
477
512
path = append ([]string {ident .Value }, path ... )
478
513
c .emitLocation (ident .Location (), OpLoadField , c .addConstant (
479
514
& runtime.Field {Index : index , Path : path },
480
515
))
481
- goto deref
516
+ return
482
517
}
483
518
member , ok := base .(* ast.MemberNode )
484
519
if ok && len (member .FieldIndex ) > 0 {
485
- if member .Deref {
486
- panic ("MemberNode should not be dereferenced" )
487
- }
488
520
index = append (member .FieldIndex , index ... )
489
521
path = append ([]string {member .Name }, path ... )
490
522
node = member
@@ -509,13 +541,6 @@ func (c *compiler) MemberNode(node *ast.MemberNode) {
509
541
& runtime.Field {Index : index , Path : path },
510
542
))
511
543
}
512
-
513
- deref:
514
- if original .Deref {
515
- c .emit (OpDeref )
516
- } else if original .Type () == nil {
517
- c .emit (OpDeref )
518
- }
519
544
}
520
545
521
546
func (c * compiler ) SliceNode (node * ast.SliceNode ) {
@@ -734,6 +759,13 @@ func (c *compiler) PairNode(node *ast.PairNode) {
734
759
c .compile (node .Value )
735
760
}
736
761
762
+ func (c * compiler ) derefInNeeded (node ast.Node ) {
763
+ switch kind (node ) {
764
+ case reflect .Ptr , reflect .Interface :
765
+ c .emit (OpDeref )
766
+ }
767
+ }
768
+
737
769
func kind (node ast.Node ) reflect.Kind {
738
770
t := node .Type ()
739
771
if t == nil {
0 commit comments