#
# 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: 26
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(41),
                B(Star), R(0),
  /*   54 S> */ B(LdaNamedProperty), R(0), 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(0), U8(1), U8(4),
                B(Ldar), R(2),
  /*   69 S> */ B(Return),
]
constant pool: [
  OBJECT_BOILERPLATE_DESCRIPTION_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: 22
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(41),
                B(Star), R(0),
  /*   54 S> */ B(LdaNamedProperty), R(0), U8(1), U8(1),
                B(Dec), U8(3),
                B(Star), R(2),
  /*   65 E> */ B(StaNamedProperty), R(0), U8(1), U8(4),
                B(Ldar), R(2),
  /*   69 S> */ B(Return),
]
constant pool: [
  OBJECT_BOILERPLATE_DESCRIPTION_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: 31
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),
                B(Star), R(1),
  /*   72 S> */ B(Ldar), R(0),
  /*   81 E> */ B(LdaKeyedProperty), R(1), U8(1),
                B(ToNumeric), U8(3),
                B(Star), R(4),
                B(Dec), U8(3),
                B(Star), R(5),
  /*   86 E> */ B(StaKeyedProperty), R(1), R(0), U8(4),
                B(Ldar), R(4),
  /*   89 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["var"],
  OBJECT_BOILERPLATE_DESCRIPTION_TYPE,
]
handlers: [
]

---
snippet: "
  var name = 'var'; var a = { val: 1 }; return ++a[name];
"
frame size: 5
parameter count: 1
bytecode array length: 27
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),
                B(Star), R(1),
  /*   72 S> */ B(Ldar), R(0),
  /*   83 E> */ B(LdaKeyedProperty), R(1), U8(1),
                B(Inc), U8(3),
                B(Star), R(4),
  /*   87 E> */ B(StaKeyedProperty), R(1), R(0), U8(4),
                B(Ldar), R(4),
  /*   89 S> */ B(Return),
]
constant pool: [
  ONE_BYTE_INTERNALIZED_STRING_TYPE ["var"],
  OBJECT_BOILERPLATE_DESCRIPTION_TYPE,
]
handlers: [
]

---
snippet: "
  var a = 1; var b = function() { return a }; return ++a;
"
frame size: 2
parameter count: 1
bytecode array length: 23
bytecodes: [
                B(CreateFunctionContext), U8(0), 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(1), U8(0), U8(2),
                B(Star), R(0),
  /*   78 S> */ B(LdaCurrentContextSlot), U8(4),
                B(Inc), U8(0),
  /*   87 E> */ B(StaCurrentContextSlot), U8(4),
  /*   89 S> */ B(Return),
]
constant pool: [
  SCOPE_INFO_TYPE,
  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: 29
bytecodes: [
                B(CreateFunctionContext), U8(0), 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(1), U8(0), U8(2),
                B(Star), R(0),
  /*   78 S> */ B(LdaCurrentContextSlot), U8(4),
                B(ToNumeric), U8(0),
                B(Star), R(2),
                B(Dec), U8(0),
  /*   86 E> */ B(StaCurrentContextSlot), U8(4),
                B(Ldar), R(2),
  /*   89 S> */ B(Return),
]
constant pool: [
  SCOPE_INFO_TYPE,
  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: [
  ARRAY_BOILERPLATE_DESCRIPTION_TYPE,
]
handlers: [
]

