@@ -35,14 +35,17 @@ JNIEXPORT jint JNICALL
3535Java_org_rapidyaml_Rapidyaml_ysparse_1parse (JNIEnv *env, jobject,
3636 jlong obj, jstring jfilename,
3737 jbyteArray src, jint src_len,
38+ jbyteArray arena, jint arena_len,
3839 jintArray dst, jint dst_len)
3940{
4041 TIMED_SECTION (" jni:ysparse" , (size_type)src_len);
42+ jbyte* arena_ = nullptr ;
4143 jbyte* src_ = nullptr ;
4244 int * dst_ = nullptr ;
4345 const char *filename = nullptr ;
4446 jboolean dst_is_copy = false ;
4547 jboolean src_is_copy = false ;
48+ jboolean arena_is_copy = false ;
4649 {
4750 TIMED_SECTION (" jni:ysparse/get_jni" , (size_type)src_len);
4851 // this is __S__L__O__W__
@@ -52,6 +55,10 @@ Java_org_rapidyaml_Rapidyaml_ysparse_1parse(JNIEnv *env, jobject,
5255 TIMED_SECTION (" jni:ysparse/GetByteArray(src)" );
5356 src_ = env->GetByteArrayElements (src, &src_is_copy);
5457 }
58+ {
59+ TIMED_SECTION (" jni:ysparse/GetByteArray(arena)" );
60+ arena_ = env->GetByteArrayElements (arena, &arena_is_copy);
61+ }
5562 {
5663 TIMED_SECTION (" jni:ysparse/GetIntArray(dst)" );
5764 dst_ = env->GetIntArrayElements (dst, &dst_is_copy);
@@ -68,6 +75,7 @@ Java_org_rapidyaml_Rapidyaml_ysparse_1parse(JNIEnv *env, jobject,
6875 {
6976 rc = ysparse_parse ((ysparse*)obj, filename,
7077 (char *)src_, src_len,
78+ (char *)arena_, arena_len,
7179 dst_, dst_len);
7280 }
7381 catch (YsParseError const & exc)
@@ -86,6 +94,10 @@ Java_org_rapidyaml_Rapidyaml_ysparse_1parse(JNIEnv *env, jobject,
8694 TIMED_SECTION (" jni:ysparse/ReleaseByteArray(src)" );
8795 env->ReleaseByteArrayElements (src, src_, 0 );
8896 }
97+ {
98+ TIMED_SECTION (" jni:ysparse/ReleaseByteArray(arena)" );
99+ env->ReleaseByteArrayElements (arena, arena_, 0 );
100+ }
89101 {
90102 TIMED_SECTION (" jni:ysparse/ReleaseIntArray(dst)" );
91103 env->ReleaseIntArrayElements (dst, dst_, 0 );
@@ -103,27 +115,35 @@ JNIEXPORT jint JNICALL
103115Java_org_rapidyaml_Rapidyaml_ysparse_1parse_1buf (JNIEnv *env, jobject,
104116 jlong obj, jstring jfilename,
105117 jobject src, jint src_len,
118+ jobject arena, jint arena_len,
106119 jobject dst, jint dst_len)
107120{
108121 TIMED_SECTION (" jni:ysparse_buf" , (size_type)src_len);
122+ char * arena_ = nullptr ;
109123 char * src_ = nullptr ;
110124 int * dst_ = nullptr ;
111125 const char *filename = nullptr ;
112126 {
113127 TIMED_SECTION (" jni:ysparse_buf/get_jni" , (size_type)src_len);
114128 src_ = (char *)env->GetDirectBufferAddress (src);
129+ arena_ = (char *)env->GetDirectBufferAddress (arena);
115130 dst_ = (int *)env->GetDirectBufferAddress (dst);
116131 filename = env->GetStringUTFChars (jfilename, 0 );
117132 if (!src_)
118133 throw_runtime_exception (env, " null pointer: src" );
134+ if (!arena_)
135+ throw_runtime_exception (env, " null pointer: arena" );
119136 if (!dst_)
120137 throw_runtime_exception (env, " null pointer: dst" );
121138 }
122139 {
123140 TIMED_SECTION (" jni:ysparse_buf/parse" , (size_type)src_len);
124141 try
125142 {
126- return ysparse_parse ((ysparse*)obj, filename, src_, src_len, dst_, dst_len);
143+ return ysparse_parse ((ysparse*)obj, filename,
144+ src_, src_len,
145+ arena_, arena_len,
146+ dst_, dst_len);
127147 }
128148 catch (YsParseError const & exc)
129149 {
0 commit comments