this repo has no description
at trunk 153 lines 5.4 kB view raw
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