@@ -89,7 +89,7 @@ namespace lib_ruby_parser
8989 }
9090
9191 // decoder
92- Decoder::Decoder (DecoderFunction f_) : f(f_) {}
92+ Decoder::Decoder (DecoderFunction f_, void *state_ ) : f(f_), state(state_ ) {}
9393
9494 // maybe decoder
9595 MaybeDecoder::MaybeDecoder (Decoder decoder_) : decoder(decoder_) {}
@@ -99,7 +99,7 @@ namespace lib_ruby_parser
9999 }
100100 MaybeDecoder MaybeDecoder::None ()
101101 {
102- return MaybeDecoder (Decoder (nullptr ));
102+ return MaybeDecoder (Decoder (nullptr , nullptr ));
103103 }
104104
105105 bool MaybeDecoder::is_some () const
@@ -183,60 +183,57 @@ namespace lib_ruby_parser
183183
184184 extern " C"
185185 {
186- DecoderBlob lib_ruby_parser__test__always_ok_decoder (void );
187- DecoderBlob lib_ruby_parser__test__always_err_decoder (void );
186+ DecoderBlob lib_ruby_parser__test__always_ok_decoder (const char *output );
187+ DecoderBlob lib_ruby_parser__test__always_err_decoder (const char *output );
188188 }
189- static DecoderResult call_decoder (Decoder decoder, String encoding, ByteList input)
189+ static DecoderResult call_decoder (Decoder decoder, String encoding, ByteList input, void *state )
190190 {
191191 StringBlob encoding_blob = into_blob<String, StringBlob>(std::move (encoding));
192192 ByteListBlob input_blob = into_blob<ByteList, ByteListBlob>(std::move (input));
193193 // cast fn from
194194 // (String, ByteList) -> DecoderResult
195195 // to
196196 // (StringBlob, ByteListBlob) -> DecoderResultBlob
197- typedef DecoderResultBlob (*DecoderFunctionBlob)(StringBlob, ByteListBlob);
197+ typedef DecoderResultBlob (*DecoderFunctionBlob)(StringBlob, ByteListBlob, void * );
198198 DecoderFunctionBlob fn_blob =
199199 reinterpret_cast <DecoderFunctionBlob>(
200200 reinterpret_cast <void *>(
201201 decoder.f ));
202- DecoderResultBlob result_blob = fn_blob (encoding_blob, input_blob);
202+ DecoderResultBlob result_blob = fn_blob (encoding_blob, input_blob, state );
203203 return from_blob<DecoderResultBlob, DecoderResult>(result_blob);
204204 }
205205
206206 static void test_decoder_fields (void )
207207 {
208208 annotate_test;
209209
210- const char *ALWAYS_OK = " always_ok" ;
211- const char *ALWAYS_ERR = " always_err" ;
212-
213210 Decoder ok_decoder = from_blob<DecoderBlob, Decoder>(
214- lib_ruby_parser__test__always_ok_decoder ());
215- DecoderResult ok_decoder_result = call_decoder (ok_decoder, String::Copied (" utf-8" ), ByteList::Copied (" 2 + 2" , 5 ));
211+ lib_ruby_parser__test__always_ok_decoder (" anything " ));
212+ DecoderResult ok_decoder_result = call_decoder (ok_decoder, String::Copied (" utf-8" ), ByteList::Copied (" 2 + 2" , 5 ), const_cast < char *>( " foo " ) );
216213 assert_eq (ok_decoder_result.tag , DecoderResult::Tag::OK);
217- assert_byte_list (ok_decoder_result.as .ok , ALWAYS_OK );
214+ assert_byte_list (ok_decoder_result.as .ok , " foo " );
218215
219216 Decoder err_decoder = from_blob<DecoderBlob, Decoder>(
220- lib_ruby_parser__test__always_err_decoder ());
221- DecoderResult err_decoder_result = call_decoder (err_decoder, String::Copied (" utf-8" ), ByteList::Copied (" 2 + 2" , 5 ));
217+ lib_ruby_parser__test__always_err_decoder (" anything " ));
218+ DecoderResult err_decoder_result = call_decoder (err_decoder, String::Copied (" utf-8" ), ByteList::Copied (" 2 + 2" , 5 ), const_cast < char *>( " bar " ) );
222219 assert_eq (err_decoder_result.as .err .tag , InputError::Tag::DECODING_ERROR);
223- assert_string_eq (err_decoder_result.as .err .as .unsupported_encoding , ALWAYS_ERR );
220+ assert_string_eq (err_decoder_result.as .err .as .unsupported_encoding , " bar " );
224221 }
225222
226223 extern " C"
227224 {
228- MaybeDecoderBlob lib_ruby_parser__test__some_always_ok_decoder (void );
225+ MaybeDecoderBlob lib_ruby_parser__test__some_always_ok_decoder (const char *output );
229226 MaybeDecoderBlob lib_ruby_parser__test__none_decoder (void );
230227 }
231228 static void test_maybe_decoder_fields (void )
232229 {
233230 annotate_test;
234231
235232 Decoder always_ok_decoder = from_blob<DecoderBlob, Decoder>(
236- lib_ruby_parser__test__always_ok_decoder ());
233+ lib_ruby_parser__test__always_ok_decoder (" foo " ));
237234
238235 MaybeDecoder some_decoder = from_blob<MaybeDecoderBlob, MaybeDecoder>(
239- lib_ruby_parser__test__some_always_ok_decoder ());
236+ lib_ruby_parser__test__some_always_ok_decoder (" foo " ));
240237 assert (some_decoder.is_some ());
241238
242239 assert_eq (some_decoder.decoder .f , always_ok_decoder.f );
0 commit comments