Diff
Modified: trunk/Source/_javascript_Core/CMakeLists.txt (187530 => 187531)
--- trunk/Source/_javascript_Core/CMakeLists.txt 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/CMakeLists.txt 2015-07-29 00:55:17 UTC (rev 187531)
@@ -411,6 +411,8 @@
tools/JSDollarVMPrototype.cpp
wasm/JSWASMModule.cpp
+ wasm/WASMModuleParser.cpp
+ wasm/WASMReader.cpp
yarr/RegularExpression.cpp
yarr/YarrCanonicalizeUCS2.cpp
Modified: trunk/Source/_javascript_Core/ChangeLog (187530 => 187531)
--- trunk/Source/_javascript_Core/ChangeLog 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-07-29 00:55:17 UTC (rev 187531)
@@ -1,3 +1,45 @@
+2015-07-28 Sukolsak Sakshuwong <[email protected]>
+
+ Implement WebAssembly module parser
+ https://bugs.webkit.org/show_bug.cgi?id=147293
+
+ Reviewed by Geoffrey Garen.
+
+ Implement WebAssembly module parser for WebAssembly files produced by pack-asmjs
+ <https://github.com/WebAssembly/polyfill-prototype-1>. This patch only checks
+ the magic number at the beginning of the files. Parsing of the rest will be
+ implemented in a subsequent patch.
+
+ * CMakeLists.txt:
+ * _javascript_Core.vcxproj/_javascript_Core.vcxproj:
+ * _javascript_Core.vcxproj/_javascript_Core.vcxproj.filters:
+ * _javascript_Core.xcodeproj/project.pbxproj:
+ * jsc.cpp:
+ (GlobalObject::finishCreation):
+ (functionLoadWebAssembly):
+ * parser/SourceProvider.h:
+ (JSC::WebAssemblySourceProvider::create):
+ (JSC::WebAssemblySourceProvider::data):
+ (JSC::WebAssemblySourceProvider::WebAssemblySourceProvider):
+ * runtime/JSGlobalObject.cpp:
+ (JSC::JSGlobalObject::init):
+ (JSC::JSGlobalObject::visitChildren):
+ * runtime/JSGlobalObject.h:
+ (JSC::JSGlobalObject::wasmModuleStructure):
+ * wasm/WASMMagicNumber.h: Added.
+ * wasm/WASMModuleParser.cpp: Added.
+ (JSC::WASMModuleParser::WASMModuleParser):
+ (JSC::WASMModuleParser::parse):
+ (JSC::WASMModuleParser::parseModule):
+ (JSC::parseWebAssembly):
+ * wasm/WASMModuleParser.h: Added.
+ * wasm/WASMReader.cpp: Added.
+ (JSC::WASMReader::readUnsignedInt32):
+ (JSC::WASMReader::readFloat):
+ (JSC::WASMReader::readDouble):
+ * wasm/WASMReader.h: Added.
+ (JSC::WASMReader::WASMReader):
+
2015-07-28 Yusuke Suzuki <[email protected]>
[ES6] Add ENABLE_ES6_MODULES compile time flag with the default value "false"
Modified: trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj (187530 => 187531)
--- trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj 2015-07-29 00:55:17 UTC (rev 187531)
@@ -868,6 +868,8 @@
<ClCompile Include="..\tools\JSDollarVM.cpp" />
<ClCompile Include="..\tools\JSDollarVMPrototype.cpp" />
<ClCompile Include="..\wasm\JSWASMModule.cpp" />
+ <ClCompile Include="..\wasm\WASMModuleParser.cpp" />
+ <ClCompile Include="..\wasm\WASMReader.cpp" />
<ClCompile Include="..\yarr\RegularExpression.cpp" />
<ClCompile Include="..\yarr\YarrCanonicalizeUCS2.cpp" />
<ClCompile Include="..\yarr\YarrInterpreter.cpp" />
@@ -1734,6 +1736,9 @@
<ClInclude Include="..\tools\ProfileTreeNode.h" />
<ClInclude Include="..\tools\TieredMMapArray.h" />
<ClInclude Include="..\wasm\JSWASMModule.h" />
+ <ClInclude Include="..\wasm\WASMMagicNumber.h" />
+ <ClInclude Include="..\wasm\WASMModuleParser.h" />
+ <ClInclude Include="..\wasm\WASMReader.h" />
<ClInclude Include="..\yarr\RegularExpression.h" />
<ClInclude Include="..\yarr\Yarr.h" />
<ClInclude Include="..\yarr\YarrCanonicalizeUCS2.h" />
Modified: trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj.filters (187530 => 187531)
--- trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj.filters 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj.filters 2015-07-29 00:55:17 UTC (rev 187531)
@@ -1797,6 +1797,12 @@
<ClCompile Include="..\wasm\JSWASMModule.cpp">
<Filter>wasm</Filter>
</ClCompile>
+ <ClCompile Include="..\wasm\WASMModuleParser.cpp">
+ <Filter>wasm</Filter>
+ </ClCompile>
+ <ClCompile Include="..\wasm\WASMReader.cpp">
+ <Filter>wasm</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\API\APICallbackFunction.h">
@@ -4301,6 +4307,15 @@
<ClInclude Include="..\wasm\JSWASMModule.h">
<Filter>wasm</Filter>
</ClInclude>
+ <ClInclude Include="..\wasm\WASMMagicNumber.h">
+ <Filter>wasm</Filter>
+ </ClInclude>
+ <ClInclude Include="..\wasm\WASMModuleParser.h">
+ <Filter>wasm</Filter>
+ </ClInclude>
+ <ClInclude Include="..\wasm\WASMReader.h">
+ <Filter>wasm</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="_javascript_CorePreLink.cmd" />
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (187530 => 187531)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2015-07-29 00:55:17 UTC (rev 187531)
@@ -1021,6 +1021,11 @@
70ECA6091AFDBEA200449739 /* TemplateRegistryKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 70ECA6041AFDBEA200449739 /* TemplateRegistryKey.h */; settings = {ATTRIBUTES = (Private, ); }; };
79EE0BFF1B4AFB85000385C9 /* VariableEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 79EE0BFD1B4AFB85000385C9 /* VariableEnvironment.cpp */; };
79EE0C001B4AFB85000385C9 /* VariableEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = 79EE0BFE1B4AFB85000385C9 /* VariableEnvironment.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 7B39F76D1B62DE2E00360FB4 /* WASMModuleParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7B39F7691B62DE2200360FB4 /* WASMModuleParser.cpp */; };
+ 7B39F76E1B62DE3200360FB4 /* WASMModuleParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B39F76A1B62DE2200360FB4 /* WASMModuleParser.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 7B39F7701B62DE3200360FB4 /* WASMReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B39F76C1B62DE2200360FB4 /* WASMReader.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 7B39F7721B63574D00360FB4 /* WASMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7B39F7711B63574B00360FB4 /* WASMReader.cpp */; };
+ 7B7A5E271B68288C0027CAD0 /* WASMMagicNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B7A5E261B6828840027CAD0 /* WASMMagicNumber.h */; settings = {ATTRIBUTES = (Private, ); }; };
7B98D1361B60CD5F0023B1A4 /* JSWASMModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7B98D1341B60CD5A0023B1A4 /* JSWASMModule.cpp */; };
7B98D1371B60CD620023B1A4 /* JSWASMModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B98D1351B60CD5A0023B1A4 /* JSWASMModule.h */; settings = {ATTRIBUTES = (Private, ); }; };
7C008CDA187124BB00955C24 /* JSPromiseDeferred.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C008CD8187124BB00955C24 /* JSPromiseDeferred.cpp */; };
@@ -2769,6 +2774,11 @@
70ECA6041AFDBEA200449739 /* TemplateRegistryKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TemplateRegistryKey.h; sourceTree = "<group>"; };
79EE0BFD1B4AFB85000385C9 /* VariableEnvironment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VariableEnvironment.cpp; sourceTree = "<group>"; };
79EE0BFE1B4AFB85000385C9 /* VariableEnvironment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariableEnvironment.h; sourceTree = "<group>"; };
+ 7B39F7691B62DE2200360FB4 /* WASMModuleParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WASMModuleParser.cpp; sourceTree = "<group>"; };
+ 7B39F76A1B62DE2200360FB4 /* WASMModuleParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WASMModuleParser.h; sourceTree = "<group>"; };
+ 7B39F76C1B62DE2200360FB4 /* WASMReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WASMReader.h; sourceTree = "<group>"; };
+ 7B39F7711B63574B00360FB4 /* WASMReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WASMReader.cpp; sourceTree = "<group>"; };
+ 7B7A5E261B6828840027CAD0 /* WASMMagicNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WASMMagicNumber.h; sourceTree = "<group>"; };
7B98D1341B60CD5A0023B1A4 /* JSWASMModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWASMModule.cpp; sourceTree = "<group>"; };
7B98D1351B60CD5A0023B1A4 /* JSWASMModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWASMModule.h; sourceTree = "<group>"; };
7C008CD8187124BB00955C24 /* JSPromiseDeferred.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseDeferred.cpp; sourceTree = "<group>"; };
@@ -4307,6 +4317,11 @@
children = (
7B98D1341B60CD5A0023B1A4 /* JSWASMModule.cpp */,
7B98D1351B60CD5A0023B1A4 /* JSWASMModule.h */,
+ 7B7A5E261B6828840027CAD0 /* WASMMagicNumber.h */,
+ 7B39F7691B62DE2200360FB4 /* WASMModuleParser.cpp */,
+ 7B39F76A1B62DE2200360FB4 /* WASMModuleParser.h */,
+ 7B39F7711B63574B00360FB4 /* WASMReader.cpp */,
+ 7B39F76C1B62DE2200360FB4 /* WASMReader.h */,
);
path = wasm;
sourceTree = "<group>";
@@ -6214,6 +6229,7 @@
0F5A1274192D9FDF008764A3 /* DFGDoesGC.h in Headers */,
0F2B66F517B6B5AB00A7AE3F /* JSGenericTypedArrayViewPrototype.h in Headers */,
0F2B66F617B6B5AB00A7AE3F /* JSGenericTypedArrayViewPrototypeInlines.h in Headers */,
+ 7B39F76E1B62DE3200360FB4 /* WASMModuleParser.h in Headers */,
BC18C4210E16F5CD00B34460 /* JSGlobalObject.h in Headers */,
A5FD0086189B1B7E00633231 /* JSGlobalObjectConsoleAgent.h in Headers */,
A59455931824744700CC3843 /* JSGlobalObjectDebuggable.h in Headers */,
@@ -6425,6 +6441,7 @@
BC18C4540E16F5CD00B34460 /* PropertyNameArray.h in Headers */,
0FF7168C15A3B235008F5DAA /* PropertyOffset.h in Headers */,
A785F6BC18C553FE00F10626 /* SpillRegistersMode.h in Headers */,
+ 7B7A5E271B68288C0027CAD0 /* WASMMagicNumber.h in Headers */,
BC18C4550E16F5CD00B34460 /* PropertySlot.h in Headers */,
0FB7F39C15ED8E4600F167B2 /* PropertyStorage.h in Headers */,
0F6FC751196110A800E1D02D /* ComplexGetStatus.h in Headers */,
@@ -6558,6 +6575,7 @@
0F5F08CF146C7633000472A9 /* UnconditionalFinalizer.h in Headers */,
A7B601821639FD2A00372BA3 /* UnlinkedCodeBlock.h in Headers */,
0F2E892C16D028AD009E4FD2 /* UnusedPointer.h in Headers */,
+ 7B39F7701B62DE3200360FB4 /* WASMReader.h in Headers */,
0F963B3813FC6FE90002D9B2 /* ValueProfile.h in Headers */,
0F426A481460CBB300131F8F /* ValueRecovery.h in Headers */,
0F9C5E5F18E35F5E00D431C3 /* FTLDWARFRegister.h in Headers */,
@@ -7192,6 +7210,7 @@
0F9D339617FFC4E60073C2BC /* DFGFlushedAt.cpp in Sources */,
0F9D36941AE9CC33000D4DFB /* DFGCleanUpPhase.cpp in Sources */,
A7D89CF717A0B8CC00773AD8 /* DFGFlushFormat.cpp in Sources */,
+ 7B39F76D1B62DE2E00360FB4 /* WASMModuleParser.cpp in Sources */,
0F3A1BF91A9ECB7D000DE01A /* DFGPutStackSinkingPhase.cpp in Sources */,
86EC9DC71328DF82002B2AD7 /* DFGGraph.cpp in Sources */,
0F2FCCF918A60070001A27F8 /* DFGGraphSafepoint.cpp in Sources */,
@@ -7606,6 +7625,7 @@
0F24E55017EE274900ABB217 /* Repatch.cpp in Sources */,
62D2D38F1ADF103F000206C1 /* FunctionRareData.cpp in Sources */,
0F7700921402FF3C0078EB39 /* SamplingCounter.cpp in Sources */,
+ 7B39F7721B63574D00360FB4 /* WASMReader.cpp in Sources */,
1429D8850ED21C3D00B89619 /* SamplingTool.cpp in Sources */,
70EC0EC61AA0D7DA00B6AAFA /* StringIteratorPrototype.cpp in Sources */,
A5FD0067189AFE9C00633231 /* ScriptArguments.cpp in Sources */,
Modified: trunk/Source/_javascript_Core/jsc.cpp (187530 => 187531)
--- trunk/Source/_javascript_Core/jsc.cpp 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/jsc.cpp 2015-07-29 00:55:17 UTC (rev 187531)
@@ -43,6 +43,7 @@
#include "JSONObject.h"
#include "JSProxy.h"
#include "JSString.h"
+#include "JSWASMModule.h"
#include "ProfilerDatabase.h"
#include "SamplingTool.h"
#include "StackVisitor.h"
@@ -50,6 +51,7 @@
#include "StructureRareDataInlines.h"
#include "TestRunnerUtils.h"
#include "TypeProfilerLog.h"
+#include "WASMModuleParser.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
@@ -492,6 +494,9 @@
static EncodedJSValue JSC_HOST_CALL functionDumpBasicBlockExecutionRanges(ExecState*);
static EncodedJSValue JSC_HOST_CALL functionHasBasicBlockExecuted(ExecState*);
static EncodedJSValue JSC_HOST_CALL functionEnableExceptionFuzz(ExecState*);
+#if ENABLE(WEBASSEMBLY)
+static EncodedJSValue JSC_HOST_CALL functionLoadWebAssembly(ExecState*);
+#endif
#if ENABLE(SAMPLING_FLAGS)
static EncodedJSValue JSC_HOST_CALL functionSetSamplingFlags(ExecState*);
@@ -655,6 +660,10 @@
addFunction(vm, "enableExceptionFuzz", functionEnableExceptionFuzz, 0);
+#if ENABLE(WEBASSEMBLY)
+ addFunction(vm, "loadWebAssembly", functionLoadWebAssembly, 1);
+#endif
+
JSArray* array = constructEmptyArray(globalExec(), 0);
for (size_t i = 0; i < arguments.size(); ++i)
array->putDirectIndex(globalExec(), i, jsString(globalExec(), arguments[i]));
@@ -1183,6 +1192,23 @@
return JSValue::encode(jsUndefined());
}
+#if ENABLE(WEBASSEMBLY)
+EncodedJSValue JSC_HOST_CALL functionLoadWebAssembly(ExecState* exec)
+{
+ String fileName = exec->argument(0).toString(exec)->value(exec);
+ Vector<char> buffer;
+ if (!fillBufferWithContentsOfFile(fileName, buffer))
+ return JSValue::encode(exec->vm().throwException(exec, createError(exec, ASCIILiteral("Could not open file."))));
+ RefPtr<WebAssemblySourceProvider> sourceProvider = WebAssemblySourceProvider::create(reinterpret_cast<Vector<uint8_t>&>(buffer), fileName);
+ SourceCode source(sourceProvider);
+ String errorMessage;
+ JSWASMModule* module = parseWebAssembly(exec, source, errorMessage);
+ if (!module)
+ return JSValue::encode(exec->vm().throwException(exec, createSyntaxError(exec, errorMessage)));
+ return JSValue::encode(module);
+}
+#endif
+
// Use SEH for Release builds only to get rid of the crash report dialog
// (luckily the same tests fail in Release and Debug builds so far). Need to
// be in a separate main function because the jscmain function requires object
Modified: trunk/Source/_javascript_Core/parser/SourceProvider.h (187530 => 187531)
--- trunk/Source/_javascript_Core/parser/SourceProvider.h 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/parser/SourceProvider.h 2015-07-29 00:55:17 UTC (rev 187531)
@@ -94,6 +94,37 @@
String m_source;
};
+#if ENABLE(WEBASSEMBLY)
+ class WebAssemblySourceProvider : public SourceProvider {
+ public:
+ static Ref<WebAssemblySourceProvider> create(const Vector<uint8_t>& data, const String& url)
+ {
+ return adoptRef(*new WebAssemblySourceProvider(data, url));
+ }
+
+ virtual const String& source() const override
+ {
+ return m_source;
+ }
+
+ const Vector<uint8_t>& data() const
+ {
+ return m_data;
+ }
+
+ private:
+ WebAssemblySourceProvider(const Vector<uint8_t>& data, const String& url)
+ : SourceProvider(url, TextPosition::minimumPosition())
+ , m_source("[WebAssembly source]")
+ , m_data(data)
+ {
+ }
+
+ String m_source;
+ Vector<uint8_t> m_data;
+ };
+#endif
+
} // namespace JSC
#endif // SourceProvider_h
Modified: trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp (187530 => 187531)
--- trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp 2015-07-29 00:55:17 UTC (rev 187531)
@@ -92,6 +92,7 @@
#include "JSTypedArrayConstructors.h"
#include "JSTypedArrayPrototypes.h"
#include "JSTypedArrays.h"
+#include "JSWASMModule.h"
#include "JSWeakMap.h"
#include "JSWeakSet.h"
#include "JSWithScope.h"
@@ -340,6 +341,10 @@
m_promisePrototype.set(vm, this, JSPromisePrototype::create(exec, this, JSPromisePrototype::createStructure(vm, this, m_objectPrototype.get())));
m_promiseStructure.set(vm, this, JSPromise::createStructure(vm, this, m_promisePrototype.get()));
+#if ENABLE(WEBASSEMBLY)
+ m_wasmModuleStructure.set(vm, this, JSWASMModule::createStructure(vm, this));
+#endif
+
m_parseIntFunction.set(vm, this, JSFunction::create(vm, this, 2, vm.propertyNames->parseInt.string(), globalFuncParseInt, NoIntrinsic));
putDirectWithoutTransition(vm, vm.propertyNames->parseInt, m_parseIntFunction.get(), DontEnum | Function);
@@ -801,6 +806,9 @@
visitor.append(&thisObject->m_dollarVMStructure);
visitor.append(&thisObject->m_internalFunctionStructure);
visitor.append(&thisObject->m_promiseStructure);
+#if ENABLE(WEBASSEMBLY)
+ visitor.append(&thisObject->m_wasmModuleStructure);
+#endif
#define VISIT_SIMPLE_TYPE(CapitalName, lowerName, properName, instanceType, jsName) \
visitor.append(&thisObject->m_ ## lowerName ## Prototype); \
Modified: trunk/Source/_javascript_Core/runtime/JSGlobalObject.h (187530 => 187531)
--- trunk/Source/_javascript_Core/runtime/JSGlobalObject.h 2015-07-29 00:44:14 UTC (rev 187530)
+++ trunk/Source/_javascript_Core/runtime/JSGlobalObject.h 2015-07-29 00:55:17 UTC (rev 187531)
@@ -243,6 +243,9 @@
WriteBarrier<Structure> m_iteratorResultStructure;
WriteBarrier<Structure> m_regExpMatchesArrayStructure;
WriteBarrier<Structure> m_promiseStructure;
+#if ENABLE(WEBASSEMBLY)
+ WriteBarrier<Structure> m_wasmModuleStructure;
+#endif
#define DEFINE_STORAGE_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
WriteBarrier<capitalName ## Prototype> m_ ## lowerName ## Prototype; \
@@ -475,6 +478,9 @@
static ptrdiff_t iteratorResultStructureOffset() { return OBJECT_OFFSETOF(JSGlobalObject, m_iteratorResultStructure); }
Structure* regExpMatchesArrayStructure() const { return m_regExpMatchesArrayStructure.get(); }
Structure* promiseStructure() const { return m_promiseStructure.get(); }
+#if ENABLE(WEBASSEMBLY)
+ Structure* wasmModuleStructure() const { return m_wasmModuleStructure.get(); }
+#endif
JS_EXPORT_PRIVATE void setRemoteDebuggingEnabled(bool);
JS_EXPORT_PRIVATE bool remoteDebuggingEnabled() const;
Added: trunk/Source/_javascript_Core/wasm/WASMMagicNumber.h (0 => 187531)
--- trunk/Source/_javascript_Core/wasm/WASMMagicNumber.h (rev 0)
+++ trunk/Source/_javascript_Core/wasm/WASMMagicNumber.h 2015-07-29 00:55:17 UTC (rev 187531)
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WASMMagicNumber_h
+#define WASMMagicNumber_h
+
+#if ENABLE(WEBASSEMBLY)
+
+namespace JSC {
+
+static const uint32_t wasmMagicNumber = 0x6d736177;
+
+} // namespace JSC
+
+#endif // ENABLE(WEBASSEMBLY)
+
+#endif // WASMMagicNumber_h
Added: trunk/Source/_javascript_Core/wasm/WASMModuleParser.cpp (0 => 187531)
--- trunk/Source/_javascript_Core/wasm/WASMModuleParser.cpp (rev 0)
+++ trunk/Source/_javascript_Core/wasm/WASMModuleParser.cpp 2015-07-29 00:55:17 UTC (rev 187531)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WASMModuleParser.h"
+
+#if ENABLE(WEBASSEMBLY)
+
+#include "JSCInlines.h"
+#include "JSWASMModule.h"
+#include "WASMMagicNumber.h"
+
+#define FAIL_WITH_MESSAGE(errorMessage) do { m_errorMessage = errorMessage; return false; } while (0)
+#define READ_UNSIGNED_INT32_OR_FAIL(x, errorMessage) do { if (!m_reader.readUnsignedInt32(x)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
+#define READ_FLOAT_OR_FAIL(x, errorMessage) do { if (!m_reader.readFloat(x)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
+#define READ_DOUBLE_OR_FAIL(x, errorMessage) do { if (!m_reader.readDouble(x)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
+#define FAIL_IF_FALSE(condition, errorMessage) do { if (!(condition)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
+
+namespace JSC {
+
+WASMModuleParser::WASMModuleParser(const SourceCode& source)
+ : m_reader(static_cast<WebAssemblySourceProvider*>(source.provider())->data())
+{
+}
+
+JSWASMModule* WASMModuleParser::parse(VM& vm, JSGlobalObject* globalObject, String& errorMessage)
+{
+ JSWASMModule* module = JSWASMModule::create(vm, globalObject->wasmModuleStructure());
+ parseModule();
+ if (!m_errorMessage.isNull()) {
+ errorMessage = m_errorMessage;
+ return nullptr;
+ }
+ return module;
+}
+
+bool WASMModuleParser::parseModule()
+{
+ uint32_t magicNumber;
+ READ_UNSIGNED_INT32_OR_FAIL(magicNumber, "Cannot read the magic number.");
+ FAIL_IF_FALSE(magicNumber == wasmMagicNumber, "The magic number is incorrect.");
+
+ // TODO: parse the rest
+
+ return true;
+}
+
+JSWASMModule* parseWebAssembly(ExecState* exec, const SourceCode& source, String& errorMessage)
+{
+ WASMModuleParser WASMModuleParser(source);
+ return WASMModuleParser.parse(exec->vm(), exec->lexicalGlobalObject(), errorMessage);
+}
+
+} // namespace JSC
+
+#endif // ENABLE(WEBASSEMBLY)
Added: trunk/Source/_javascript_Core/wasm/WASMModuleParser.h (0 => 187531)
--- trunk/Source/_javascript_Core/wasm/WASMModuleParser.h (rev 0)
+++ trunk/Source/_javascript_Core/wasm/WASMModuleParser.h 2015-07-29 00:55:17 UTC (rev 187531)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WASMModuleParser_h
+#define WASMModuleParser_h
+
+#if ENABLE(WEBASSEMBLY)
+
+#include "WASMReader.h"
+#include <wtf/text/WTFString.h>
+
+namespace JSC {
+
+class ExecState;
+class JSGlobalObject;
+class JSWASMModule;
+class SourceCode;
+class VM;
+
+class WASMModuleParser {
+public:
+ WASMModuleParser(const SourceCode&);
+ JSWASMModule* parse(VM&, JSGlobalObject*, String& errorMessage);
+
+private:
+ bool parseModule();
+
+ WASMReader m_reader;
+ String m_errorMessage;
+};
+
+JS_EXPORT_PRIVATE JSWASMModule* parseWebAssembly(ExecState*, const SourceCode&, String& errorMessage);
+
+} // namespace JSC
+
+#endif // ENABLE(WEBASSEMBLY)
+
+#endif // WASMModuleParser_h
Added: trunk/Source/_javascript_Core/wasm/WASMReader.cpp (0 => 187531)
--- trunk/Source/_javascript_Core/wasm/WASMReader.cpp (rev 0)
+++ trunk/Source/_javascript_Core/wasm/WASMReader.cpp 2015-07-29 00:55:17 UTC (rev 187531)
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WASMReader.h"
+
+#if ENABLE(WEBASSEMBLY)
+
+#define CHECK_READ(length) do { if (m_cursor + length > m_buffer.end()) return false; } while (0)
+
+namespace JSC {
+
+bool WASMReader::readUnsignedInt32(uint32_t& result)
+{
+ CHECK_READ(4);
+ result = m_cursor[0] | m_cursor[1] << 8 | m_cursor[2] << 16 | m_cursor[3] << 24;
+ m_cursor += 4;
+ return true;
+}
+
+bool WASMReader::readFloat(float& result)
+{
+ CHECK_READ(4);
+ union {
+ uint8_t bytes[4];
+ float floatValue;
+ } u = {
+#if CPU(BIG_ENDIAN)
+ { m_cursor[3], m_cursor[2], m_cursor[1], m_cursor[0] }
+#else
+ { m_cursor[0], m_cursor[1], m_cursor[2], m_cursor[3] }
+#endif
+ };
+ result = u.floatValue;
+ m_cursor += 4;
+ return true;
+}
+
+bool WASMReader::readDouble(double& result)
+{
+ CHECK_READ(8);
+ union {
+ uint8_t bytes[8];
+ double doubleValue;
+ } u = {
+#if CPU(BIG_ENDIAN)
+ { m_cursor[7], m_cursor[6], m_cursor[5], m_cursor[4], m_cursor[3], m_cursor[2], m_cursor[1], m_cursor[0] }
+#else
+ { m_cursor[0], m_cursor[1], m_cursor[2], m_cursor[3], m_cursor[4], m_cursor[5], m_cursor[6], m_cursor[7] }
+#endif
+ };
+ result = u.doubleValue;
+ m_cursor += 8;
+ return true;
+}
+
+} // namespace JSC
+
+#endif // ENABLE(WEBASSEMBLY)
Added: trunk/Source/_javascript_Core/wasm/WASMReader.h (0 => 187531)
--- trunk/Source/_javascript_Core/wasm/WASMReader.h (rev 0)
+++ trunk/Source/_javascript_Core/wasm/WASMReader.h 2015-07-29 00:55:17 UTC (rev 187531)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WASMReader_h
+#define WASMReader_h
+
+#if ENABLE(WEBASSEMBLY)
+
+#include <wtf/Vector.h>
+
+namespace JSC {
+
+class WASMReader {
+public:
+ WASMReader(const Vector<uint8_t>& buffer)
+ : m_buffer(buffer)
+ , m_cursor(buffer.data())
+ {
+ }
+
+ bool readUnsignedInt32(uint32_t& result);
+ bool readFloat(float& result);
+ bool readDouble(double& result);
+
+private:
+ const Vector<uint8_t>& m_buffer;
+ const uint8_t* m_cursor;
+};
+
+} // namespace JSC
+
+#endif // ENABLE(WEBASSEMBLY)
+
+#endif // WASMReader_h