Skip to content

Commit f760ab4

Browse files
committed
Merge branch 'master' into msimacek/experiment-faster-interpretation
2 parents 84b5103 + 9918000 commit f760ab4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1329
-850
lines changed

docs/contributor/DEV_TASKS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,5 @@ Follow these steps to update HPy.
5353
- Adding `GraalHPyContextFunction` implementations for the new APIs
5454
- Updating the `createMembers` method to assign the appropriate
5555
implementations to the context members
56+
- Updating hpy.c to assign new context members to their native locations
57+

graalpython/com.oracle.graal.python.frozen/freeze_modules.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
"""
88

99
from collections import namedtuple
10-
import hashlib
1110
import marshal
1211
import ntpath
1312
import os
@@ -16,6 +15,9 @@
1615
import textwrap
1716
import shutil
1817

18+
from _sha256 import sha256
19+
20+
1921
FROZEN_ONLY = os.path.join(os.path.dirname(__file__), "flag.py")
2022

2123
# These are modules that get frozen.
@@ -369,7 +371,7 @@ def _iter_sources(modules):
369371
def _get_checksum(filename):
370372
with open(filename, "rb") as infile:
371373
contents = infile.read()
372-
m = hashlib.sha256()
374+
m = sha256()
373375
m.update(contents)
374376
return m.hexdigest()
375377

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
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+
49+
#include "hpy_jni.h"
50+
51+
typedef struct {
52+
HPy_ssize_t capacity; // allocated handles
53+
HPy handles[0];
54+
} _HPyBuilder_s;
55+
56+
static inline _HPyBuilder_s *_ht2hb(HPyTupleBuilder ht) {
57+
return (_HPyBuilder_s *) (ht)._tup;
58+
}
59+
60+
static inline HPyTupleBuilder _hb2ht(_HPyBuilder_s *hp) {
61+
return (HPyTupleBuilder) {(HPy_ssize_t) (hp)};
62+
}
63+
64+
static inline _HPyBuilder_s *builder_new(HPy_ssize_t size) {
65+
_HPyBuilder_s *hb = calloc(1, sizeof(_HPyBuilder_s) + size * sizeof(HPy));
66+
if (hb == NULL) {
67+
/* delay the MemoryError */
68+
/* note: it's done this way so that the caller doesn't need to
69+
check if HPyTupleBuilder_New() or every HPyTupleBuilder_Set()
70+
raised. If there is a rare error like a MemoryError somewhere,
71+
further calls to the HPyTupleBuilder are ignored. The final
72+
HPyTupleBuilder_Build() will re-raise the MemoryError and so
73+
it's enough for the caller to check at that point. */
74+
} else {
75+
hb->capacity = size;
76+
}
77+
return hb;
78+
}
79+
static inline void builder_set(HPyContext *ctx, _HPyBuilder_s *hb, HPy_ssize_t index, HPy h_item)
80+
{
81+
if (hb != NULL) {
82+
assert(index >= 0 && index < hb->capacity);
83+
assert(HPy_IsNull(hb->handles[index]));
84+
hb->handles[index] = HPy_Dup(ctx, h_item);
85+
}
86+
}
87+
88+
static inline void builder_cancel(HPyContext *ctx, _HPyBuilder_s *hb)
89+
{
90+
if (hb == NULL) {
91+
// we don't report the memory error here: the builder
92+
// is being cancelled (so the result of the builder is not being used)
93+
// and likely it's being cancelled during the handling of another error
94+
return;
95+
}
96+
for (HPy_ssize_t i = 0; i < hb->capacity; i++) {
97+
HPy_Close(ctx, hb->handles[i]);
98+
}
99+
free(hb);
100+
}
101+
102+
_HPy_HIDDEN HPyTupleBuilder
103+
ctx_TupleBuilder_New(HPyContext *ctx, HPy_ssize_t size)
104+
{
105+
return _hb2ht(builder_new(size));
106+
}
107+
108+
_HPy_HIDDEN void
109+
ctx_TupleBuilder_Set(HPyContext *ctx, HPyTupleBuilder builder,
110+
HPy_ssize_t index, HPy h_item)
111+
{
112+
builder_set(ctx, _ht2hb(builder), index, h_item);
113+
}
114+
115+
_HPy_HIDDEN HPy
116+
ctx_TupleBuilder_Build(HPyContext *ctx, HPyTupleBuilder builder)
117+
{
118+
_HPyBuilder_s *hb = _ht2hb(builder);
119+
if (hb == NULL) {
120+
HPyErr_NoMemory(ctx);
121+
return HPy_NULL;
122+
}
123+
HPy res = upcallTupleFromArray(ctx, hb->handles, hb->capacity, JNI_TRUE);
124+
free(hb);
125+
return res;
126+
}
127+
128+
_HPy_HIDDEN void
129+
ctx_TupleBuilder_Cancel(HPyContext *ctx, HPyTupleBuilder builder)
130+
{
131+
builder_cancel(ctx, _ht2hb(builder));
132+
}

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* MIT License
22
*
3-
* Copyright (c) 2021, Oracle and/or its affiliates.
3+
* Copyright (c) 2021, 2022, Oracle and/or its affiliates.
44
* Copyright (c) 2019 pyhandle
55
*
66
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -81,7 +81,7 @@
8181
* return HPy_NULL;
8282
*/
8383

84-
#include "hpy.h"
84+
#include "hpy_jni.h"
8585

8686
static const HPy_ssize_t HPYTRACKER_INITIAL_CAPACITY = 5;
8787

@@ -155,13 +155,20 @@ tracker_resize(HPyContext *ctx, _HPyTracker_s *hp, HPy_ssize_t capacity)
155155
_HPy_HIDDEN int
156156
ctx_Tracker_Add(HPyContext *ctx, HPyTracker ht, HPy h)
157157
{
158-
_HPyTracker_s *hp = _ht2hp(ht);
159-
hp->handles[hp->length++] = h;
160-
if (hp->capacity <= hp->length) {
161-
if (tracker_resize(ctx, hp, hp->capacity * 2 - 1) < 0)
162-
return -1;
158+
uint64_t bits = toBits(h);
159+
if (!isBoxedHandle(bits)) {
160+
return 0;
161+
} else if (bits < IMMUTABLE_HANDLES) {
162+
return 0;
163+
} else {
164+
_HPyTracker_s *hp = _ht2hp(ht);
165+
hp->handles[hp->length++] = h;
166+
if (hp->capacity <= hp->length) {
167+
if (tracker_resize(ctx, hp, hp->capacity * 2 - 1) < 0)
168+
return -1;
169+
}
170+
return 0;
163171
}
164-
return 0;
165172
}
166173

167174
_HPy_HIDDEN void
@@ -176,9 +183,7 @@ ctx_Tracker_Close(HPyContext *ctx, HPyTracker ht)
176183
{
177184
_HPyTracker_s *hp = _ht2hp(ht);
178185
HPy_ssize_t i;
179-
for (i=0; i<hp->length; i++) {
180-
HPy_Close(ctx, hp->handles[i]);
181-
}
186+
upcallBulkClose(ctx, hp->handles, hp->length);
182187
free(hp->handles);
183188
free(hp);
184189
}

0 commit comments

Comments
 (0)