#
# Autogenerated by generate-bytecode-expectations.
#

---
execute: yes
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), U8(1),
                B(Star), R(0),
  /*   45 S> */ B(Inc), U8(2),
                B(Star), R(0),
  /*   57 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var a = 1; return a++;
"
frame size: 2
parameter count: 1
bytecode array length: 14
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(1),
                B(Star), R(0),
  /*   45 S> */ B(ToNumber), R(1),
                B(Inc), U8(2),
                B(Star), R(0),
                B(Ldar), R(1),
  /*   57 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), U8(1),
                B(Star), R(0),
  /*   45 S> */ B(Dec), U8(2),
                B(Star), R(0),
  /*   57 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var a = 1; return a--;
"
frame size: 2
parameter count: 1
bytecode array length: 14
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(1),
                B(Star), R(0),
  /*   45 S> */ B(ToNumber), R(1),
                B(Dec), U8(2),
                B(Star), R(0),
                B(Ldar), R(1),
  /*   57 S> */ B(Return),
]
constant pool: [
]
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(1), R(1),
                B(Mov), R(1), R(0),
  /*   54 S> */ B(LdaNamedProperty), R(0), U8(1), U8(2),
                B(ToNumber), R(2),
                B(Inc), U8(6),
  /*   66 E> */ B(StaNamedPropertySloppy), R(0), U8(1), U8(4),
                B(Ldar), R(2),
  /*   70 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: 2
parameter count: 1
bytecode array length: 20
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(1), R(1),
                B(Mov), R(1), R(0),
  /*   54 S> */ B(LdaNamedProperty), R(0), U8(1), U8(2),
                B(Dec), U8(6),
  /*   65 E> */ B(StaNamedPropertySloppy), R(0), U8(1), U8(4),
  /*   70 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: 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(1), R(2),
                B(Mov), R(2), R(1),
  /*   72 S> */ B(Ldar), R(0),
  /*   81 E> */ B(LdaKeyedProperty), R(1), U8(2),
                B(ToNumber), R(4),
                B(Dec), U8(6),
  /*   86 E> */ B(StaKeyedPropertySloppy), R(1), R(0), U8(4),
                B(Ldar), R(4),
  /*   90 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: 3
parameter count: 1
bytecode array length: 25
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   45 S> */ B(LdaConstant), U8(0),
                B(Star), R(0),
  /*   60 S> */ B(CreateObjectLiteral), U8(1), U8(0), U8(1), R(2),
                B(Mov), R(2), R(1),
  /*   72 S> */ B(Ldar), R(0),
  /*   83 E> */ B(LdaKeyedProperty), R(1), U8(2),
                B(Inc), U8(6),
  /*   87 E> */ B(StaKeyedPropertySloppy), R(1), R(0), U8(4),
  /*   90 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: 27
bytecodes: [
                B(CreateFunctionContext), U8(1),
                B(PushContext), R(1),
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(1),
  /*   42 E> */ B(StaContextSlot), R(context), U8(4), U8(0),
  /*   53 S> */ B(CreateClosure), U8(0), U8(2),
                B(Star), R(0),
  /*   78 S> */ B(LdaContextSlot), R(context), U8(4), U8(0),
                B(Inc), U8(2),
  /*   87 E> */ B(StaContextSlot), R(context), U8(4), U8(0),
  /*   90 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: 31
bytecodes: [
                B(CreateFunctionContext), U8(1),
                B(PushContext), R(1),
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(1),
  /*   42 E> */ B(StaContextSlot), R(context), U8(4), U8(0),
  /*   53 S> */ B(CreateClosure), U8(0), U8(2),
                B(Star), R(0),
  /*   78 S> */ B(LdaContextSlot), R(context), U8(4), U8(0),
                B(ToNumber), R(2),
                B(Dec), U8(2),
  /*   86 E> */ B(StaContextSlot), R(context), U8(4), U8(0),
                B(Ldar), R(2),
  /*   90 S> */ B(Return),
]
constant pool: [
  SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]

---
snippet: "
  var idx = 1; var a = [1, 2]; return a[idx++] = 2;
"
frame size: 4
parameter count: 1
bytecode array length: 26
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   44 S> */ B(LdaSmi), U8(1),
                B(Star), R(0),
  /*   55 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(9),
                B(Star), R(1),
  /*   63 S> */ B(Ldar), R(0),
                B(ToNumber), R(3),
                B(Inc), U8(2),
                B(Star), R(0),
                B(LdaSmi), U8(2),
  /*   79 E> */ B(StaKeyedPropertySloppy), R(1), R(3), U8(3),
  /*   84 S> */ B(Return),
]
constant pool: [
  FIXED_ARRAY_TYPE,
]
handlers: [
]

