@@ -748,6 +748,7 @@ bool MCScriptEnsureModuleIsUsable(MCScriptModuleRef self)
748748 if (t_symbol == nil)
749749 {
750750 MCErrorThrowGenericWithMessage (MCSTR (" %{name} not usable - unable to resolve foreign type '%{type}'" ),
751+ " name" , self -> name,
751752 " type" , t_type -> binding,
752753 nil);
753754 goto error_cleanup;
@@ -828,6 +829,25 @@ bool MCScriptEnsureModuleIsUsable(MCScriptModuleRef self)
828829
829830// //////////////////////////////////////////////////////////////////////////////
830831
832+ static bool
833+ __MCScriptThrowModuleNotUsableError (MCScriptModuleRef self)
834+ {
835+ return MCErrorThrowGenericWithMessage (MCSTR (" %{name} not usable" ),
836+ " name" , self -> name,
837+ nil);
838+ }
839+
840+ static bool
841+ __MCScriptThrowDefinitionNotFoundInModuleError (MCScriptModuleRef self,
842+ MCScriptDefinitionKind p_kind,
843+ MCNameRef p_name)
844+ {
845+ return MCErrorThrowGenericWithMessage (MCSTR (" %{kind} definition %{name} not found in %{module}" ),
846+ " kind" , __MCScriptDefinitionKindToString (p_kind),
847+ " name" , p_name,
848+ " module" , self->name );
849+ }
850+
831851static bool
832852__MCScriptCopyDefinitionsOfModule (MCScriptModuleRef self,
833853 MCScriptDefinitionKind p_kind,
@@ -893,11 +913,17 @@ bool MCScriptListConstantNamesOfModule(MCScriptModuleRef self, /* copy */ MCProp
893913bool MCScriptQueryConstantOfModule (MCScriptModuleRef self, MCNameRef p_constant, MCValueRef& r_constant_value)
894914{
895915 MCScriptConstantDefinition *t_constant_def = nil;
916+
917+ if (!self -> is_usable)
918+ return __MCScriptThrowModuleNotUsableError (self);
919+
896920 if (!MCScriptLookupConstantDefinitionInModule (self,
897921 p_constant,
898922 t_constant_def))
899923 {
900- return false ;
924+ return __MCScriptThrowDefinitionNotFoundInModuleError (self,
925+ kMCScriptDefinitionKindConstant ,
926+ p_constant);
901927 }
902928
903929 r_constant_value = self->values [t_constant_def->value ];
@@ -917,10 +943,10 @@ bool MCScriptQueryPropertyOfModule(MCScriptModuleRef self, MCNameRef p_property,
917943 MCScriptPropertyDefinition *t_def;
918944
919945 if (!self -> is_usable)
920- return false ; // TODO - throw error
946+ return __MCScriptThrowModuleNotUsableError (self);
921947
922948 if (!MCScriptLookupPropertyDefinitionInModule (self, p_property, t_def))
923- return false ; // TODO - throw error
949+ return __MCScriptThrowDefinitionNotFoundInModuleError (self, kMCScriptDefinitionKindProperty , p_property);
924950
925951 MCScriptDefinition *t_getter;
926952 t_getter = t_def -> getter != 0 ? self -> definitions[t_def -> getter - 1 ] : nil;
@@ -963,10 +989,10 @@ bool MCScriptQueryEventOfModule(MCScriptModuleRef self, MCNameRef p_event, /* ge
963989 MCScriptEventDefinition *t_def;
964990
965991 if (!self -> is_usable)
966- return false ; // TODO - throw error
992+ return __MCScriptThrowModuleNotUsableError (self);
967993
968994 if (!MCScriptLookupEventDefinitionInModule (self, p_event, t_def))
969- return false ; // TODO - throw error
995+ return __MCScriptThrowDefinitionNotFoundInModuleError (self, kMCScriptDefinitionKindEvent , p_event);
970996
971997 r_signature = self -> types[t_def -> type] -> typeinfo;
972998
@@ -985,10 +1011,10 @@ bool MCScriptQueryHandlerSignatureOfModule(MCScriptModuleRef self, MCNameRef p_h
9851011 MCScriptHandlerDefinition *t_def;
9861012
9871013 if (!self -> is_usable)
988- return false ; // TODO - throw error
1014+ return __MCScriptThrowModuleNotUsableError (self);
9891015
9901016 if (!MCScriptLookupHandlerDefinitionInModule (self, p_handler, t_def))
991- return false ; // TODO - throw error
1017+ return __MCScriptThrowDefinitionNotFoundInModuleError (self, kMCScriptDefinitionKindProperty , p_handler);
9921018
9931019 r_signature = self -> types[t_def -> type] -> typeinfo;
9941020
@@ -1001,12 +1027,12 @@ bool MCScriptCopyHandlerParameterNamesOfModule(MCScriptModuleRef self, MCNameRef
10011027
10021028 if (!self -> is_usable)
10031029 {
1004- return false ; // TODO - throw error
1030+ return __MCScriptThrowModuleNotUsableError (self);
10051031 }
10061032
10071033 if (!MCScriptLookupHandlerDefinitionInModule (self, p_handler, t_def))
10081034 {
1009- return false ; // TODO - throw error
1035+ return __MCScriptThrowDefinitionNotFoundInModuleError (self, kMCScriptDefinitionKindHandler , p_handler);
10101036 }
10111037
10121038 MCAutoProperListRef t_names;
@@ -1050,16 +1076,17 @@ void MCScriptReleaseRawModule(MCScriptModule *p_module)
10501076
10511077// //////////////////////////////////////////////////////////////////////////////
10521078
1053- static bool
1079+ template < typename T, MCScriptDefinitionKind K> static bool
10541080__MCScriptLookupDefinitionInModule (MCScriptModuleRef self,
1055- MCScriptDefinitionKind p_kind,
10561081 MCNameRef p_name,
1057- MCScriptDefinition *& r_definition)
1082+ T *& r_definition)
10581083{
1084+ __MCScriptValidateObjectAndKind__ (self, kMCScriptObjectKindModule );
1085+
10591086 for (uindex_t i = 0 ; i < self->exported_definition_count ; i++)
10601087 {
1061- if (p_kind != kMCScriptDefinitionKindNone &&
1062- self->definitions [self->exported_definitions [i].index ]->kind != p_kind )
1088+ if (K != kMCScriptDefinitionKindNone &&
1089+ self->definitions [self->exported_definitions [i].index ]->kind != K )
10631090 {
10641091 continue ;
10651092 }
@@ -1070,7 +1097,7 @@ __MCScriptLookupDefinitionInModule(MCScriptModuleRef self,
10701097 continue ;
10711098 }
10721099
1073- r_definition = self->definitions [self->exported_definitions [i].index ];
1100+ r_definition = static_cast <T*>( self->definitions [self->exported_definitions [i].index ]) ;
10741101
10751102 return true ;
10761103 }
@@ -1081,84 +1108,42 @@ __MCScriptLookupDefinitionInModule(MCScriptModuleRef self,
10811108
10821109bool MCScriptLookupConstantDefinitionInModule (MCScriptModuleRef self, MCNameRef p_constant, MCScriptConstantDefinition*& r_definition)
10831110{
1084- __MCScriptValidateObjectAndKind__ (self, kMCScriptObjectKindModule );
1085-
1086- MCScriptDefinition *t_definition = nil;
1087- if (!__MCScriptLookupDefinitionInModule (self,
1088- kMCScriptDefinitionKindConstant ,
1089- p_constant,
1090- t_definition))
1091- {
1092- return false ;
1093- }
1094-
1095- r_definition = static_cast <MCScriptConstantDefinition *>(t_definition);
1096-
1097- return true ;
1111+ return __MCScriptLookupDefinitionInModule<MCScriptConstantDefinition,
1112+ kMCScriptDefinitionKindConstant >(self,
1113+ p_constant,
1114+ r_definition);
10981115}
10991116
11001117bool MCScriptLookupPropertyDefinitionInModule (MCScriptModuleRef self, MCNameRef p_property, MCScriptPropertyDefinition*& r_definition)
11011118{
1102- __MCScriptValidateObjectAndKind__ (self, kMCScriptObjectKindModule );
1103-
1104- MCScriptDefinition *t_definition = nil;
1105- if (!__MCScriptLookupDefinitionInModule (self,
1106- kMCScriptDefinitionKindProperty ,
1107- p_property,
1108- t_definition))
1109- {
1110- return false ;
1111- }
1112-
1113- r_definition = static_cast <MCScriptPropertyDefinition *>(t_definition);
1114-
1115- return true ;
1119+ return __MCScriptLookupDefinitionInModule<MCScriptPropertyDefinition,
1120+ kMCScriptDefinitionKindProperty >(self,
1121+ p_property,
1122+ r_definition);
11161123}
11171124
1118- bool MCScriptLookupEventDefinitionInModule (MCScriptModuleRef self, MCNameRef p_property , MCScriptEventDefinition*& r_definition)
1125+ bool MCScriptLookupEventDefinitionInModule (MCScriptModuleRef self, MCNameRef p_event , MCScriptEventDefinition*& r_definition)
11191126{
1120- __MCScriptValidateObjectAndKind__ (self, kMCScriptObjectKindModule );
1121-
1122- MCScriptDefinition *t_definition = nil;
1123- if (!__MCScriptLookupDefinitionInModule (self,
1124- kMCScriptDefinitionKindEvent ,
1125- p_property,
1126- t_definition))
1127- {
1128- return false ;
1129- }
1130-
1131- r_definition = static_cast <MCScriptEventDefinition *>(t_definition);
1132-
1133- return true ;
1127+ return __MCScriptLookupDefinitionInModule<MCScriptEventDefinition,
1128+ kMCScriptDefinitionKindEvent >(self,
1129+ p_event,
1130+ r_definition);
11341131}
11351132
11361133bool MCScriptLookupHandlerDefinitionInModule (MCScriptModuleRef self, MCNameRef p_handler, MCScriptHandlerDefinition*& r_definition)
11371134{
1138- __MCScriptValidateObjectAndKind__ (self, kMCScriptObjectKindModule );
1139-
1140- MCScriptDefinition *t_definition = nil;
1141- if (!__MCScriptLookupDefinitionInModule (self,
1142- kMCScriptDefinitionKindHandler ,
1143- p_handler,
1144- t_definition))
1145- {
1146- return false ;
1147- }
1148-
1149- r_definition = static_cast <MCScriptHandlerDefinition *>(t_definition);
1150-
1151- return true ;
1135+ return __MCScriptLookupDefinitionInModule<MCScriptHandlerDefinition,
1136+ kMCScriptDefinitionKindHandler >(self,
1137+ p_handler,
1138+ r_definition);
11521139}
11531140
11541141bool MCScriptLookupDefinitionInModule (MCScriptModuleRef self, MCNameRef p_name, MCScriptDefinition*& r_definition)
11551142{
1156- __MCScriptValidateObjectAndKind__ (self, kMCScriptObjectKindModule );
1157-
1158- return __MCScriptLookupDefinitionInModule (self,
1159- kMCScriptDefinitionKindNone ,
1160- p_name,
1161- r_definition);
1143+ return __MCScriptLookupDefinitionInModule<MCScriptDefinition,
1144+ kMCScriptDefinitionKindNone >(self,
1145+ p_name,
1146+ r_definition);
11621147}
11631148
11641149// //////////////////////////////////////////////////////////////////////////////
0 commit comments