#
# Autogenerated by generate-bytecode-expectations.
#

---
wrap: yes

---
snippet: "
  var a = 1; return ++a;
"
frame size: 1
parameter count: 1
bytecode array length: 10
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   45 S> */ B(Inc), U8(0),
                B(Star), R(0),
  /*   56 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var a = 1; return a++;
"
frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   45 S> */ B(ToNumeric), U8(0),
                B(Star), R(1),
                B(Inc), U8(0),
                B(Star), R(0),
                B(Ldar), R(1),
  /*   56 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var a = 1; return --a;
"
frame size: 1
parameter count: 1
bytecode array length: 10
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   45 S> */ B(Dec), U8(0),
                B(Star), R(0),
  /*   56 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var a = 1; return a--;
"
frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   45 S> */ B(ToNumeric), U8(0),
                B(Star), R(1),
                B(Dec), U8(0),
                B(Star), R(0),
                B(Ldar), R(1),
  /*   56 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var a = { val: 1 }; return a.val++;
"
frame size: 4
parameter count: 1
bytecode array length: 28
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(41), R(1),
                B(Mov), R(1), R(0),
  /*   54 S> */ B(LdaNamedProperty), R(1), U8(1), U8(1),
                B(ToNumeric), U8(3),
                B(Star), R(2),
                B(Inc), U8(3),
                B(Star), R(3),
  /*   66 E> */ B(StaNamedProperty), R(1), U8(1), U8(4),
                B(Ldar), R(2),
  /*   69 S> */ B(Return),
]
constant pool: [
  FIXED_ARRAY_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["val"],
]
handlers: [
]

---
snippet: "
  var a = { val: 1 }; return --a.val;
"
frame size: 3
parameter count: 1
bytecode array length: 24
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(41), R(1),
                B(Mov), R(1), R(0),
  /*   54 S> */ B(LdaNamedProperty), R(1), U8(1), U8(1),
                B(Dec), U8(3),
                B(Star), R(2),
  /*   65 E> */ B(StaNamedProperty), R(1), U8(1), U8(4),
                B(Ldar), R(2),
  /*   69 S> */ B(Return),
]
constant pool: [
  FIXED_ARRAY_TYPE,
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["val"],
]
handlers: [
]

---
snippet: "
  var name = 'var'; var a = { val: 1 }; return a[name]--;
"
frame size: 6
parameter count: 1
bytecode array length: 33
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   45 S> */ B(LdaConstant), U8(0),
                B(Star), R(0),
  /*   60 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(41), R(2),
                B(Mov), R(2), R(1),
  /*   72 S> */ B(Ldar), R(0),
  /*   81 E> */ B(LdaKeyedProperty), R(2), U8(1),
                B(ToNumeric), U8(3),
                B(Star), R(4),
                B(Dec), U8(3),
                B(Star), R(5),
  /*   86 E> */ B(StaKeyedProperty), R(2), R(0), U8(4),
                B(Ldar), R(4),
  /*   89 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["var"],
  FIXED_ARRAY_TYPE,
]
handlers: [
]

---
snippet: "
  var name = 'var'; var a = { val: 1 }; return ++a[name];
"
frame size: 5
parameter count: 1
bytecode array length: 29
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   45 S> */ B(LdaConstant), U8(0),
                B(Star), R(0),
  /*   60 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(41), R(2),
                B(Mov), R(2), R(1),
  /*   72 S> */ B(Ldar), R(0),
  /*   83 E> */ B(LdaKeyedProperty), R(2), U8(1),
                B(Inc), U8(3),
                B(Star), R(4),
  /*   87 E> */ B(StaKeyedProperty), R(2), R(0), U8(4),
                B(Ldar), R(4),
  /*   89 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["var"],
  FIXED_ARRAY_TYPE,
]
handlers: [
]

---
snippet: "
  var a = 1; var b = function() { return a }; return ++a;
"
frame size: 2
parameter count: 1
bytecode array length: 22
bytecodes: [
                B(CreateFunctionContext), U8(1),
                B(PushContext), R(1),
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
  /*   42 E> */ B(StaCurrentContextSlot), U8(4),
  /*   53 S> */ B(CreateClosure), U8(0), U8(0), U8(2),
                B(Star), R(0),
  /*   78 S> */ B(LdaCurrentContextSlot), U8(4),
                B(Inc), U8(1),
  /*   87 E> */ B(StaCurrentContextSlot), U8(4),
  /*   89 S> */ B(Return),
]
constant pool: [
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

---
snippet: "
  var a = 1; var b = function() { return a }; return a--;
"
frame size: 3
parameter count: 1
bytecode array length: 28
bytecodes: [
                B(CreateFunctionContext), U8(1),
                B(PushContext), R(1),
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
  /*   42 E> */ B(StaCurrentContextSlot), U8(4),
  /*   53 S> */ B(CreateClosure), U8(0), U8(0), U8(2),
                B(Star), R(0),
  /*   78 S> */ B(LdaCurrentContextSlot), U8(4),
                B(ToNumeric), U8(1),
                B(Star), R(2),
                B(Dec), U8(1),
  /*   86 E> */ B(StaCurrentContextSlot), U8(4),
                B(Ldar), R(2),
  /*   89 S> */ B(Return),
]
constant pool: [
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

---
snippet: "
  var idx = 1; var a = [1, 2]; return a[idx++] = 2;
"
frame size: 5
parameter count: 1
bytecode array length: 32
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   44 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   55 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(37),
                B(Star), R(1),
  /*   63 S> */ B(Ldar), R(0),
                B(ToNumeric), U8(1),
                B(Star), R(3),
                B(Inc), U8(1),
                B(Star), R(0),
                B(LdaSmi), I8(2),
                B(Star), R(4),
  /*   79 E> */ B(StaKeyedProperty), R(1), R(3), U8(2),
                B(Ldar), R(4),
  /*   83 S> */ B(Return),
]
constant pool: [
  TUPLE2_TYPE,
]
handlers: [
]

