this repo has no description
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2#include "module-proxy-builtins.h"
3
4#include "attributedict.h"
5#include "builtins.h"
6#include "module-builtins.h"
7#include "type-builtins.h"
8
9namespace py {
10
11static const BuiltinAttribute kModuleProxyAttributes[] = {
12 {ID(__module_object__), RawModuleProxy::kModuleOffset},
13};
14
15void initializeModuleProxyType(Thread* thread) {
16 addBuiltinType(thread, ID(module_proxy), LayoutId::kModuleProxy,
17 /*superclass_id=*/LayoutId::kObject, kModuleProxyAttributes,
18 ModuleProxy::kSize, /*basetype=*/true);
19}
20
21RawObject METH(module_proxy, __contains__)(Thread* thread, Arguments args) {
22 HandleScope scope(thread);
23 Object self(&scope, args.get(0));
24 if (!self.isModuleProxy()) {
25 return thread->raiseRequiresType(self, ID(module_proxy));
26 }
27 ModuleProxy module_proxy(&scope, *self);
28 Object key(&scope, args.get(1));
29 key = attributeName(thread, key);
30 if (key.isErrorException()) return *key;
31 Module module(&scope, module_proxy.module());
32 DCHECK(module.moduleProxy() == self, "module.proxy != proxy.module");
33 Object result(&scope, moduleAt(module, key));
34 if (result.isErrorNotFound()) {
35 return Bool::falseObj();
36 }
37 return Bool::trueObj();
38}
39
40RawObject METH(module_proxy, __delitem__)(Thread* thread, Arguments args) {
41 HandleScope scope(thread);
42 Object self(&scope, args.get(0));
43 if (!self.isModuleProxy()) {
44 return thread->raiseRequiresType(self, ID(module_proxy));
45 }
46 ModuleProxy module_proxy(&scope, *self);
47 Object name(&scope, args.get(1));
48 name = attributeName(thread, name);
49 Module module(&scope, module_proxy.module());
50 DCHECK(module.moduleProxy() == module_proxy, "module.proxy != proxy.module");
51 Object result(&scope, moduleRemove(thread, module, name));
52 if (result.isErrorNotFound()) {
53 return thread->raiseWithFmt(LayoutId::kKeyError, "'%S'", &name);
54 }
55 return *result;
56}
57
58RawObject METH(module_proxy, __getitem__)(Thread* thread, Arguments args) {
59 HandleScope scope(thread);
60 Object self(&scope, args.get(0));
61 if (!self.isModuleProxy()) {
62 return thread->raiseRequiresType(self, ID(module_proxy));
63 }
64 ModuleProxy module_proxy(&scope, *self);
65 Object name(&scope, args.get(1));
66 name = attributeName(thread, name);
67 if (name.isErrorException()) return *name;
68 Module module(&scope, module_proxy.module());
69 DCHECK(module.moduleProxy() == module_proxy, "module.proxy != proxy.module");
70 Object result(&scope, moduleAt(module, name));
71 if (result.isErrorNotFound()) {
72 return thread->raiseWithFmt(LayoutId::kKeyError, "'%S'", &name);
73 }
74 return *result;
75}
76
77RawObject METH(module_proxy, __len__)(Thread* thread, Arguments args) {
78 HandleScope scope(thread);
79 Object self(&scope, args.get(0));
80 if (!self.isModuleProxy()) {
81 return thread->raiseRequiresType(self, ID(module_proxy));
82 }
83 ModuleProxy module_proxy(&scope, *self);
84 Module module(&scope, module_proxy.module());
85 DCHECK(module.moduleProxy() == module_proxy, "module.proxy != proxy.module");
86 return SmallInt::fromWord(moduleLen(thread, module));
87}
88
89RawObject METH(module_proxy, get)(Thread* thread, Arguments args) {
90 HandleScope scope(thread);
91 Object self(&scope, args.get(0));
92 if (!self.isModuleProxy()) {
93 return thread->raiseRequiresType(self, ID(module_proxy));
94 }
95 ModuleProxy module_proxy(&scope, *self);
96 Object name(&scope, args.get(1));
97 name = attributeName(thread, name);
98 if (name.isErrorException()) return *name;
99 Object default_obj(&scope, args.get(2));
100 Module module(&scope, module_proxy.module());
101 DCHECK(module.moduleProxy() == module_proxy, "module.proxy != proxy.module");
102 Object result(&scope, moduleAt(module, name));
103 if (result.isError()) {
104 return *default_obj;
105 }
106 return *result;
107}
108
109RawObject METH(module_proxy, pop)(Thread* thread, Arguments args) {
110 HandleScope scope(thread);
111 Object self(&scope, args.get(0));
112 if (!self.isModuleProxy()) {
113 return thread->raiseRequiresType(self, ID(module_proxy));
114 }
115 ModuleProxy module_proxy(&scope, *self);
116 Object name(&scope, args.get(1));
117 name = attributeName(thread, name);
118 if (name.isErrorException()) return *name;
119 Object default_obj(&scope, args.get(2));
120 Module module(&scope, module_proxy.module());
121 DCHECK(module.moduleProxy() == module_proxy, "module.proxy != proxy.module");
122 Object result(&scope, moduleAt(module, name));
123 if (result.isError()) {
124 if (default_obj.isUnbound()) {
125 return thread->raiseWithFmt(LayoutId::kKeyError, "'%S'", &name);
126 }
127 return *default_obj;
128 }
129 return moduleRemove(thread, module, name);
130}
131
132RawObject METH(module_proxy, setdefault)(Thread* thread, Arguments args) {
133 HandleScope scope(thread);
134 Object self(&scope, args.get(0));
135 if (!self.isModuleProxy()) {
136 return thread->raiseRequiresType(self, ID(module_proxy));
137 }
138 ModuleProxy module_proxy(&scope, *self);
139 Object name(&scope, args.get(1));
140 name = attributeName(thread, name);
141 if (name.isErrorException()) return *name;
142 Object default_obj(&scope, args.get(2));
143 Module module(&scope, module_proxy.module());
144 DCHECK(module.moduleProxy() == module_proxy, "module.proxy != proxy.module");
145 Object value(&scope, moduleAt(module, name));
146 if (value.isErrorNotFound()) {
147 value = *default_obj;
148 moduleAtPut(thread, module, name, value);
149 }
150 return *value;
151}
152
153} // namespace py