| 2545 | } |
| 2546 | |
| 2547 | func TestStacktraceLocationThrowNativeInTheMiddle(t *testing.T) { |
| 2548 | vm := New() |
| 2549 | v, err := vm.RunString(`(function f1() { |
| 2550 | throw new Error("test") |
| 2551 | })`) |
| 2552 | if err != nil { |
| 2553 | t.Fatal(err) |
| 2554 | } |
| 2555 | |
| 2556 | var f1 func() |
| 2557 | err = vm.ExportTo(v, &f1) |
| 2558 | if err != nil { |
| 2559 | t.Fatal(err) |
| 2560 | } |
| 2561 | |
| 2562 | f := func() { |
| 2563 | f1() |
| 2564 | } |
| 2565 | vm.Set("f", f) |
| 2566 | _, err = vm.RunString(` |
| 2567 | function main() { |
| 2568 | (function noop() {})(); |
| 2569 | return callee(); |
| 2570 | } |
| 2571 | function callee() { |
| 2572 | return f(); |
| 2573 | } |
| 2574 | main(); |
| 2575 | `) |
| 2576 | if err == nil { |
| 2577 | t.Fatal("Expected error") |
| 2578 | } |
| 2579 | stack := err.(*Exception).stack |
| 2580 | if len(stack) != 5 { |
| 2581 | t.Fatalf("Unexpected stack len: %v", stack) |
| 2582 | } |
| 2583 | if frame := stack[0]; frame.funcName != "f1" || frame.pc != 7 { |
| 2584 | t.Fatalf("Unexpected stack frame 0: %#v", frame) |
| 2585 | } |
| 2586 | if frame := stack[1]; !strings.HasSuffix(frame.funcName.String(), "TestStacktraceLocationThrowNativeInTheMiddle.func1") { |
| 2587 | t.Fatalf("Unexpected stack frame 1: %#v", frame) |
| 2588 | } |
| 2589 | if frame := stack[2]; frame.funcName != "callee" || frame.pc != 2 { |
| 2590 | t.Fatalf("Unexpected stack frame 2: %#v", frame) |
| 2591 | } |
| 2592 | if frame := stack[3]; frame.funcName != "main" || frame.pc != 6 { |
| 2593 | t.Fatalf("Unexpected stack frame 3: %#v", frame) |
| 2594 | } |
| 2595 | if frame := stack[4]; frame.funcName != "" || frame.pc != 4 { |
| 2596 | t.Fatalf("Unexpected stack frame 4: %#v", frame) |
| 2597 | } |
| 2598 | } |
| 2599 | |
| 2600 | func TestStrToInt64(t *testing.T) { |
| 2601 | if _, ok := strToInt64(""); ok { |