#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: yes

---
snippet: "
  var a = 1;
  var b = 2;
  return `${a}${b}string`;
"
frame size: 3
parameter count: 1
bytecode array length: 28
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(2),
                B(Star), R(1),
  /*   56 S> */ B(Ldar), R(0),
                B(ToString),
                B(Star), R(2),
                B(Ldar), R(1),
  /*   70 E> */ B(ToString),
                B(Add), R(2), U8(0),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Add), R(2), U8(0),
  /*   80 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["string"],
]
handlers: [
]

---
snippet: "
  var a = 1;
  var b = 2;
  return `string${a}${b}`;
"
frame size: 3
parameter count: 1
bytecode array length: 28
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(2),
                B(Star), R(1),
  /*   56 S> */ B(LdaConstant), U8(0),
                B(Star), R(2),
                B(Ldar), R(0),
  /*   72 E> */ B(ToString),
                B(Add), R(2), U8(0),
                B(Star), R(2),
                B(Ldar), R(1),
  /*   76 E> */ B(ToString),
                B(Add), R(2), U8(0),
  /*   80 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["string"],
]
handlers: [
]

---
snippet: "
  var a = 1;
  var b = 2;
  return `${a}string${b}`;
"
frame size: 3
parameter count: 1
bytecode array length: 28
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(2),
                B(Star), R(1),
  /*   56 S> */ B(Ldar), R(0),
                B(ToString),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Add), R(2), U8(0),
                B(Star), R(2),
                B(Ldar), R(1),
  /*   76 E> */ B(ToString),
                B(Add), R(2), U8(0),
  /*   80 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["string"],
]
handlers: [
]

---
snippet: "
  var a = 1;
  var b = 2;
  return `foo${a}bar${b}baz${1}`;
"
frame size: 3
parameter count: 1
bytecode array length: 50
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(2),
                B(Star), R(1),
  /*   56 S> */ B(LdaConstant), U8(0),
                B(Star), R(2),
                B(Ldar), R(0),
  /*   69 E> */ B(ToString),
                B(Add), R(2), U8(0),
                B(Star), R(2),
                B(LdaConstant), U8(1),
                B(Add), R(2), U8(0),
                B(Star), R(2),
                B(Ldar), R(1),
  /*   76 E> */ B(ToString),
                B(Add), R(2), U8(0),
                B(Star), R(2),
                B(LdaConstant), U8(2),
                B(Add), R(2), U8(0),
                B(Star), R(2),
                B(LdaSmi), I8(1),
                B(ToString),
                B(Add), R(2), U8(0),
  /*   87 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["foo"],
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["bar"],
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["baz"],
]
handlers: [
]

---
snippet: "
  var a = 1;
  var b = 2;
  return `${a}string` + `string${b}`;
"
frame size: 4
parameter count: 1
bytecode array length: 35
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(2),
                B(Star), R(1),
  /*   56 S> */ B(Ldar), R(0),
                B(ToString),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Add), R(2), U8(1),
                B(Star), R(2),
                B(LdaConstant), U8(0),
                B(Star), R(3),
                B(Ldar), R(1),
  /*   87 E> */ B(ToString),
                B(Add), R(3), U8(2),
  /*   76 E> */ B(Add), R(2), U8(0),
  /*   91 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["string"],
]
handlers: [
]

---
snippet: "
  var a = 1;
  var b = 2;
  function foo(a, b) { };
  return `string${foo(a, b)}${a}${b}`;
"
frame size: 4
parameter count: 1
bytecode array length: 45
bytecodes: [
                B(CreateClosure), U8(0), U8(0), U8(2),
                B(Star), R(2),
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   53 S> */ B(LdaSmi), I8(2),
                B(Star), R(1),
  /*   80 S> */ B(LdaConstant), U8(1),
                B(Star), R(3),
  /*   96 E> */ B(CallUndefinedReceiver2), R(2), R(0), R(1), U8(1),
                B(ToString),
                B(Add), R(3), U8(0),
                B(Star), R(3),
                B(Ldar), R(0),
  /*  108 E> */ B(ToString),
                B(Add), R(3), U8(0),
                B(Star), R(3),
                B(Ldar), R(1),
  /*  112 E> */ B(ToString),
                B(Add), R(3), U8(0),
  /*  116 S> */ B(Return),
]
constant pool: [
  SHARED_FUNCTION_INFO_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["string"],
]
handlers: [
]

