Ignore:
Timestamp:
Sep 23, 2015, 12:24:42 AM (10 years ago)
Author:
[email protected]
Message:

[Streams API] Implement ReadableStream pipeThrough
https://bugs.webkit.org/show_bug.cgi?id=147556

Reviewed by Darin Adler.

Source/JavaScriptCore:

Updating BuiltIns infrastructure to make it reusable from WebCore.
Extracting macros from BuiltinNames and createBuiltinExecutable from BuiltinExecutables.
Updated generate-js-builtins to allow generating builtin CPP/H files in WebCore namespace.

  • JavaScriptCore.xcodeproj/project.pbxproj:
  • builtins/BuiltinExecutables.cpp:

(JSC::BuiltinExecutables::createDefaultConstructor):
(JSC::BuiltinExecutables::createBuiltinExecutable):
(JSC::createBuiltinExecutable):
(JSC::createExecutableInternal):

  • builtins/BuiltinExecutables.h:
  • builtins/BuiltinNames.h:

(JSC::BuiltinNames::BuiltinNames): Deleted.

  • builtins/BuiltinUtils.h: Extracting code from BuiltinNames and BuiltinExecutables.h.
  • bytecode/UnlinkedFunctionExecutable.h:
  • generate-js-builtins:

(getFunctions):
(writeIncludeDirectives):

Source/WebCore:

Adding initial support for JS builtins within WebCore.
This patch allows implementing IDL interface methods in JS, by using the new JSBuiltin keyword.
(No support yet for private identifiers, constructors or accessors).
Integration of the built-in executables and names is implemented within WebCoreJSClientData.
Two files are generated for each JS builtin file:

  • builtin h/cpp files similar to JSCBuiltins.cpp/.h, generated through WebCore/generate-js-builtins from JavaScriptCore/generate-js-builtins)
  • A builtin wrapper file mimicking BuiltinExecutables (generated from WebCore/generate-js-builtins)

Contrary to JSC, each js file is generating its own cpp/h file.
This allows including those files within the JSXX.cpp/.h files generated from the IDL where compilation guard may take effect.

Disabled GObject binding for JSBuiltin methods.

Test: streams/readable-stream-pipeThrough.html

  • CMakeLists.txt: Triggering generate-js-builtins for JS files.
  • DerivedSources.make: Ditto.
  • ForwardingHeaders/builtins/BuiltinUtils.h: Added.
  • ForwardingHeaders/bytecode/UnlinkedFunctionExecutable.h: Added.
  • ForwardingHeaders/runtime/ConstructAbility.h: Added.
  • Modules/streams/ReadableStream.idl: Marking pipeThrough as JS builtin
  • Modules/streams/ReadableStream.js: Added.

(pipeThrough):

  • bindings/js/JSReadableStreamCustom.cpp:
  • bindings/js/WebCoreJSClientData.h: Adding ReadableStreamBuiltinsWrapper to store ReadableStream builtin executable

(WebCore::WebCoreJSClientData::WebCoreJSClientData):
(WebCore::WebCoreJSClientData::readableStreamBuiltins):
(WebCore::initNormalWorldClientData):

  • bindings/scripts/CodeGeneratorGObject.pm: Disabled GObject binding for JSBuiltin methods.
  • bindings/scripts/CodeGeneratorJS.pm: Adding support for JSBuiltin keyword.

(GetFunctionName):
(GenerateHeader):
(GenerateImplementation):
(GenerateHashTableValueArray):
(ComputeFunctionSpecial):
(UseJSBuiltins):

  • bindings/scripts/IDLAttributes.txt: Adding JSBuiltin.
  • bindings/scripts/test/GObject/WebKitDOMTestObj.cpp:

(webkit_dom_test_obj_js_builtin_method):
(webkit_dom_test_obj_js_builtin_method_with_args):

  • bindings/scripts/test/GObject/WebKitDOMTestObj.h:
  • bindings/scripts/test/JS/JSTestObj.cpp:
  • bindings/scripts/test/JS/JSTestObj.h:
  • bindings/scripts/test/ObjC/DOMTestObj.h:
  • bindings/scripts/test/ObjC/DOMTestObj.mm:

(-[DOMTestObj jsBuiltinMethod]):
(-[DOMTestObj jsBuiltinMethodWithArgs:strArg:objArg:]):

  • bindings/scripts/test/TestObj.idl:
  • generate-js-builtins: Added.

LayoutTests:

Rebased test that is now passing.
Adding new tests to improve pipeThrough coverage.

  • streams/readable-stream-pipeThrough-expected.txt: Added.
  • streams/readable-stream-pipeThrough.html: Added.
  • streams/reference-implementation/brand-checks-expected.txt:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/builtins/BuiltinExecutables.cpp

    r190113 r190155  
    3636namespace JSC {
    3737
     38static UnlinkedFunctionExecutable* createExecutableInternal(VM&, const SourceCode&, const Identifier&, ConstructorKind, ConstructAbility);
     39
    3840BuiltinExecutables::BuiltinExecutables(VM& vm)
    3941    : m_vm(vm)
     
    5355        break;
    5456    case ConstructorKind::Base:
    55         return createExecutableInternal(makeSource(baseConstructorCode), name, constructorKind, ConstructAbility::CanConstruct);
     57        return createExecutableInternal(m_vm, makeSource(baseConstructorCode), name, constructorKind, ConstructAbility::CanConstruct);
    5658    case ConstructorKind::Derived:
    57         return createExecutableInternal(makeSource(derivedConstructorCode), name, constructorKind, ConstructAbility::CanConstruct);
     59        return createExecutableInternal(m_vm, makeSource(derivedConstructorCode), name, constructorKind, ConstructAbility::CanConstruct);
    5860    }
    5961    ASSERT_NOT_REACHED();
     
    6163}
    6264
    63 UnlinkedFunctionExecutable* BuiltinExecutables::createExecutableInternal(const SourceCode& source, const Identifier& name, ConstructorKind constructorKind, ConstructAbility constructAbility)
     65UnlinkedFunctionExecutable* BuiltinExecutables::createBuiltinExecutable(const SourceCode& code, const Identifier& name, ConstructAbility constructAbility)
     66{
     67    return createExecutableInternal(m_vm, code, name, ConstructorKind::None, constructAbility);
     68}
     69
     70UnlinkedFunctionExecutable* createBuiltinExecutable(VM& vm, const SourceCode& code, const Identifier& name, ConstructAbility constructAbility)
     71{
     72    return createExecutableInternal(vm, code, name, ConstructorKind::None, constructAbility);
     73}
     74
     75UnlinkedFunctionExecutable* createExecutableInternal(VM& vm, const SourceCode& source, const Identifier& name, ConstructorKind constructorKind, ConstructAbility constructAbility)
    6476{
    6577    JSTextPosition positionBeforeLastNewline;
     
    7082    RefPtr<SourceProvider> sourceOverride = isParsingDefaultConstructor ? source.provider() : nullptr;
    7183    std::unique_ptr<ProgramNode> program = parse<ProgramNode>(
    72         &m_vm, source, Identifier(), builtinMode,
     84        &vm, source, Identifier(), builtinMode,
    7385        JSParserStrictMode::NotStrict, SourceParseMode::ProgramMode, error,
    7486        &positionBeforeLastNewline, constructorKind);
     
    96108    RELEASE_ASSERT(metadata);
    97109    for (const auto& closedVariable : program->closedVariables()) {
    98         if (closedVariable == m_vm.propertyNames->arguments.impl())
     110        if (closedVariable == vm.propertyNames->arguments.impl())
    99111            continue;
    100112       
    101         if (closedVariable == m_vm.propertyNames->undefinedKeyword.impl())
     113        if (closedVariable == vm.propertyNames->undefinedKeyword.impl())
    102114            continue;
    103115    }
    104116    metadata->overrideName(name);
    105117    VariableEnvironment dummyTDZVariables;
    106     UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&m_vm, source, metadata, kind, constructAbility, dummyTDZVariables, WTF::move(sourceOverride));
    107     functionExecutable->m_nameValue.set(m_vm, functionExecutable, jsString(&m_vm, name.string()));
     118    UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&vm, source, metadata, kind, constructAbility, dummyTDZVariables, WTF::move(sourceOverride));
     119    functionExecutable->setNameValue(vm, jsString(&vm, name.string()));
    108120    return functionExecutable;
    109121}
Note: See TracChangeset for help on using the changeset viewer.