classFileStructureBuilder = $classFileStructureBuilder; } public function compile($stream): void { if (!is_resource($stream)) { throw new CompilerException('The stream is not a resource.'); } $binaryWriter = new BinaryWriter($stream); if (!$binaryWriter->isWritable()) { throw new CompilerException('The stream is not writable.'); } $binaryWriter->enableBuffer(true); // Write magic MagicByte::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write minor_version MinorVersion::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write major_version MajorVersion::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write constant_pool_count ConstantPoolCount::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write constant_pool ConstantPool::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write access_flags AccessFlags::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write this_class ThisClass::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write super_class SuperClass::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write interfaces_count InterfacesCount::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write interfaces Interfaces::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write fields_count FieldsCount::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write fields Fields::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write methods_count MethodsCount::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Write methods Methods::init($this->classFileStructureBuilder, $binaryWriter) ->build(); // Build attributes_count AttributesCount::init( $this->classFileStructureBuilder->getAttributes(), $this->classFileStructureBuilder->getConstantPool(), $binaryWriter )->build(); // Build attributes Attributes::init( $this->classFileStructureBuilder->getAttributes(), $this->classFileStructureBuilder->getConstantPool(), $binaryWriter )->build(); } }