Skip to content

Commit cec8a16

Browse files
committed
[GR-40178] Fix and re-enable HPy tests.
PullRequest: graalpython/2428
2 parents 139a6f3 + 2d95940 commit cec8a16

File tree

8 files changed

+177
-10
lines changed

8 files changed

+177
-10
lines changed

graalpython/com.oracle.graal.python.cext/src/context.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,37 @@
3939
* SOFTWARE.
4040
*/
4141

42-
#include "Python.h"
42+
#include "capi.h"
4343

44+
UPCALL_ID(PyContextVar_New);
45+
PyObject *
46+
PyContextVar_New(const char *name, PyObject *def)
47+
{
48+
if (name == NULL) {
49+
return NULL;
50+
}
51+
return UPCALL_CEXT_O(_jls_PyContextVar_New, polyglot_from_string(name, SRC_CS), native_to_java(def));
52+
}
53+
54+
typedef PyObject *(*contextvar_get_fun_t)(PyObject *, PyObject *, void *);
55+
UPCALL_TYPED_ID(PyContextVar_Get, contextvar_get_fun_t);
4456
int
4557
PyContextVar_Get(PyObject *var, PyObject *default_value, PyObject **value)
4658
{
47-
PyErr_SetString(PyExc_SystemError, "PyContextVar_Get not implemented");
48-
return -1;
59+
static void *error_marker = &marker_struct;
60+
PyObject *res = _jls_PyContextVar_Get(native_to_java(var), native_to_java(default_value), error_marker);
61+
if ((void *)res == error_marker) {
62+
*value = NULL;
63+
return -1;
64+
}
65+
*value = res;
66+
return 0;
4967
}
5068

69+
UPCALL_ID(PyContextVar_Set);
5170
PyObject *
5271
PyContextVar_Set(PyObject *var, PyObject *value)
5372
{
54-
PyErr_SetString(PyExc_SystemError, "PyContextVar_Set not implemented");
55-
return NULL;
73+
return UPCALL_CEXT_O(_jls_PyContextVar_Set, native_to_java(var), native_to_java(value));
5674
}
5775

graalpython/com.oracle.graal.python.cext/src/errors.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,16 @@ PyObject* PyErr_SetFromErrno(PyObject* exc) {
212212
return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
213213
}
214214

215+
// taken from CPython "Python/errors.c"
216+
PyObject *
217+
PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
218+
{
219+
PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
220+
PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
221+
Py_XDECREF(name);
222+
return result;
223+
}
224+
215225
// taken from CPython "Python/errors.c"
216226
PyObject* PyErr_SetFromErrnoWithFilenameObject(PyObject* exc, PyObject* filenameObject) {
217227
return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);

graalpython/com.oracle.graal.python.cext/src/unicodeobject.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ PyObject * PyUnicode_FromWideChar(const wchar_t *u, Py_ssize_t size) {
488488

489489
static PyObject* _PyUnicode_FromUCS1(const Py_UCS1* u, Py_ssize_t size) {
490490
// CPython assumes latin1 when decoding an UCS1 array
491-
return polyglot_from_string((const char *) u, "ISO-8859-1");
491+
return to_sulong(polyglot_from_string((const char *) u, "ISO-8859-1"));
492492
}
493493

494494
static PyObject* _PyUnicode_FromUCS2(const Py_UCS2 *u, Py_ssize_t size) {
@@ -690,3 +690,14 @@ UPCALL_ID(PyUnicode_Split)
690690
PyObject* PyUnicode_Split(PyObject *s, PyObject *sep, Py_ssize_t maxsplit) {
691691
return UPCALL_CEXT_O(_jls_PyUnicode_Split, native_to_java(s), native_to_java(sep), maxsplit);
692692
}
693+
694+
// taken from CPython "Objects/unicodeobject.c"
695+
PyObject *
696+
PyUnicode_DecodeLatin1(const char *s,
697+
Py_ssize_t size,
698+
const char *errors)
699+
{
700+
/* Latin-1 is equivalent to the first 256 ordinals in Unicode. */
701+
return _PyUnicode_FromUCS1((const unsigned char*)s, size);
702+
}
703+

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
import com.oracle.graal.python.builtins.modules.cext.PythonCextClassBuiltins;
132132
import com.oracle.graal.python.builtins.modules.cext.PythonCextCodeBuiltins;
133133
import com.oracle.graal.python.builtins.modules.cext.PythonCextComplexBuiltins;
134+
import com.oracle.graal.python.builtins.modules.cext.PythonCextContextBuiltins;
134135
import com.oracle.graal.python.builtins.modules.cext.PythonCextDescrBuiltins;
135136
import com.oracle.graal.python.builtins.modules.cext.PythonCextDictBuiltins;
136137
import com.oracle.graal.python.builtins.modules.cext.PythonCextErrBuiltins;
@@ -528,6 +529,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
528529
new PythonCextCEvalBuiltins(),
529530
new PythonCextCodeBuiltins(),
530531
new PythonCextComplexBuiltins(),
532+
new PythonCextContextBuiltins(),
531533
new PythonCextClassBuiltins(),
532534
new PythonCextDescrBuiltins(),
533535
new PythonCextDictBuiltins(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
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+
package com.oracle.graal.python.builtins.modules.cext;
42+
43+
import java.util.List;
44+
45+
import com.oracle.graal.python.builtins.Builtin;
46+
import com.oracle.graal.python.builtins.CoreFunctions;
47+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
48+
import com.oracle.graal.python.builtins.PythonBuiltins;
49+
import com.oracle.graal.python.builtins.objects.PNone;
50+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
51+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
52+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToNewRefNode;
53+
import com.oracle.graal.python.builtins.objects.contextvars.PContextVar;
54+
import com.oracle.graal.python.nodes.ErrorMessages;
55+
import com.oracle.graal.python.nodes.call.CallNode;
56+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
57+
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
58+
import com.oracle.graal.python.runtime.PythonContext;
59+
import com.oracle.truffle.api.dsl.Cached;
60+
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
61+
import com.oracle.truffle.api.dsl.NodeFactory;
62+
import com.oracle.truffle.api.dsl.Specialization;
63+
import com.oracle.truffle.api.frame.VirtualFrame;
64+
import com.oracle.truffle.api.strings.TruffleString;
65+
66+
@CoreFunctions(extendsModule = PythonCextBuiltins.PYTHON_CEXT)
67+
@GenerateNodeFactory
68+
public final class PythonCextContextBuiltins extends PythonBuiltins {
69+
70+
@Override
71+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
72+
return PythonCextContextBuiltinsFactory.getFactories();
73+
}
74+
75+
@Builtin(name = "PyContextVar_New", minNumOfPositionalArgs = 2)
76+
@GenerateNodeFactory
77+
public abstract static class PyContextVarNewNode extends PythonBuiltinNode {
78+
@Specialization
79+
static Object doGeneric(VirtualFrame frame, TruffleString name, Object def,
80+
@Cached CallNode callContextvar) {
81+
return callContextvar.execute(frame, PythonBuiltinClassType.ContextVar, name, def);
82+
}
83+
}
84+
85+
// directly called without landing function
86+
@Builtin(name = "PyContextVar_Get", minNumOfPositionalArgs = 3)
87+
@GenerateNodeFactory
88+
public abstract static class PyContextVarGetNode extends PythonBuiltinNode {
89+
@Specialization
90+
Object doGeneric(VirtualFrame frame, Object varObj, Object defObj, Object marker,
91+
@Cached AsPythonObjectNode asPythonObjectNode,
92+
@Cached ToNewRefNode toNewRefNode,
93+
@Cached PRaiseNativeNode raiseNode) {
94+
Object var = asPythonObjectNode.execute(varObj);
95+
Object def = asPythonObjectNode.execute(defObj);
96+
if (!(var instanceof PContextVar)) {
97+
return raiseNode.raise(frame, marker, PythonBuiltinClassType.TypeError, ErrorMessages.INSTANCE_OF_CONTEXTVAR_EXPECTED);
98+
}
99+
PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage());
100+
Object result = ((PContextVar) var).getValue(threadState);
101+
if (result == null) {
102+
if (def == PNone.NO_VALUE) {
103+
def = ((PContextVar) var).getDefault();
104+
if (def == PContextVar.NO_DEFAULT) {
105+
def = PNone.NO_VALUE;
106+
}
107+
}
108+
result = def;
109+
}
110+
return toNewRefNode.execute(result);
111+
}
112+
}
113+
114+
@Builtin(name = "PyContextVar_Set", minNumOfPositionalArgs = 2)
115+
@GenerateNodeFactory
116+
public abstract static class PyContextVarSetNode extends PythonBuiltinNode {
117+
@Specialization
118+
Object doGeneric(VirtualFrame frame, Object var, Object val,
119+
@Cached PRaiseNativeNode raiseNode) {
120+
if (!(var instanceof PContextVar)) {
121+
return raiseNode.raise(frame, getContext().getNativeNull(), PythonBuiltinClassType.TypeError, ErrorMessages.INSTANCE_OF_CONTEXTVAR_EXPECTED);
122+
}
123+
PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage());
124+
PContextVar pvar = (PContextVar) var;
125+
Object oldValue = pvar.getValue(threadState);
126+
pvar.setValue(threadState, val);
127+
return factory().createContextVarsToken(pvar, oldValue);
128+
}
129+
}
130+
}

graalpython/lib-graalpython/modules/hpy/test/test_hpycontextvar.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727

2828
class TestContextVar(HPyTest):
29-
@pytest.mark.skip(reason="GR-40178")
3029
def test_ContextVar_basics(self):
3130
mod = self.make_module("""
3231
HPyDef_METH(create_ctxvar, "create_ctxvar", create_ctxvar_impl, HPyFunc_O)

graalpython/lib-graalpython/modules/hpy/test/test_hpyerr.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ def test_HPyErr_SetFromErrno(self):
170170

171171
assert err.value.errno == errno.EINVAL
172172

173-
@pytest.mark.skip(reason="GR-40178")
174173
def test_HPyErr_SetFromErrnoWithFilenameObjects(self):
175174
import pytest
176175
import errno
@@ -208,7 +207,6 @@ def test_HPyErr_SetFromErrnoWithFilenameObjects(self):
208207
assert err.value.filename == file1
209208
assert err.value.filename2 == file2
210209

211-
@pytest.mark.skip(reason="GR-40178")
212210
def test_HPyErr_SetFromErrnoWithFilename(self):
213211
import pytest
214212
import errno

graalpython/lib-graalpython/modules/hpy/test/test_hpyunicode.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,6 @@ def test_AsUTF8AndSize(self):
163163
assert mod.g(b'A'.decode('utf-8')) == ord('A')
164164
assert mod.g(b'A\0'.decode('utf-8')) == ord('A')
165165

166-
@pytest.mark.skip(reason="GR-40178")
167166
def test_DecodeLatin1(self):
168167
mod = self.make_module("""
169168
HPyDef_METH(f, "f", f_impl, HPyFunc_O)

0 commit comments

Comments
 (0)