Title: [238804] trunk/Source/_javascript_Core
Revision
238804
Author
mark....@apple.com
Date
2018-12-03 09:57:51 -0800 (Mon, 03 Dec 2018)

Log Message

Fix the bytecode code generator scripts to pretty print BytecodeStructs.h and BytecodeIndices.h.
https://bugs.webkit.org/show_bug.cgi?id=192271

Reviewed by Keith Miller.

This makes the generated code style compliant and human readable.

* generator/Argument.rb:
* generator/DSL.rb:
* generator/Fits.rb:
* generator/Metadata.rb:
* generator/Opcode.rb:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (238803 => 238804)


--- trunk/Source/_javascript_Core/ChangeLog	2018-12-03 17:52:27 UTC (rev 238803)
+++ trunk/Source/_javascript_Core/ChangeLog	2018-12-03 17:57:51 UTC (rev 238804)
@@ -1,3 +1,18 @@
+2018-12-03  Mark Lam  <mark....@apple.com>
+
+        Fix the bytecode code generator scripts to pretty print BytecodeStructs.h and BytecodeIndices.h.
+        https://bugs.webkit.org/show_bug.cgi?id=192271
+
+        Reviewed by Keith Miller.
+
+        This makes the generated code style compliant and human readable.
+
+        * generator/Argument.rb:
+        * generator/DSL.rb:
+        * generator/Fits.rb:
+        * generator/Metadata.rb:
+        * generator/Opcode.rb:
+
 2018-12-02  Zalan Bujtas  <za...@apple.com>
 
         Add a runtime feature flag for LayoutFormattingContext.

Modified: trunk/Source/_javascript_Core/generator/Argument.rb (238803 => 238804)


--- trunk/Source/_javascript_Core/generator/Argument.rb	2018-12-03 17:52:27 UTC (rev 238803)
+++ trunk/Source/_javascript_Core/generator/Argument.rb	2018-12-03 17:57:51 UTC (rev 238804)
@@ -60,24 +60,24 @@
 
     def setter
         <<-EOF
-        template<typename Functor>
-        void set#{capitalized_name}(#{@type.to_s} value, Functor func)
-        {
-            if (isWide())
-                set#{capitalized_name}<OpcodeSize::Wide>(value, func);
-            else
-                set#{capitalized_name}<OpcodeSize::Narrow>(value, func);
-        }
+    template<typename Functor>
+    void set#{capitalized_name}(#{@type.to_s} value, Functor func)
+    {
+        if (isWide())
+            set#{capitalized_name}<OpcodeSize::Wide>(value, func);
+        else
+            set#{capitalized_name}<OpcodeSize::Narrow>(value, func);
+    }
 
-        template <OpcodeSize size, typename Functor>
-        void set#{capitalized_name}(#{@type.to_s} value, Functor func)
-        {
-            if (!#{Fits::check "size", "value", @type})
-                value = func();
-            auto* stream = bitwise_cast<typename TypeBySize<size>::type*>(reinterpret_cast<uint8_t*>(this) + #{@index} * size + PaddingBySize<size>::value);
-            *stream = #{Fits::convert "size", "value", @type};
-        }
-        EOF
+    template <OpcodeSize size, typename Functor>
+    void set#{capitalized_name}(#{@type.to_s} value, Functor func)
+    {
+        if (!#{Fits::check "size", "value", @type})
+            value = func();
+        auto* stream = bitwise_cast<typename TypeBySize<size>::type*>(reinterpret_cast<uint8_t*>(this) + #{@index} * size + PaddingBySize<size>::value);
+        *stream = #{Fits::convert "size", "value", @type};
+    }
+EOF
     end
 
     def capitalized_name

Modified: trunk/Source/_javascript_Core/generator/DSL.rb (238803 => 238804)


--- trunk/Source/_javascript_Core/generator/DSL.rb	2018-12-03 17:52:27 UTC (rev 238803)
+++ trunk/Source/_javascript_Core/generator/DSL.rb	2018-12-03 17:57:51 UTC (rev 238804)
@@ -114,26 +114,24 @@
             opcodes = opcodes_for(:emit_in_structs_file)
 
             template.prefix = <<-EOF
-            #pragma once
+#pragma once
 
-            #include "ArithProfile.h"
-            #include "BytecodeDumper.h"
-            #include "BytecodeGenerator.h"
-            #include "Fits.h"
-            #include "GetByIdMetadata.h"
-            #include "Instruction.h"
-            #include "Opcode.h"
-            #include "ToThisStatus.h"
+#include "ArithProfile.h"
+#include "BytecodeDumper.h"
+#include "BytecodeGenerator.h"
+#include "Fits.h"
+#include "GetByIdMetadata.h"
+#include "Instruction.h"
+#include "Opcode.h"
+#include "ToThisStatus.h"
 
-            namespace JSC {
-            EOF
+namespace JSC {
+EOF
 
             template.body = <<-EOF
-            #{opcodes.map(&:struct).join("\n")}
-
-            #{Opcode.dump_bytecode(opcodes)}
-            EOF
-
+#{opcodes.map(&:struct).join("\n")}
+#{Opcode.dump_bytecode(opcodes)}
+EOF
             template.suffix = "} // namespace JSC"
         end
     end
@@ -152,9 +150,9 @@
         opcodes = opcodes_for(:emit_in_structs_file)
 
         GeneratedFile::create(indices_filename, bytecode_list) do |template|
-            template.prefix = "namespace JSC {"
+            template.prefix = "namespace JSC {\n"
             template.body = opcodes.map(&:struct_indices).join("\n")
-            template.suffix = "} // namespace JSC"
+            template.suffix = "\n} // namespace JSC"
         end
     end
 

Modified: trunk/Source/_javascript_Core/generator/Fits.rb (238803 => 238804)


--- trunk/Source/_javascript_Core/generator/Fits.rb	2018-12-03 17:52:27 UTC (rev 238803)
+++ trunk/Source/_javascript_Core/generator/Fits.rb	2018-12-03 17:57:51 UTC (rev 238804)
@@ -31,6 +31,6 @@
     end
 
     def self.write(size, name, type)
-        "__generator->write(#{convert(size, name, type)});"
+        "gen->write(#{convert(size, name, type)});"
     end
 end

Modified: trunk/Source/_javascript_Core/generator/Metadata.rb (238803 => 238804)


--- trunk/Source/_javascript_Core/generator/Metadata.rb	2018-12-03 17:52:27 UTC (rev 238803)
+++ trunk/Source/_javascript_Core/generator/Metadata.rb	2018-12-03 17:57:51 UTC (rev 238804)
@@ -42,37 +42,36 @@
     def struct(op)
         return if empty?
 
-        def convertFields(fields)
+        def convertFields(prefix, fields)
             fields.map do |field, type|
                 if type.kind_of? Hash
-                    "union {\n#{convertFields(type)}\n};"
+                    "#{prefix}union {\n#{convertFields(prefix + '    ', type)}\n#{prefix}};"
                 else
-                    "#{type.to_s} #{field.to_s};"
+                    "#{prefix}#{type.to_s} #{field.to_s};"
                 end
             end.join("\n")
         end
 
-        fields = convertFields(@fields)
+        fields = convertFields("        ", @fields)
 
         inits = nil
         if @initializers && (not @initializers.empty?)
-            inits = ": " + @initializers.map do |metadata, arg|
+            inits = "\n            : " + @initializers.map do |metadata, arg|
                 "#{metadata}(__op.#{arg})"
-            end.join(", ")
+            end.join("\n            , ").concat("\n       ");
         end
 
         <<-EOF
-        struct Metadata {
-            WTF_MAKE_NONCOPYABLE(Metadata);
 
-        public:
-            Metadata(const #{op.capitalized_name}&#{" __op" if inits})
-            #{inits}
-            { }
+    struct Metadata {
+        WTF_MAKE_NONCOPYABLE(Metadata);
 
-            #{fields}
-        };
-        EOF
+    public:
+        Metadata(const #{op.capitalized_name}&#{" __op" if inits})#{inits} { }
+
+#{fields}
+    };
+EOF
     end
 
     def accessor
@@ -79,22 +78,23 @@
         return if empty?
 
         <<-EOF
-        Metadata& metadata(CodeBlock* codeBlock) const
-        {
-            return codeBlock->metadata<Metadata>(opcodeID, #{Metadata.field_name});
-        }
 
-        Metadata& metadata(ExecState* exec) const
-        {
-            return metadata(exec->codeBlock());
-        }
-        EOF
+    Metadata& metadata(CodeBlock* codeBlock) const
+    {
+        return codeBlock->metadata<Metadata>(opcodeID, #{Metadata.field_name});
+    }
+
+    Metadata& metadata(ExecState* exec) const
+    {
+        return metadata(exec->codeBlock());
+    }
+EOF
     end
 
-    def field
+    def field(prefix)
         return if empty?
 
-        "unsigned #{Metadata.field_name};"
+        "\n#{prefix}unsigned #{Metadata.field_name};"
     end
 
     def load_from_stream(index, size)
@@ -106,8 +106,9 @@
     def create_emitter_local
         return if empty?
 
-        <<-EOF
-        auto #{emitter_local.name} = __generator->addMetadataFor(opcodeID);
+        <<-EOF.chomp
+
+        auto #{emitter_local.name} = gen->addMetadataFor(opcodeID);
         EOF
     end
 

Modified: trunk/Source/_javascript_Core/generator/Opcode.rb (238803 => 238804)


--- trunk/Source/_javascript_Core/generator/Opcode.rb	2018-12-03 17:52:27 UTC (rev 238803)
+++ trunk/Source/_javascript_Core/generator/Opcode.rb	2018-12-03 17:57:51 UTC (rev 238804)
@@ -56,10 +56,14 @@
 
     def print_args(&block)
         return if @args.nil?
-
         @args.map(&block).join "\n"
     end
 
+    def print_members(prefix, &block)
+        return if @args.nil?
+        @args.map(&block).map { |arg| "#{prefix}#{arg}" }.join "\n"
+    end
+
     def capitalized_name
         name.split('_').map(&:capitalize).join
     end
@@ -76,33 +80,27 @@
         @args.map(&:name).unshift("").join(", ")
     end
 
-    def map_fields_with_size(size, &block)
+    def map_fields_with_size(prefix, size, &block)
         args = [Argument.new("opcodeID", :unsigned, 0)]
         args += @args.dup if @args
         unless @metadata.empty?
             args << @metadata.emitter_local
         end
-        args.map { |arg| block.call(arg, size) }
+        args.map { |arg| "#{prefix}#{block.call(arg, size)}" }
     end
 
     def struct
         <<-EOF
-        struct #{capitalized_name} : public Instruction {
-            #{opcodeID}
+struct #{capitalized_name} : public Instruction {
+    #{opcodeID}
 
-            #{emitter}
-
-            #{dumper}
-
-            #{constructors}
-
-            #{setters}
-
-            #{metadata_struct_and_accessor}
-
-            #{members}
-        };
-        EOF
+#{emitter}
+#{dumper}
+#{constructors}
+#{setters}#{metadata_struct_and_accessor}
+#{members}
+};
+EOF
     end
 
     def opcodeID
@@ -113,90 +111,92 @@
         op_wide = Argument.new("op_wide", :unsigned, 0)
         metadata_param = @metadata.empty? ? "" : ", #{@metadata.emitter_local.create_param}"
         metadata_arg = @metadata.empty? ? "" : ", #{@metadata.emitter_local.name}"
-        <<-EOF
-        static void emit(BytecodeGenerator* __generator#{typed_args})
-        {
-            __generator->recordOpcode(opcodeID);
-            #{@metadata.create_emitter_local}
-            emit<OpcodeSize::Narrow, NoAssert, false>(__generator#{untyped_args}#{metadata_arg}) || emit<OpcodeSize::Wide, Assert, false>(__generator#{untyped_args}#{metadata_arg});
-        }
+        <<-EOF.chomp
+    static void emit(BytecodeGenerator* gen#{typed_args})
+    {
+        gen->recordOpcode(opcodeID);#{@metadata.create_emitter_local}
+        emit<OpcodeSize::Narrow, NoAssert, false>(gen#{untyped_args}#{metadata_arg})
+            || emit<OpcodeSize::Wide, Assert, false>(gen#{untyped_args}#{metadata_arg});
+    }
+#{%{
+    template<OpcodeSize size, FitsAssertion shouldAssert = Assert>
+    static bool emit(BytecodeGenerator* gen#{typed_args})
+    {#{@metadata.create_emitter_local}
+        return emit<size, shouldAssert>(gen#{untyped_args}#{metadata_arg});
+    }
+} unless @metadata.empty?}
+    template<OpcodeSize size, FitsAssertion shouldAssert = Assert, bool recordOpcode = true>
+    static bool emit(BytecodeGenerator* gen#{typed_args}#{metadata_param})
+    {
+        if (recordOpcode)
+            gen->recordOpcode(opcodeID);
+        bool didEmit = emitImpl<size>(gen#{untyped_args}#{metadata_arg});
+        if (shouldAssert == Assert)
+            ASSERT(didEmit);
+        return didEmit;
+    }
 
-        #{%{
-        template<OpcodeSize size, FitsAssertion shouldAssert = Assert>
-        static bool emit(BytecodeGenerator* __generator#{typed_args})
-        {
-            #{@metadata.create_emitter_local}
-            return emit<size, shouldAssert>(__generator#{untyped_args}#{metadata_arg});
+private:
+    template<OpcodeSize size>
+    static bool emitImpl(BytecodeGenerator* gen#{typed_args}#{metadata_param})
+    {
+        if (size == OpcodeSize::Wide)
+            gen->alignWideOpcode();
+        if (#{map_fields_with_size("", "size", &:fits_check).join "\n            && "}
+            && (size == OpcodeSize::Wide ? #{op_wide.fits_check(Size::Narrow)} : true)) {
+            if (size == OpcodeSize::Wide)
+                #{op_wide.fits_write Size::Narrow}
+#{map_fields_with_size("            ", "size", &:fits_write).join "\n"}
+            return true;
         }
-        } unless @metadata.empty?}
+        return false;
+    }
 
-        template<OpcodeSize size, FitsAssertion shouldAssert = Assert, bool recordOpcode = true>
-        static bool emit(BytecodeGenerator* __generator#{typed_args}#{metadata_param})
-        {
-            if (recordOpcode)
-                __generator->recordOpcode(opcodeID);
-            bool didEmit = emitImpl<size>(__generator#{untyped_args}#{metadata_arg});
-            if (shouldAssert == Assert)
-                ASSERT(didEmit);
-            return didEmit;
-        }
-
-        private:
-        template<OpcodeSize size>
-        static bool emitImpl(BytecodeGenerator* __generator#{typed_args}#{metadata_param})
-        {
-            if (size == OpcodeSize::Wide)
-                __generator->alignWideOpcode();
-            if (#{map_fields_with_size("size", &:fits_check).join " && "} && (size == OpcodeSize::Wide ? #{op_wide.fits_check(Size::Narrow)} : true)) {
-                if (size == OpcodeSize::Wide)
-                    #{op_wide.fits_write Size::Narrow}
-                #{map_fields_with_size("size", &:fits_write).join "\n"}
-                return true;
-            }
-            return false;
-        }
-        public:
-        EOF
+public:
+EOF
     end
 
     def dumper
         <<-EOF
-        template<typename Block>
-        void dump(BytecodeDumper<Block>* __dumper, InstructionStream::Offset __location, bool __isWide)
-        {
-            __dumper->printLocationAndOp(__location, &"*#{@name}"[!__isWide]);
-            #{print_args { |arg|
-            <<-EOF
-                __dumper->dumpOperand(#{arg.name}, #{arg.index == 1});
-            EOF
-            }}
-        }
-        EOF
+    template<typename Block>
+    void dump(BytecodeDumper<Block>* dumper, InstructionStream::Offset __location, bool __isWide)
+    {
+        dumper->printLocationAndOp(__location, &"*#{@name}"[!__isWide]);
+#{print_args { |arg|
+<<-EOF.chomp
+        dumper->dumpOperand(#{arg.name}, #{arg.index == 1});
+EOF
+    }}
+    }
+EOF
     end
 
     def constructors
         fields = (@args || []) + (@metadata.empty? ? [] : [@metadata])
-        init = ->(size) { fields.empty?  ? "" : ": #{fields.map.with_index { |arg, i| arg.load_from_stream(i + 1, size) }.join ",\n" }" }
+        init = ->(size) { fields.empty?  ? "" : ": #{fields.map.with_index { |arg, i| arg.load_from_stream(i + 1, size) }.join "\n        , " }" }
 
         <<-EOF
-        #{capitalized_name}(const uint8_t* stream)
-            #{init.call("OpcodeSize::Narrow")}
-        { ASSERT_UNUSED(stream, stream[0] == opcodeID); }
+    #{capitalized_name}(const uint8_t* stream)
+        #{init.call("OpcodeSize::Narrow")}
+    {
+        ASSERT_UNUSED(stream, stream[0] == opcodeID);
+    }
 
-        #{capitalized_name}(const uint32_t* stream)
-            #{init.call("OpcodeSize::Wide")}
-        { ASSERT_UNUSED(stream, stream[0] == opcodeID); }
+    #{capitalized_name}(const uint32_t* stream)
+        #{init.call("OpcodeSize::Wide")}
+    {
+        ASSERT_UNUSED(stream, stream[0] == opcodeID);
+    }
 
-        static #{capitalized_name} decode(const uint8_t* stream)
-        {
-            if (*stream != op_wide)
-                return { stream };
+    static #{capitalized_name} decode(const uint8_t* stream)
+    {
+        if (*stream != op_wide)
+            return { stream };
 
-            auto wideStream = bitwise_cast<const uint32_t*>(stream + 1);
-            return { wideStream };
-        }
-
-        EOF
+        auto wideStream = bitwise_cast<const uint32_t*>(stream + 1);
+        return { wideStream };
+    }
+EOF
     end
 
     def setters
@@ -204,18 +204,15 @@
     end
 
     def metadata_struct_and_accessor
-        <<-EOF
-        #{@metadata.struct(self)}
-
-        #{@metadata.accessor}
-        EOF
+        <<-EOF.chomp
+#{@metadata.struct(self)}#{@metadata.accessor}
+EOF
     end
 
     def members
-        <<-EOF
-        #{print_args(&:field)}
-        #{@metadata.field}
-        EOF
+        <<-EOF.chomp
+#{print_members("    ", &:field)}#{@metadata.field("    ")}
+EOF
     end
 
     def set_entry_address(id)
@@ -248,22 +245,22 @@
     end
 
     def self.dump_bytecode(opcodes)
-        <<-EOF
-        template<typename Block>
-        static void dumpBytecode(BytecodeDumper<Block>* __dumper, InstructionStream::Offset __location, const Instruction* __instruction)
-        {
-            switch (__instruction->opcodeID()) {
-            #{opcodes.map { |op|
-                <<-EOF
-                case #{op.name}:
-                    __instruction->as<#{op.capitalized_name}>().dump(__dumper, __location, __instruction->isWide());
-                    break;
-                EOF
-            }.join "\n"}
-            default:
-                ASSERT_NOT_REACHED();
-            }
-        }
-        EOF
+        <<-EOF.chomp
+template<typename Block>
+static void dumpBytecode(BytecodeDumper<Block>* dumper, InstructionStream::Offset __location, const Instruction* __instruction)
+{
+    switch (__instruction->opcodeID()) {
+#{opcodes.map { |op|
+        <<-EOF.chomp
+    case #{op.name}:
+        __instruction->as<#{op.capitalized_name}>().dump(dumper, __location, __instruction->isWide());
+        break;
+EOF
+    }.join "\n"}
+    default:
+        ASSERT_NOT_REACHED();
+    }
+}
+EOF
     end
 end
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to