(expr compiledExpr)
| 2431 | } |
| 2432 | |
| 2433 | func (c *compiler) evalConst(expr compiledExpr) (Value, *Exception) { |
| 2434 | if expr, ok := expr.(*compiledLiteral); ok { |
| 2435 | return expr.val, nil |
| 2436 | } |
| 2437 | if c.evalVM == nil { |
| 2438 | c.evalVM = New().vm |
| 2439 | } |
| 2440 | var savedPrg *Program |
| 2441 | createdPrg := false |
| 2442 | if c.evalVM.prg == nil { |
| 2443 | c.evalVM.prg = &Program{ |
| 2444 | src: c.p.src, |
| 2445 | } |
| 2446 | savedPrg = c.p |
| 2447 | c.p = c.evalVM.prg |
| 2448 | createdPrg = true |
| 2449 | } |
| 2450 | savedPc := len(c.p.code) |
| 2451 | expr.emitGetter(true) |
| 2452 | c.evalVM.pc = savedPc |
| 2453 | ex := c.evalVM.runTry() |
| 2454 | if createdPrg { |
| 2455 | c.evalVM.prg = nil |
| 2456 | c.evalVM.pc = 0 |
| 2457 | c.p = savedPrg |
| 2458 | } else { |
| 2459 | c.evalVM.prg.code = c.evalVM.prg.code[:savedPc] |
| 2460 | c.p.code = c.evalVM.prg.code |
| 2461 | } |
| 2462 | if ex == nil { |
| 2463 | return c.evalVM.pop(), nil |
| 2464 | } |
| 2465 | return nil, ex |
| 2466 | } |
| 2467 | |
| 2468 | func (e *compiledUnaryExpr) constant() bool { |
| 2469 | return e.operand.constant() |
no test coverage detected