docs: add documentation for method overloading patterns and usage examples
This commit is contained in:
@@ -153,6 +153,7 @@ void _rava_object_set_field_vm(RavaObject_t *obj, const char *name, RavaValue_t
|
||||
RavaClass_t* _rava_vm_find_class(RavaVM_t *vm, const char *class_name);
|
||||
RavaMethod_t* _rava_vm_find_method(RavaVM_t *vm, const char *class_name, const char *method_name);
|
||||
RavaMethod_t* _rava_vm_find_method_cached(RavaVM_t *vm, const char *class_name, const char *method_name);
|
||||
RavaMethod_t* _rava_vm_find_method_overload(RavaVM_t *vm, const char *class_name, const char *method_name, RavaValue_t *args, size_t arg_count);
|
||||
|
||||
RavaStaticFieldTable_t* rava_static_field_table_create(void);
|
||||
void rava_static_field_table_destroy(RavaStaticFieldTable_t *table);
|
||||
|
||||
@@ -19,6 +19,53 @@ RavaClass_t* _rava_vm_find_class(RavaVM_t *vm, const char *class_name) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static bool _rava_vm_method_signature_matches(RavaMethod_t *method, RavaValue_t *args, size_t arg_count) {
|
||||
if (!method) return false;
|
||||
if (method->param_count != arg_count) return false;
|
||||
|
||||
for (size_t i = 0; i < arg_count; i++) {
|
||||
RavaValue_t arg = args[i];
|
||||
RavaType_t *param_type = method->param_types[i];
|
||||
|
||||
RavaType_t *arg_type = NULL;
|
||||
switch (arg.type) {
|
||||
case RAVA_VAL_INT:
|
||||
arg_type = rava_type_create_primitive(RAVA_TYPE_INT);
|
||||
break;
|
||||
case RAVA_VAL_LONG:
|
||||
arg_type = rava_type_create_primitive(RAVA_TYPE_LONG);
|
||||
break;
|
||||
case RAVA_VAL_DOUBLE:
|
||||
arg_type = rava_type_create_primitive(RAVA_TYPE_DOUBLE);
|
||||
break;
|
||||
case RAVA_VAL_FLOAT:
|
||||
arg_type = rava_type_create_primitive(RAVA_TYPE_FLOAT);
|
||||
break;
|
||||
case RAVA_VAL_BOOLEAN:
|
||||
arg_type = rava_type_create_primitive(RAVA_TYPE_BOOLEAN);
|
||||
break;
|
||||
case RAVA_VAL_CHAR:
|
||||
arg_type = rava_type_create_primitive(RAVA_TYPE_CHAR);
|
||||
break;
|
||||
case RAVA_VAL_OBJECT:
|
||||
case RAVA_VAL_STRING:
|
||||
case RAVA_VAL_ARRAY:
|
||||
arg_type = rava_type_create_primitive(RAVA_TYPE_CLASS);
|
||||
break;
|
||||
default:
|
||||
arg_type = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
bool assignable = arg_type && rava_type_is_assignable_to(arg_type, param_type);
|
||||
if (arg_type && arg_type->kind != RAVA_TYPE_CLASS) {
|
||||
rava_type_destroy(arg_type);
|
||||
}
|
||||
if (!assignable) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
RavaMethod_t* _rava_vm_find_method(RavaVM_t *vm, const char *class_name, const char *method_name) {
|
||||
const char *current_class = class_name;
|
||||
while (current_class) {
|
||||
@@ -41,6 +88,27 @@ RavaMethod_t* _rava_vm_find_method(RavaVM_t *vm, const char *class_name, const c
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RavaMethod_t* _rava_vm_find_method_overload(RavaVM_t *vm, const char *class_name, const char *method_name, RavaValue_t *args, size_t arg_count) {
|
||||
const char *current_class = class_name;
|
||||
while (current_class) {
|
||||
RavaClass_t *class = _rava_vm_find_class(vm, current_class);
|
||||
if (!class) break;
|
||||
|
||||
RavaMethod_t *best_match = NULL;
|
||||
for (size_t j = 0; j < class->method_count; j++) {
|
||||
if (strcmp(class->methods[j]->name, method_name) == 0) {
|
||||
if (_rava_vm_method_signature_matches(class->methods[j], args, arg_count)) {
|
||||
best_match = class->methods[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (best_match) return best_match;
|
||||
current_class = class->superclass;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RavaMethod_t* _rava_vm_find_method_cached(RavaVM_t *vm, const char *class_name, const char *method_name) {
|
||||
MethodCache_t *cache = (MethodCache_t*)vm->method_cache;
|
||||
RavaMethod_t *cached = rava_methodcache_lookup(cache, class_name, method_name);
|
||||
|
||||
Reference in New Issue
Block a user