Skip to content

Commit 6541950

Browse files
author
Adam Hrbac
committed
[GR-46598] flask support
PullRequest: graalpython/2847
2 parents 3b8433f + 1a7ee6d commit 6541950

File tree

9 files changed

+404
-10
lines changed

9 files changed

+404
-10
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/builtins/modules/HamtTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,15 @@
4242

4343
import static org.junit.Assert.assertEquals;
4444
import static org.junit.Assert.assertNull;
45+
import static org.junit.Assert.assertTrue;
4546
import static org.junit.Assert.fail;
4647

4748
import org.junit.After;
4849
import org.junit.Before;
4950
import org.junit.Test;
5051

5152
import com.oracle.graal.python.builtins.objects.contextvars.Hamt;
53+
import com.oracle.graal.python.builtins.objects.contextvars.HamtIterator;
5254
import com.oracle.graal.python.test.PythonTests;
5355

5456
public class HamtTests {
@@ -177,6 +179,26 @@ public void testHamtSize() {
177179
}
178180
}
179181

182+
@Test
183+
public void testHamtIterator() {
184+
int limit = 100;
185+
boolean[] seen = new boolean[limit];
186+
Hamt hamt = new Hamt();
187+
for (int i = 0; i < limit; ++i) {
188+
hamt = hamt.withEntry(new Hamt.Entry(i, String.valueOf(i).hashCode(), String.valueOf(i)));
189+
}
190+
HamtIterator hi = new HamtIterator(hamt);
191+
Hamt.Entry el = hi.next();
192+
while (el != null) {
193+
seen[(int) el.key] = true;
194+
assertEquals(String.valueOf(el.key), el.value);
195+
el = hi.next();
196+
}
197+
for (int i = 0; i < limit; ++i) {
198+
assertTrue("failed at " + i, seen[i]);
199+
}
200+
}
201+
180202
// @Test
181203
public void measureTimeForSmallHamtAcceses() {
182204
Hamt hamt = new Hamt().withEntry(new Hamt.Entry(1, 0, 1)).withEntry(new Hamt.Entry(2, 31, 2));

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,6 @@
5555
import java.util.ServiceLoader;
5656
import java.util.logging.Level;
5757

58-
import com.oracle.graal.python.builtins.objects.asyncio.AsyncGenSendBuiltins;
59-
import com.oracle.graal.python.builtins.objects.asyncio.AsyncGenThrowBuiltins;
60-
import com.oracle.graal.python.builtins.objects.asyncio.AsyncGeneratorBuiltins;
6158
import org.graalvm.nativeimage.ImageInfo;
6259

6360
import com.oracle.graal.python.PythonLanguage;
@@ -202,6 +199,9 @@
202199
import com.oracle.graal.python.builtins.objects.NotImplementedBuiltins;
203200
import com.oracle.graal.python.builtins.objects.PNone;
204201
import com.oracle.graal.python.builtins.objects.array.ArrayBuiltins;
202+
import com.oracle.graal.python.builtins.objects.asyncio.AsyncGenSendBuiltins;
203+
import com.oracle.graal.python.builtins.objects.asyncio.AsyncGenThrowBuiltins;
204+
import com.oracle.graal.python.builtins.objects.asyncio.AsyncGeneratorBuiltins;
205205
import com.oracle.graal.python.builtins.objects.asyncio.CoroutineWrapperBuiltins;
206206
import com.oracle.graal.python.builtins.objects.bool.BoolBuiltins;
207207
import com.oracle.graal.python.builtins.objects.bytes.ByteArrayBuiltins;
@@ -211,6 +211,7 @@
211211
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
212212
import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltins;
213213
import com.oracle.graal.python.builtins.objects.contextvars.ContextBuiltins;
214+
import com.oracle.graal.python.builtins.objects.contextvars.ContextIteratorBuiltins;
214215
import com.oracle.graal.python.builtins.objects.contextvars.ContextVarBuiltins;
215216
import com.oracle.graal.python.builtins.objects.contextvars.TokenBuiltins;
216217
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltins;
@@ -519,9 +520,12 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
519520
new WeakRefModuleBuiltins(),
520521
new ReferenceTypeBuiltins(),
521522
new TracemallocModuleBuiltins(),
523+
// contextvars
522524
new ContextVarBuiltins(),
523525
new ContextBuiltins(),
524526
new TokenBuiltins(),
527+
new ContextIteratorBuiltins(),
528+
525529
new GenericAliasBuiltins(),
526530
new com.oracle.graal.python.builtins.objects.types.UnionTypeBuiltins(),
527531
// exceptions

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,8 @@ public enum PythonBuiltinClassType implements TruffleObject {
461461
ContextVarsToken("Token", J__CONTEXTVARS, Flags.PUBLIC_DERIVED_WODICT),
462462
ContextVarsContext("Context", J__CONTEXTVARS, Flags.PUBLIC_DERIVED_WODICT, CONTEXT_M_FLAGS),
463463
ContextVar("ContextVar", J__CONTEXTVARS, Flags.PUBLIC_DERIVED_WODICT),
464+
// CPython uses separate keys, values, items python types for the iterators.
465+
ContextIterator("context_iterator", J__CONTEXTVARS, Flags.PUBLIC_DERIVED_WODICT),
464466

465467
Capsule("capsule"),
466468

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextBuiltins.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__;
4444
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETITEM__;
45+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
4546
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LEN__;
4647

4748
import java.util.List;
@@ -93,6 +94,42 @@ Object get(PContextVarsContext self, Object key,
9394
}
9495
}
9596

97+
@Builtin(name = J___ITER__, declaresExplicitSelf = true, minNumOfPositionalArgs = 1)
98+
@GenerateNodeFactory
99+
public abstract static class Iter extends PythonUnaryBuiltinNode {
100+
@Specialization
101+
Object iter(PContextVarsContext self) {
102+
return factory().createContextIterator(self, PContextIterator.ItemKind.KEYS);
103+
}
104+
}
105+
106+
@Builtin(name = "keys", declaresExplicitSelf = true, minNumOfPositionalArgs = 1)
107+
@GenerateNodeFactory
108+
public abstract static class Keys extends PythonUnaryBuiltinNode {
109+
@Specialization
110+
Object keys(PContextVarsContext self) {
111+
return factory().createContextIterator(self, PContextIterator.ItemKind.KEYS);
112+
}
113+
}
114+
115+
@Builtin(name = "values", declaresExplicitSelf = true, minNumOfPositionalArgs = 1)
116+
@GenerateNodeFactory
117+
public abstract static class Values extends PythonUnaryBuiltinNode {
118+
@Specialization
119+
Object values(PContextVarsContext self) {
120+
return factory().createContextIterator(self, PContextIterator.ItemKind.VALUES);
121+
}
122+
}
123+
124+
@Builtin(name = "items", declaresExplicitSelf = true, minNumOfPositionalArgs = 1)
125+
@GenerateNodeFactory
126+
public abstract static class Items extends PythonUnaryBuiltinNode {
127+
@Specialization
128+
Object items(PContextVarsContext self) {
129+
return factory().createContextIterator(self, PContextIterator.ItemKind.ITEMS);
130+
}
131+
}
132+
96133
@Builtin(name = "run", takesVarArgs = true, takesVarKeywordArgs = true, minNumOfPositionalArgs = 2, parameterNames = {"$self", "$callable"})
97134
@GenerateNodeFactory
98135
public abstract static class Run extends PythonBuiltinNode {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* Copyright (c) 2023, 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+
package com.oracle.graal.python.builtins.objects.contextvars;
42+
43+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
44+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
45+
46+
import java.util.List;
47+
48+
import com.oracle.graal.python.builtins.Builtin;
49+
import com.oracle.graal.python.builtins.CoreFunctions;
50+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
51+
import com.oracle.graal.python.builtins.PythonBuiltins;
52+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
53+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
54+
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
55+
import com.oracle.truffle.api.dsl.NodeFactory;
56+
import com.oracle.truffle.api.dsl.Specialization;
57+
58+
@CoreFunctions(extendClasses = PythonBuiltinClassType.ContextIterator)
59+
public class ContextIteratorBuiltins extends PythonBuiltins {
60+
@Override
61+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
62+
return ContextIteratorBuiltinsFactory.getFactories();
63+
}
64+
65+
@Builtin(name = J___ITER__, declaresExplicitSelf = true, minNumOfPositionalArgs = 1)
66+
@GenerateNodeFactory
67+
public abstract static class Iter extends PythonUnaryBuiltinNode {
68+
@Specialization
69+
static Object iter(PContextIterator self) {
70+
return self;
71+
}
72+
}
73+
74+
@Builtin(name = J___NEXT__, declaresExplicitSelf = true, minNumOfPositionalArgs = 1)
75+
@GenerateNodeFactory
76+
public abstract static class Next extends PythonUnaryBuiltinNode {
77+
@Specialization
78+
Object next(PContextIterator self) {
79+
Object next = self.next(factory());
80+
if (next == null) {
81+
throw raiseStopIteration();
82+
} else {
83+
return next;
84+
}
85+
}
86+
}
87+
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/Hamt.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ private static int computeSize(TreePart part) {
9191
throw CompilerDirectives.shouldNotReachHere("TreePart type is not handled");
9292
}
9393

94-
private final TreePart root;
94+
final TreePart root;
9595

9696
public Hamt() {
9797
this(null);
@@ -396,11 +396,11 @@ public Hamt without(Object key, int hash) {
396396
return new Hamt(partWithoutKey(root, key, hash, 0));
397397
}
398398

399-
private interface TreePart {
399+
interface TreePart {
400400
String dump(int indent);
401401
}
402402

403-
private static final class BitmapPart implements TreePart {
403+
static final class BitmapPart implements TreePart {
404404
final int bitmap;
405405
final TreePart[] elems;
406406

@@ -426,7 +426,7 @@ public String dump(int indent) {
426426
}
427427
}
428428

429-
private static final class ArrayPart implements TreePart {
429+
static final class ArrayPart implements TreePart {
430430
final TreePart[] elems;
431431

432432
public ArrayPart(TreePart[] elems) {
@@ -446,7 +446,7 @@ public String dump(int indent) {
446446
}
447447
}
448448

449-
private static final class CollisionPart implements TreePart {
449+
static final class CollisionPart implements TreePart {
450450
final int hash;
451451
final Entry[] elems;
452452

@@ -471,9 +471,9 @@ public String dump(int indent) {
471471

472472
@CompilerDirectives.ValueType
473473
public static final class Entry implements TreePart {
474-
final Object key;
474+
public final Object key;
475475
final int hash;
476-
final Object value;
476+
public final Object value;
477477

478478
public Entry(Object key, int hash, Object value) {
479479
this.key = key;

0 commit comments

Comments
 (0)