Skip to content

Commit 48a5816

Browse files
committed
Let upcall function ctxTupleFromArray close handles
1 parent b1a9b75 commit 48a5816

File tree

3 files changed

+62
-11
lines changed

3 files changed

+62
-11
lines changed

graalpython/com.oracle.graal.python.jni/src/ctx_builder.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@
4646
*/
4747

4848

49-
#include <stddef.h>
50-
#include "hpy.h"
49+
#include "hpy_jni.h"
5150

5251
typedef struct {
5352
HPy_ssize_t capacity; // allocated handles
@@ -121,11 +120,7 @@ ctx_TupleBuilder_Build(HPyContext *ctx, HPyTupleBuilder builder)
121120
HPyErr_NoMemory(ctx);
122121
return HPy_NULL;
123122
}
124-
/* TODO(fa): we could have an internal upcall that steals the references */
125-
HPy res = HPyTuple_FromArray(ctx, hb->handles, hb->capacity);
126-
for (HPy_ssize_t i = 0; i < hb->capacity; i++) {
127-
HPy_Close(ctx, hb->handles[i]);
128-
}
123+
HPy res = upcallTupleFromArray(ctx, hb->handles, hb->capacity, JNI_TRUE);
129124
free(hb);
130125
return res;
131126
}

graalpython/com.oracle.graal.python.jni/src/hpy_jni.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
* SOFTWARE.
4040
*/
4141

42-
#include <hpy.h>
42+
#include "hpy_jni.h"
43+
4344
#include <wchar.h>
4445
#include <assert.h>
4546
#include <stdio.h>
@@ -59,7 +60,6 @@
5960

6061
#include "com_oracle_graal_python_builtins_objects_cext_hpy_GraalHPyContext.h"
6162
#include "hpynative.h"
62-
#include <jni.h>
6363

6464
/* definitions for HPyTracker */
6565
#include "hpy/runtime/ctx_funcs.h"
@@ -430,17 +430,22 @@ static HPy augment_UnicodeFromWideChar(HPyContext *ctx, const wchar_t *u, HPy_ss
430430
}
431431
}
432432

433-
static HPy augment_TupleFromArray(HPyContext *ctx, HPy *items, HPy_ssize_t nitems) {
433+
_HPy_HIDDEN HPy upcallTupleFromArray(HPyContext *ctx, HPy *items, HPy_ssize_t nitems, jboolean steal) {
434434
jarray jLongArray = (*jniEnv)->NewLongArray(jniEnv, (jsize) nitems);
435435
jlong *content = (*jniEnv)->GetPrimitiveArrayCritical(jniEnv, jLongArray, 0);
436436
HPy_ssize_t i;
437437
for (i = 0; i < nitems; i++) {
438438
content[i] = (jlong) toBits(items[i]);
439439
}
440440
(*jniEnv)->ReleasePrimitiveArrayCritical(jniEnv, jLongArray, content, 0);
441-
return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), TupleFromArray, jLongArray, JNI_FALSE);
441+
return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), TupleFromArray, jLongArray, steal);
442+
}
443+
444+
static HPy augment_TupleFromArray(HPyContext *ctx, HPy *items, HPy_ssize_t nitems) {
445+
return upcallTupleFromArray(ctx, items, nitems, JNI_FALSE);
442446
}
443447

448+
444449
void initDirectFastPaths(HPyContext *context) {
445450
LOG("%p", context);
446451
context->name = "HPy Universal ABI (GraalVM backend, JNI)";
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
42+
/*
43+
* Native implementation of HPyTupleBuilder.
44+
* This is written in a way that we could also use the internal functions
45+
* 'builder_*' to implement HPyListBuilder.
46+
*/
47+
48+
#include <hpy.h>
49+
#include <jni.h>
50+
51+
_HPy_HIDDEN HPy upcallTupleFromArray(HPyContext *ctx, HPy *items, HPy_ssize_t nitems, jboolean steal);

0 commit comments

Comments
 (0)