Commit 45b078d5 authored by Kevin Modzelewski's avatar Kevin Modzelewski

Merge pull request #505 from undingen/cheetah

Handle map(None,...), exec with module.__dict__ as globals
parents 933834be 9a40c840
......@@ -1458,23 +1458,58 @@ extern "C" Py_ssize_t PyMapping_Size(PyObject* o) noexcept {
}
extern "C" int PyMapping_HasKeyString(PyObject* o, char* key) noexcept {
fatalOrError(PyExc_NotImplementedError, "unimplemented");
return -1;
PyObject* v;
v = PyMapping_GetItemString(o, key);
if (v) {
Py_DECREF(v);
return 1;
}
PyErr_Clear();
return 0;
}
extern "C" int PyMapping_HasKey(PyObject* o, PyObject* key) noexcept {
fatalOrError(PyExc_NotImplementedError, "unimplemented");
return -1;
PyObject* v;
v = PyObject_GetItem(o, key);
if (v) {
Py_DECREF(v);
return 1;
}
PyErr_Clear();
return 0;
}
extern "C" PyObject* PyMapping_GetItemString(PyObject* o, char* key) noexcept {
fatalOrError(PyExc_NotImplementedError, "unimplemented");
return nullptr;
PyObject* okey, *r;
if (key == NULL)
return null_error();
okey = PyString_FromString(key);
if (okey == NULL)
return NULL;
r = PyObject_GetItem(o, okey);
Py_DECREF(okey);
return r;
}
extern "C" int PyMapping_SetItemString(PyObject* o, char* key, PyObject* v) noexcept {
fatalOrError(PyExc_NotImplementedError, "unimplemented");
return -1;
extern "C" int PyMapping_SetItemString(PyObject* o, char* key, PyObject* value) noexcept {
PyObject* okey;
int r;
if (key == NULL) {
null_error();
return -1;
}
okey = PyString_FromString(key);
if (okey == NULL)
return -1;
r = PyObject_SetItem(o, okey, value);
Py_DECREF(okey);
return r;
}
extern "C" int PyNumber_Check(PyObject* obj) noexcept {
......
......@@ -514,6 +514,9 @@ Box* eval(Box* boxedCode, Box* globals, Box* locals) {
if (globals && globals->cls == attrwrapper_cls && unwrapAttrWrapper(globals) == module)
globals = module;
if (globals->cls == attrwrapper_cls)
globals = unwrapAttrWrapper(globals);
assert(globals && (globals->cls == module_cls || globals->cls == dict_cls));
if (boxedCode->cls == unicode_cls) {
......@@ -569,6 +572,9 @@ Box* exec(Box* boxedCode, Box* globals, Box* locals) {
if (globals && globals->cls == attrwrapper_cls && unwrapAttrWrapper(globals) == module)
globals = module;
if (globals->cls == attrwrapper_cls)
globals = unwrapAttrWrapper(globals);
assert(globals && (globals->cls == module_cls || globals->cls == dict_cls));
if (globals) {
......
......@@ -478,8 +478,14 @@ Box* hasattr(Box* obj, Box* _str) {
Box* map2(Box* f, Box* container) {
Box* rtn = new BoxedList();
bool use_identity_func = f == None;
for (Box* e : container->pyElements()) {
listAppendInternal(rtn, runtimeCall(f, ArgPassSpec(1), e, NULL, NULL, NULL, NULL));
Box* val;
if (use_identity_func)
val = e;
else
val = runtimeCall(f, ArgPassSpec(1), e, NULL, NULL, NULL, NULL);
listAppendInternal(rtn, val);
}
return rtn;
}
......@@ -505,6 +511,7 @@ Box* map(Box* f, BoxedTuple* args) {
assert(args_it.size() == num_iterable);
assert(args_end.size() == num_iterable);
bool use_identity_func = f == None;
Box* rtn = new BoxedList();
std::vector<Box*, StlCompatAllocator<Box*>> current_val(num_iterable);
while (true) {
......@@ -521,9 +528,14 @@ Box* map(Box* f, BoxedTuple* args) {
if (num_done == num_iterable)
break;
auto v = getTupleFromArgsArray(&current_val[0], num_iterable);
listAppendInternal(rtn, runtimeCall(f, ArgPassSpec(num_iterable), std::get<0>(v), std::get<1>(v),
std::get<2>(v), std::get<3>(v), NULL));
Box* entry;
if (!use_identity_func) {
auto v = getTupleFromArgsArray(&current_val[0], num_iterable);
entry = runtimeCall(f, ArgPassSpec(num_iterable), std::get<0>(v), std::get<1>(v), std::get<2>(v),
std::get<3>(v), NULL);
} else
entry = BoxedTuple::create(num_iterable, &current_val[0]);
listAppendInternal(rtn, entry);
for (int i = 0; i < num_iterable; ++i) {
if (args_it[i] != args_end[i])
......@@ -762,6 +774,19 @@ extern "C" PyObject* PyEval_GetLocals(void) noexcept {
}
}
extern "C" PyObject* PyEval_GetGlobals(void) noexcept {
try {
return globals();
} catch (ExcInfo e) {
setCAPIException(e);
return NULL;
}
}
extern "C" PyObject* PyEval_GetBuiltins(void) noexcept {
return builtins_module;
}
Box* divmod(Box* lhs, Box* rhs) {
return binopInternal(lhs, rhs, AST_TYPE::DivMod, false, NULL);
}
......
......@@ -149,3 +149,10 @@ try:
raise Exception()
except NameError as e:
print e
import types
g = types.ModuleType("TestMod1")
l = types.ModuleType("TestMod2")
exec ("global a; a=1; print a; b=2", g.__dict__, l.__dict__)
print g.a
print l.b
......@@ -13,3 +13,5 @@ def f(*args):
print map(f, range(10))
print map(f, range(9), range(20, 31), range(30, 40), range(40, 50), range(60, 70))
print map(None, range(10))
print map(None, range(9), range(20, 31), range(30, 40), range(40, 50), range(60, 70))
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment