summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/Lookup.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-10-15 09:45:50 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-10-15 09:45:50 +0000
commite15dd966d523731101f70ccf768bba12435a0208 (patch)
treeae9cb828a24ded2585a41af3f21411523b47897d /Source/JavaScriptCore/runtime/Lookup.cpp
downloadWebKitGtk-tarball-e15dd966d523731101f70ccf768bba12435a0208.tar.gz
webkitgtk-2.10.2webkitgtk-2.10.2
Diffstat (limited to 'Source/JavaScriptCore/runtime/Lookup.cpp')
-rw-r--r--Source/JavaScriptCore/runtime/Lookup.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/runtime/Lookup.cpp b/Source/JavaScriptCore/runtime/Lookup.cpp
new file mode 100644
index 000000000..7df15b486
--- /dev/null
+++ b/Source/JavaScriptCore/runtime/Lookup.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include "config.h"
+#include "Lookup.h"
+
+#include "Executable.h"
+#include "GetterSetter.h"
+#include "JSFunction.h"
+#include "JSCInlines.h"
+
+namespace JSC {
+
+void reifyStaticAccessor(VM& vm, const HashTableValue& value, JSObject& thisObj, PropertyName propertyName)
+{
+ JSGlobalObject* globalObject = thisObj.globalObject();
+ GetterSetter* accessor = GetterSetter::create(vm, globalObject);
+ if (value.accessorGetter()) {
+ RefPtr<StringImpl> getterName = WTF::tryMakeString(ASCIILiteral("get "), String(*propertyName.publicName()));
+ if (!getterName)
+ return;
+ accessor->setGetter(vm, globalObject, JSFunction::create(vm, globalObject, 0, *getterName, value.accessorGetter()));
+ }
+ thisObj.putDirectNonIndexAccessor(vm, propertyName, accessor, value.attributes());
+}
+
+bool setUpStaticFunctionSlot(ExecState* exec, const HashTableValue* entry, JSObject* thisObj, PropertyName propertyName, PropertySlot& slot)
+{
+ ASSERT(thisObj->globalObject());
+ ASSERT(entry->attributes() & BuiltinOrFunctionOrAccessor);
+ VM& vm = exec->vm();
+ unsigned attributes;
+ bool isAccessor = entry->attributes() & Accessor;
+ PropertyOffset offset = thisObj->getDirectOffset(vm, propertyName, attributes);
+
+ if (!isValidOffset(offset)) {
+ // If a property is ever deleted from an object with a static table, then we reify
+ // all static functions at that time - after this we shouldn't be re-adding anything.
+ if (thisObj->staticFunctionsReified())
+ return false;
+
+ if (entry->attributes() & Builtin)
+ thisObj->putDirectBuiltinFunction(vm, thisObj->globalObject(), propertyName, entry->builtinGenerator()(vm), entry->attributes());
+ else if (entry->attributes() & Function) {
+ thisObj->putDirectNativeFunction(
+ vm, thisObj->globalObject(), propertyName, entry->functionLength(),
+ entry->function(), entry->intrinsic(), entry->attributes());
+ } else {
+ ASSERT(isAccessor);
+ reifyStaticAccessor(vm, *entry, *thisObj, propertyName);
+ }
+
+ offset = thisObj->getDirectOffset(vm, propertyName, attributes);
+ ASSERT(isValidOffset(offset));
+ }
+
+ if (isAccessor)
+ slot.setCacheableGetterSlot(thisObj, attributes, jsCast<GetterSetter*>(thisObj->getDirect(offset)), offset);
+ else
+ slot.setValue(thisObj, attributes, thisObj->getDirect(offset), offset);
+ return true;
+}
+
+} // namespace JSC