Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add various Types to frame.rs
  • Loading branch information
dchiquito committed May 7, 2024
commit 42111ae6a2ebebe8a430279e36107d58de47b95f
59 changes: 56 additions & 3 deletions vm/src/frame.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::{
builtins::{
asyncgenerator::PyAsyncGenWrappedValue,
function::{PyCell, PyCellRef, PyFunction},
tuple::{PyTuple, PyTupleTyped},
tuple::{PyTuple, PyTupleRef, PyTupleTyped},
PyBaseExceptionRef, PyCode, PyCoroutine, PyDict, PyDictRef, PyGenerator, PyList, PySet,
PySlice, PyStr, PyStrInterned, PyStrRef, PyTraceback, PyType,
},
Expand All @@ -15,7 +15,7 @@ use crate::{
protocol::{PyIter, PyIterReturn},
scope::Scope,
source_code::SourceLocation,
stdlib::builtins,
stdlib::{builtins, typing::_typing},
vm::{Context, PyMethod},
AsObject, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, TryFromObject, VirtualMachine,
};
Expand Down Expand Up @@ -1158,6 +1158,51 @@ impl ExecutingFrame<'_> {
*extend_arg = true;
Ok(None)
}
bytecode::Instruction::TypeVar => {
let type_name = self.pop_value();
let type_var: PyObjectRef =
_typing::make_typevar(vm, type_name.clone(), vm.ctx.none(), vm.ctx.none())
.into_ref(&vm.ctx)
.into();
// // Inject the type var into locals so it is usable
// self.locals
// .mapping()
// .ass_subscript(&type_name, Some(type_var.clone()), vm)?;
self.push_value(type_var);
Ok(None)
}
bytecode::Instruction::TypeVarWithBound => {
let type_name = self.pop_value();
let bound = self.pop_value();
let type_var: PyObjectRef =
_typing::make_typevar(vm, type_name.clone(), bound, vm.ctx.none())
.into_ref(&vm.ctx)
.into();
self.push_value(type_var);
Ok(None)
}
bytecode::Instruction::TypeVarWithConstraint => {
let type_name = self.pop_value();
let constraint = self.pop_value();
let type_var: PyObjectRef =
_typing::make_typevar(vm, type_name.clone(), vm.ctx.none(), constraint)
.into_ref(&vm.ctx)
.into();
self.push_value(type_var);
Ok(None)
}
bytecode::Instruction::TypeAlias => {
let name = self.pop_value();
let x = self.state.stack.last();
let type_params: PyTupleRef = self
.pop_value()
.downcast()
.map_err(|_| vm.new_type_error("Type params must be a tuple.".to_owned()))?;
let value = self.pop_value();
let type_alias = _typing::TypeAliasType::new(name, type_params, value);
self.push_value(type_alias.into_ref(&vm.ctx).into());
Ok(None)
}
}
}

Expand Down Expand Up @@ -1659,6 +1704,14 @@ impl ExecutingFrame<'_> {
vm.ctx.new_dict().into()
};

let type_params: PyTupleRef = if flags.contains(bytecode::MakeFunctionFlags::TYPE_PARAMS) {
self.pop_value()
.downcast()
.map_err(|_| vm.new_type_error("Type params must be a tuple.".to_owned()))?
} else {
vm.ctx.new_tuple(vec![])
Comment thread
dchiquito marked this conversation as resolved.
Outdated
};

let kw_only_defaults = if flags.contains(bytecode::MakeFunctionFlags::KW_ONLY_DEFAULTS) {
Some(
self.pop_value()
Expand Down Expand Up @@ -1689,7 +1742,7 @@ impl ExecutingFrame<'_> {
defaults,
kw_only_defaults,
qualified_name.clone(),
vm.ctx.empty_tuple.clone(), // FIXME: fake implementation
type_params,
)
.into_pyobject(vm);

Expand Down