#
# 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(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: 17
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   45 S> */ B(ToNumber), R(1), U8(2),
                B(Ldar), 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), I8(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: 17
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   45 S> */ B(ToNumber), R(1), U8(2),
                B(Ldar), 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: 27
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(CreateObjectLiteral), U8(0), U8(2), U8(1), R(1),
                B(Mov), R(1), R(0),
  /*   54 S> */ B(LdaNamedProperty), R(1), U8(1), U8(3),
                B(ToNumber), R(2), U8(7),
                B(Ldar), R(2),
                B(Inc), U8(7),
  /*   66 E> */ B(StaNamedPropertySloppy), R(1), U8(1), U8(5),
                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(2), U8(1), R(1),
                B(Mov), R(1), R(0),
  /*   54 S> */ B(LdaNamedProperty), R(1), U8(1), U8(3),
                B(Dec), U8(7),
  /*   65 E> */ B(StaNamedPropertySloppy), R(1), U8(1), U8(5),
  /*   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: 32
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   45 S> */ B(LdaConstant), U8(0),
                B(Star), R(0),
  /*   60 S> */ B(CreateObjectLiteral), U8(1), U8(2), U8(1), R(2),
                B(Mov), R(2), R(1),
  /*   72 S> */ B(Ldar), R(0),
  /*   81 E> */ B(LdaKeyedProperty), R(2), U8(3),
                B(ToNumber), R(4), U8(7),
                B(Ldar), R(4),
                B(Dec), U8(7),
  /*   86 E> */ B(StaKeyedPropertySloppy), R(2), R(0), U8(5),
                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(2), U8(1), R(2),
                B(Mov), R(2), R(1),
  /*   72 S> */ B(Ldar), R(0),
  /*   83 E> */ B(LdaKeyedProperty), R(2), U8(3),
                B(Inc), U8(7),
  /*   87 E> */ B(StaKeyedPropertySloppy), R(2), R(0), U8(5),
  /*   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: 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(2), U8(2),
                B(Star), R(0),
  /*   78 S> */ B(LdaCurrentContextSlot), U8(4),
                B(Inc), U8(3),
  /*   87 E> */ B(StaCurrentContextSlot), U8(4),
  /*   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: 29
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(2), U8(2),
                B(Star), R(0),
  /*   78 S> */ B(LdaCurrentContextSlot), U8(4),
                B(ToNumber), R(2), U8(3),
                B(Ldar), R(2),
                B(Dec), U8(3),
  /*   86 E> */ B(StaCurrentContextSlot), U8(4),
                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: 29
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   44 S> */ B(LdaSmi), I8(1),
                B(Star), R(0),
  /*   55 S> */ B(CreateArrayLiteral), U8(0), U8(2), U8(17),
                B(Star), R(1),
  /*   63 S> */ B(Ldar), R(0),
                B(ToNumber), R(3), U8(3),
                B(Ldar), R(3),
                B(Inc), U8(3),
                B(Star), R(0),
                B(LdaSmi), I8(2),
  /*   79 E> */ B(StaKeyedPropertySloppy), R(1), R(3), U8(4),
  /*   84 S> */ B(Return),
]
constant pool: [
  TUPLE2_TYPE,
]
handlers: [
]

