let exc = state.primitive_objects.nameerror.clone();
raise(state, call_stack, exc,format!("Index out of range"))
},
Some(obj_ref) => {
let frame = call_stack.last_mut().unwrap();
frame.var_stack.push(obj_ref.clone())
},
}
},
(ObjectContent::Tuple(_), index) =>
raise(state, call_stack, typeerror,format!("tuple indices must be int, not {:?}", index)),
(ObjectContent::List(_), index) =>
raise(state, call_stack, typeerror,format!("list indices must be int, not {:?}", index)),
(container, _index) =>
raise(state, call_stack, typeerror,format!("{:?} object is not subscriptable", container)),
}
}
Instruction::GetIter => {
let frame = call_stack.last_mut().unwrap();
let obj_ref = pop_stack!(state, frame.var_stack);
frame.var_stack.push(obj_ref.iter(state));
}
Instruction::LoadBuildClass => {
let frame = call_stack.last_mut().unwrap();
let obj = Object::new_instance(Some("__build_class__".to_string()), state.primitive_objects.function_type.clone(),ObjectContent::PrimitiveFunction("build_class".to_string()));
frame.var_stack.push(state.store.allocate(obj));
}
Instruction::ReturnValue => {
if call_stack.len() == 1{
letmut frame = call_stack.pop().unwrap();
let result = pop_stack!(state, frame.var_stack);
returnPyResult::Return(result);
}
else{
letmut frame = call_stack.pop().unwrap();
let result = pop_stack!(state, frame.var_stack);
return_value(call_stack, result)
}
}
Instruction::PopBlock => {
let frame = call_stack.last_mut().unwrap();
pop_stack!(state, frame.block_stack);
}
Instruction::EndFinally => {
let status_ref = {
let frame = call_stack.last_mut().unwrap();
pop_stack!(state, frame.var_stack)
};
let status_content = {
let status = state.store.deref(&status_ref);
let content = status.content.clone();// TODO: copy only if needed
content
};
match status_content {
ObjectContent::Int(i) => panic!("TODO: finally int status"),// TODO
ObjectContent::OtherObject => {
let(val, traceback) = {
let frame = call_stack.last_mut().unwrap();
let val = pop_stack!(state, frame.var_stack);// Note: CPython calls this variable “exc”
let traceback = pop_stack!(state, frame.var_stack);
(val, traceback)
};
let exc = status_ref;
call_stack.last_mut().unwrap().block_stack.pop().unwrap();// Remove this try…except block
let iterator = top_stack!(state, frame.var_stack);
iterator.clone()
};
let iter_func = state.store.allocate(Object::new_instance(None, state.primitive_objects.function_type.clone(),ObjectContent::PrimitiveFunction("iter".to_string())));