Skip to content

Commit cf7d1e4

Browse files
committed
Wrap FileNotFound with UnknownAttribute in import.operator . ()
1 parent b4e9f56 commit cf7d1e4

File tree

4 files changed

+146
-52
lines changed

4 files changed

+146
-52
lines changed

include/deemon/error-rt.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,9 @@ DFUNDEF ATTR_COLD NONNULL((1)) DeeObject *(DCALL DeeRT_ErrCUnboundClassMember)(D
383383
DFUNDEF ATTR_COLD NONNULL((2, 3)) int (DCALL DeeRT_ErrTUnknownAttr)(DeeObject *decl, DeeObject *ob, DeeObject *attr, unsigned int access);
384384
DFUNDEF ATTR_COLD NONNULL((2, 3)) int (DCALL DeeRT_ErrTUnknownAttrStr)(DeeObject *decl, DeeObject *ob, char const *attr, unsigned int access);
385385
DFUNDEF ATTR_COLD NONNULL((2, 3)) int (DCALL DeeRT_ErrTUnknownAttrStrLen)(DeeObject *decl, DeeObject *ob, char const *attr, size_t attrlen, unsigned int access);
386+
DFUNDEF ATTR_COLD NONNULL((2, 3, 5)) int (DCALL DeeRT_ErrTUnknownAttrWithCause)(DeeObject *decl, DeeObject *ob, DeeObject *attr, unsigned int access, /*inherit(always)*/ DREF DeeObject *cause);
387+
DFUNDEF ATTR_COLD NONNULL((2, 3, 5)) int (DCALL DeeRT_ErrTUnknownAttrStrWithCause)(DeeObject *decl, DeeObject *ob, char const *attr, unsigned int access, /*inherit(always)*/ DREF DeeObject *cause);
388+
DFUNDEF ATTR_COLD NONNULL((2, 3, 6)) int (DCALL DeeRT_ErrTUnknownAttrStrLenWithCause)(DeeObject *decl, DeeObject *ob, char const *attr, size_t attrlen, unsigned int access, /*inherit(always)*/ DREF DeeObject *cause);
386389
#define DeeRT_ErrTUnknownAttr(decl, ob, attr, access) Dee_ASSUMED_VALUE((DeeRT_ErrTUnknownAttr)(Dee_AsObject(decl), Dee_AsObject(ob), Dee_AsObject(attr), access), -1)
387390
#define DeeRT_ErrTUnknownAttrStr(decl, ob, attr, access) Dee_ASSUMED_VALUE((DeeRT_ErrTUnknownAttrStr)(Dee_AsObject(decl), Dee_AsObject(ob), attr, access), -1)
388391
#define DeeRT_ErrTUnknownAttrStrLen(decl, ob, attr, attrlen, access) Dee_ASSUMED_VALUE((DeeRT_ErrTUnknownAttrStrLen)(Dee_AsObject(decl), Dee_AsObject(ob), attr, attrlen, access), -1)
@@ -398,6 +401,12 @@ DFUNDEF ATTR_COLD NONNULL((2, 3)) int (DCALL DeeRT_ErrTUnknownAttrStrLen)(DeeObj
398401
#define DeeRT_ErrUnknownTypeInstanceAttr(self, attr, access) DeeRT_ErrTUnknownAttr(Dee_REQUIRES_TYPE(DeeTypeObject *, self), self, attr, access)
399402
#define DeeRT_ErrUnknownTypeInstanceAttrStr(self, attr, access) DeeRT_ErrTUnknownAttrStr(Dee_REQUIRES_TYPE(DeeTypeObject *, self), self, attr, access)
400403
#define DeeRT_ErrUnknownTypeInstanceAttrStrLen(self, attr, attrlen, access) DeeRT_ErrTUnknownAttrStrLen(Dee_REQUIRES_TYPE(DeeTypeObject *, self), self, attr, attrlen, access)
404+
#define DeeRT_ErrTUnknownAttrWithCause(decl, ob, attr, access, cause) Dee_ASSUMED_VALUE((DeeRT_ErrTUnknownAttrWithCause)(Dee_AsObject(decl), Dee_AsObject(ob), Dee_AsObject(attr), access, Dee_AsObject(cause)), -1)
405+
#define DeeRT_ErrTUnknownAttrStrWithCause(decl, ob, attr, access, cause) Dee_ASSUMED_VALUE((DeeRT_ErrTUnknownAttrStrWithCause)(Dee_AsObject(decl), Dee_AsObject(ob), attr, access, Dee_AsObject(cause)), -1)
406+
#define DeeRT_ErrTUnknownAttrStrLenWithCause(decl, ob, attr, attrlen, access, cause) Dee_ASSUMED_VALUE((DeeRT_ErrTUnknownAttrStrLenWithCause)(Dee_AsObject(decl), Dee_AsObject(ob), attr, attrlen, access, Dee_AsObject(cause)), -1)
407+
#define DeeRT_ErrUnknownAttrWithCause(ob, attr, access, cause) DeeRT_ErrTUnknownAttrWithCause((DeeObject *)NULL, ob, attr, access, cause)
408+
#define DeeRT_ErrUnknownAttrStrWithCause(ob, attr, access, cause) DeeRT_ErrTUnknownAttrStrWithCause((DeeObject *)NULL, ob, attr, access, cause)
409+
#define DeeRT_ErrUnknownAttrStrLenWithCause(ob, attr, attrlen, access, cause) DeeRT_ErrTUnknownAttrStrLenWithCause((DeeObject *)NULL, ob, attr, attrlen, access, cause)
401410

402411
/* Throws an `DeeError_RestrictedAttribute' indicating that the specified attribute access is invalid */
403412
DFUNDEF ATTR_COLD NONNULL((2, 3)) int (DCALL DeeRT_ErrTRestrictedAttr)(DeeObject *decl, DeeObject *ob, DeeObject *attr, unsigned int access);
@@ -422,12 +431,6 @@ DFUNDEF ATTR_COLD NONNULL((1, 2)) int (DCALL DeeRT_ErrCAlreadyBoundInstanceMembe
422431
DeeRT_ErrCRestrictedAttrCA(Dee_REQUIRES_TYPE(DeeTypeObject *, decl), \
423432
attr, DeeRT_ATTRIBUTE_ACCESS_INIT)
424433

425-
426-
427-
428-
429-
430-
431434
DECL_END
432435

433436
#endif /* !GUARD_DEEMON_ERROR_RT_H */

src/deemon/execute/modpath-directory.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -535,11 +535,11 @@ DeeModule_GetDirectory(DeeModuleObject *__restrict self) {
535535
* from elements of "DeeModule_GetLibPath()" */
536536

537537

538-
INTDEF WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL
538+
INTDEF WUNUSED NONNULL((1, 2)) DREF DeeModuleObject *DCALL
539539
import_getattr(DeeObject *self, DeeObject *attr);
540-
INTDEF WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL
540+
INTDEF WUNUSED NONNULL((1, 2)) DREF DeeModuleObject *DCALL
541541
import_getattr_string_hash(DeeObject *self, char const *attr, Dee_hash_t hash);
542-
INTDEF WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL
542+
INTDEF WUNUSED NONNULL((1, 2)) DREF DeeModuleObject *DCALL
543543
import_getattr_string_len_hash(DeeObject *self, char const *attr, size_t attrlen, Dee_hash_t hash);
544544

545545
INTDEF WUNUSED NONNULL((1, 2)) int DCALL
@@ -575,7 +575,7 @@ import_hasattr_string_len_hash(DeeObject *self, char const *attr, size_t attrlen
575575

576576

577577
PRIVATE struct type_attr import_attr = {
578-
/* .tp_getattr = */ &import_getattr,
578+
/* .tp_getattr = */ (DREF DeeObject *(DCALL *)(DeeObject *, DeeObject *))&import_getattr,
579579
/* .tp_delattr = */ NULL,
580580
/* .tp_setattr = */ NULL,
581581
/* .tp_iterattr = */ NULL, // TODO: &import_iterattr,
@@ -585,15 +585,15 @@ PRIVATE struct type_attr import_attr = {
585585
/* .tp_callattr = */ NULL,
586586
/* .tp_callattr_kw = */ NULL,
587587
/* .tp_vcallattrf = */ NULL,
588-
/* .tp_getattr_string_hash = */ &import_getattr_string_hash,
588+
/* .tp_getattr_string_hash = */ (DREF DeeObject *(DCALL *)(DeeObject *, char const *, Dee_hash_t))&import_getattr_string_hash,
589589
/* .tp_delattr_string_hash = */ NULL,
590590
/* .tp_setattr_string_hash = */ NULL,
591591
/* .tp_hasattr_string_hash = */ &import_hasattr_string_hash,
592592
/* .tp_boundattr_string_hash = */ &import_boundattr_string_hash,
593593
/* .tp_callattr_string_hash = */ NULL,
594594
/* .tp_callattr_string_hash_kw = */ NULL,
595595
/* .tp_vcallattr_string_hashf = */ NULL,
596-
/* .tp_getattr_string_len_hash = */ &import_getattr_string_len_hash,
596+
/* .tp_getattr_string_len_hash = */ (DREF DeeObject *(DCALL *)(DeeObject *, char const *, size_t, Dee_hash_t))&import_getattr_string_len_hash,
597597
/* .tp_delattr_string_len_hash = */ NULL,
598598
/* .tp_setattr_string_len_hash = */ NULL,
599599
/* .tp_hasattr_string_len_hash = */ &import_hasattr_string_len_hash,

src/deemon/execute/modpath.c

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <deemon/alloc.h>
2727
#include <deemon/code.h>
2828
#include <deemon/dec.h>
29+
#include <deemon/error-rt.h>
2930
#include <deemon/error.h>
3031
#include <deemon/format.h>
3132
#include <deemon/heap.h>
@@ -3835,7 +3836,7 @@ DeeModule_ImportChildEx(DeeModuleObject *self,
38353836
/************************************************************************/
38363837
/************************************************************************/
38373838

3838-
PRIVATE WUNUSED NONNULL((1)) DREF DeeObject *DCALL
3839+
PRIVATE WUNUSED NONNULL((1)) DREF DeeModuleObject *DCALL
38393840
do_DeeModule_ImportGlobal(/*utf-8*/ char const *__restrict import_str,
38403841
size_t import_str_size,
38413842
DeeStringObject *import_str_ob) {
@@ -3845,55 +3846,73 @@ do_DeeModule_ImportGlobal(/*utf-8*/ char const *__restrict import_str,
38453846
if (DeeModule_Initialize(result) < 0)
38463847
Dee_Clear(result);
38473848
}
3848-
return Dee_AsObject(result);
3849+
return result;
38493850
}
38503851

3851-
PRIVATE WUNUSED NONNULL((1)) DREF DeeObject *DCALL
3852+
PRIVATE WUNUSED NONNULL((1)) DREF DeeModuleObject *DCALL
38523853
do_import_getattr_string_len(char const *__restrict attr, size_t attrlen) {
38533854
/* Special case: "import_str" is the string "deemon" */
38543855
if (attrlen == 6 && fs_bcmp(attr, "deemon", 6 * sizeof(char)) == 0)
3855-
return_reference(DeeModule_GetDeemon());
3856-
/* TODO: wrap "FileNotFound" errors as "AttributeError" */
3856+
return_reference_(DeeModule_GetDeemon());
38573857
return do_DeeModule_ImportGlobal(attr, attrlen, NULL);
38583858
}
38593859

3860-
PRIVATE WUNUSED NONNULL((1)) DREF DeeObject *DCALL
3860+
PRIVATE WUNUSED NONNULL((1)) DREF DeeModuleObject *DCALL
38613861
do_import_getattr_string(char const *__restrict attr) {
38623862
/* Special case: "import_str" is the string "deemon" */
38633863
if (fs_strcmp(attr, "deemon") == 0)
3864-
return_reference(DeeModule_GetDeemon());
3865-
/* TODO: wrap "FileNotFound" errors as "AttributeError" */
3864+
return_reference_(DeeModule_GetDeemon());
38663865
return do_DeeModule_ImportGlobal(attr, strlen(attr), NULL);
38673866
}
38683867

3869-
PRIVATE WUNUSED NONNULL((1)) DREF DeeObject *DCALL
3868+
PRIVATE WUNUSED NONNULL((1)) DREF DeeModuleObject *DCALL
38703869
do_import_getattr(DeeObject *__restrict attr) {
38713870
char const *utf8 = DeeString_AsUtf8(attr);
38723871
if unlikely(!utf8)
38733872
goto err;
38743873
if (WSTR_LENGTH(utf8) == 6 && fs_bcmp(utf8, "deemon", 6 * sizeof(char)) == 0)
3875-
return_reference(DeeModule_GetDeemon());
3876-
/* TODO: wrap "FileNotFound" errors as "AttributeError" */
3874+
return_reference_(DeeModule_GetDeemon());
38773875
return do_DeeModule_ImportGlobal(utf8, WSTR_LENGTH(utf8), (DeeStringObject *)attr);
38783876
err:
38793877
return NULL;
38803878
}
38813879

38823880

3883-
INTERN WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL
3884-
import_getattr_string_len_hash(DeeObject *UNUSED(self), char const *attr,
3881+
INTERN WUNUSED NONNULL((1, 2)) DREF DeeModuleObject *DCALL
3882+
import_getattr_string_len_hash(DeeObject *self, char const *attr,
38853883
size_t attrlen, Dee_hash_t UNUSED(hash)) {
3886-
return do_import_getattr_string_len(attr, attrlen);
3884+
DREF DeeModuleObject *result;
3885+
result = do_import_getattr_string_len(attr, attrlen);
3886+
if unlikely(!result) {
3887+
DREF DeeObject *fnf;
3888+
if ((fnf = DeeError_CatchError(&DeeError_FileNotFound)) != NULL)
3889+
DeeRT_ErrUnknownAttrStrLenWithCause(self, attr, attrlen, DeeRT_ATTRIBUTE_ACCESS_GET, fnf);
3890+
}
3891+
return result;
38873892
}
38883893

3889-
INTERN WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL
3890-
import_getattr_string_hash(DeeObject *UNUSED(self), char const *attr, Dee_hash_t UNUSED(hash)) {
3891-
return do_import_getattr_string(attr);
3894+
INTERN WUNUSED NONNULL((1, 2)) DREF DeeModuleObject *DCALL
3895+
import_getattr_string_hash(DeeObject *self, char const *attr, Dee_hash_t UNUSED(hash)) {
3896+
DREF DeeModuleObject *result;
3897+
result = do_import_getattr_string(attr);
3898+
if unlikely(!result) {
3899+
DREF DeeObject *fnf;
3900+
if ((fnf = DeeError_CatchError(&DeeError_FileNotFound)) != NULL)
3901+
DeeRT_ErrUnknownAttrStrWithCause(self, attr, DeeRT_ATTRIBUTE_ACCESS_GET, fnf);
3902+
}
3903+
return result;
38923904
}
38933905

3894-
INTERN WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL
3895-
import_getattr(DeeObject *UNUSED(self), DeeObject *attr) {
3896-
return do_import_getattr(attr);
3906+
INTERN WUNUSED NONNULL((1, 2)) DREF DeeModuleObject *DCALL
3907+
import_getattr(DeeObject *self, DeeObject *attr) {
3908+
DREF DeeModuleObject *result;
3909+
result = do_import_getattr(attr);
3910+
if unlikely(!result) {
3911+
DREF DeeObject *fnf;
3912+
if ((fnf = DeeError_CatchError(&DeeError_FileNotFound)) != NULL)
3913+
DeeRT_ErrUnknownAttrWithCause(self, attr, DeeRT_ATTRIBUTE_ACCESS_GET, fnf);
3914+
}
3915+
return result;
38973916
}
38983917

38993918

0 commit comments

Comments
 (0)