summaryrefslogtreecommitdiff
path: root/ext/json/generator/generator.c
diff options
context:
space:
mode:
authorJean Boussier <[email protected]>2024-11-05 16:35:58 +0100
committerJean Boussier <[email protected]>2024-11-05 18:00:36 +0100
commitca8f21ace86e9c7ab184b3f0087ff458c06b178c (patch)
treee5a4c05ba4bff8d9dc19963936d2c81248200881 /ext/json/generator/generator.c
parente8522f06b51f86214d28259118c736ac8951d8cd (diff)
[ruby/json] Resync
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/12003
Diffstat (limited to 'ext/json/generator/generator.c')
-rw-r--r--ext/json/generator/generator.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index c32b5ce093..80539af6c8 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -1,5 +1,27 @@
+#include "ruby.h"
#include "../fbuffer/fbuffer.h"
-#include "generator.h"
+
+#include <math.h>
+#include <ctype.h>
+
+/* ruby api and some helpers */
+
+typedef struct JSON_Generator_StateStruct {
+ VALUE indent;
+ VALUE space;
+ VALUE space_before;
+ VALUE object_nl;
+ VALUE array_nl;
+
+ long max_nesting;
+ long depth;
+ long buffer_initial_length;
+
+ bool allow_nan;
+ bool ascii_only;
+ bool script_safe;
+ bool strict;
+} JSON_Generator_State;
#ifndef RB_UNLIKELY
#define RB_UNLIKELY(cond) (cond)
@@ -31,6 +53,7 @@ struct generate_json_data {
generator_func func;
};
+static VALUE cState_from_state_s(VALUE self, VALUE opts);
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func);
static void generate_json(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj);
static void generate_json_object(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj);
@@ -1013,6 +1036,10 @@ static VALUE generate_json_rescue(VALUE d, VALUE exc)
struct generate_json_data *data = (struct generate_json_data *)d;
fbuffer_free(data->buffer);
+ if (RBASIC_CLASS(exc) == rb_path2class("Encoding::UndefinedConversionError")) {
+ exc = rb_exc_new_str(eGeneratorError, rb_funcall(exc, rb_intern("message"), 0));
+ }
+
rb_exc_raise(exc);
return Qundef;