@@ -137,48 +137,63 @@ static void haio_finalizer(SEXP xptr) {
137137
138138static SEXP mk_error_saio (const int xc , SEXP env ) {
139139
140- INTEGER (nano_error )[0 ] = xc ;
141- Rf_defineVar (nano_ResultSymbol , nano_error , ENCLOS (env ));
142- return nano_error ;
140+ SEXP err = PROTECT (Rf_ScalarInteger (xc ));
141+ SET_ATTRIB (err , nano_error );
142+ SET_OBJECT (err , 1 );
143+ Rf_defineVar (nano_ResultSymbol , err , ENCLOS (env ));
144+ UNPROTECT (1 );
145+ return err ;
143146
144147}
145148
146149static SEXP mk_error_raio (const int xc , SEXP env ) {
147150
148- INTEGER (nano_error )[0 ] = xc ;
149- Rf_defineVar (nano_RawSymbol , nano_error , ENCLOS (env ));
150- Rf_defineVar (nano_DataSymbol , nano_error , ENCLOS (env ));
151- return nano_error ;
151+ SEXP err = PROTECT (Rf_ScalarInteger (xc ));
152+ SET_ATTRIB (err , nano_error );
153+ SET_OBJECT (err , 1 );
154+ Rf_defineVar (nano_RawSymbol , err , ENCLOS (env ));
155+ Rf_defineVar (nano_DataSymbol , err , ENCLOS (env ));
156+ UNPROTECT (1 );
157+ return err ;
152158
153159}
154160
155161static SEXP mk_error_haio (const int xc , SEXP env ) {
156162
157- INTEGER (nano_error )[0 ] = xc ;
158- Rf_defineVar (nano_StatusSymbol , nano_error , ENCLOS (env ));
159- Rf_defineVar (nano_IdSymbol , nano_error , ENCLOS (env ));
160- Rf_defineVar (nano_RawSymbol , nano_error , ENCLOS (env ));
161- Rf_defineVar (nano_ProtocolSymbol , nano_error , ENCLOS (env ));
162- return nano_error ;
163+ SEXP err = PROTECT (Rf_ScalarInteger (xc ));
164+ SET_ATTRIB (err , nano_error );
165+ SET_OBJECT (err , 1 );
166+ Rf_defineVar (nano_StatusSymbol , err , ENCLOS (env ));
167+ Rf_defineVar (nano_IdSymbol , err , ENCLOS (env ));
168+ Rf_defineVar (nano_RawSymbol , err , ENCLOS (env ));
169+ Rf_defineVar (nano_ProtocolSymbol , err , ENCLOS (env ));
170+ UNPROTECT (1 );
171+ return err ;
163172
164173}
165174
166175static SEXP mk_error_data (const int xc ) {
167176
168177 const char * names [] = {"data" , "" };
169- INTEGER (nano_error )[0 ] = xc ;
170- SEXP out = Rf_mkNamed (VECSXP , names );
171- SET_VECTOR_ELT (out , 0 , nano_error );
178+ SEXP out = PROTECT (Rf_mkNamed (VECSXP , names ));
179+ SEXP err = Rf_ScalarInteger (xc );
180+ SET_ATTRIB (err , nano_error );
181+ SET_OBJECT (err , 1 );
182+ SET_VECTOR_ELT (out , 0 , err );
183+ UNPROTECT (1 );
172184 return out ;
173185
174186}
175187
176188static SEXP mk_error_result (const int xc ) {
177189
178190 const char * names [] = {"result" , "" };
179- INTEGER (nano_error )[0 ] = xc ;
180- SEXP out = Rf_mkNamed (VECSXP , names );
181- SET_VECTOR_ELT (out , 0 , nano_error );
191+ SEXP out = PROTECT (Rf_mkNamed (VECSXP , names ));
192+ SEXP err = Rf_ScalarInteger (xc );
193+ SET_ATTRIB (err , nano_error );
194+ SET_OBJECT (err , 1 );
195+ SET_VECTOR_ELT (out , 0 , err );
196+ UNPROTECT (1 );
182197 return out ;
183198
184199}
0 commit comments