Fixed vptr condition on static methods

This commit is contained in:
2026-06-12 16:21:46 +02:00
parent 526b479ea4
commit b19b1bb41d
3 changed files with 21 additions and 13 deletions
+3 -12
View File
@@ -51,8 +51,10 @@ impl ClassProcessedData {
if matches!(method.item.visibility, Visibility::Public) { if matches!(method.item.visibility, Visibility::Public) {
match &method.item.is_override { match &method.item.is_override {
None => { None => {
if method.item.is_using_self() {
v_table.push(method.item.name.clone()); v_table.push(method.item.name.clone());
} }
}
Some(override_spec) => { Some(override_spec) => {
override_v_table override_v_table
.entry(override_spec.clone()) .entry(override_spec.clone())
@@ -412,18 +414,7 @@ impl ClassProcessedData {
for method in &self.methods { for method in &self.methods {
match method.item.visibility { match method.item.visibility {
Visibility::Public => { Visibility::Public => {
let is_using_self = match method.item.params.0.get(0) { if method.item.is_using_self() {
Some(VarDecl { name, .. }) => {
if let Pattern::Path(_, v) = name {
v.0.len() == 1 && v.0[0].0 == "self"
} else {
false
}
}
_ => false,
};
if is_using_self {
if method.item.is_override.is_none() { if method.item.is_override.is_none() {
gen_method_point(&method.item, ctx, cg); gen_method_point(&method.item, ctx, cg);
} }
+15
View File
@@ -125,3 +125,18 @@ pub struct FieldDeclStmt {
pub decl: FieldDecl, pub decl: FieldDecl,
pub init: Option<Expression>, pub init: Option<Expression>,
} }
impl FunctionDecl {
pub fn is_using_self(&self) -> bool {
match self.params.0.get(0) {
Some(VarDecl { name, .. }) => {
if let Pattern::Path(_, v) = name {
v.0.len() == 1 && v.0[0].0 == "self"
} else {
false
}
}
_ => false,
}
}
}
+2
View File
@@ -15,6 +15,8 @@ pub class Animal<T> {
pub fn test_speak(*self) { pub fn test_speak(*self) {
self.speak(); self.speak();
} }
pub fn static_method() {}
} }
pub class Mammal<T> : Animal<T> { pub class Mammal<T> : Animal<T> {