Как я могу расширить автоматический экспорт прагмы Американского лося?

Некоторые архитектуры ЦП требуют определенного выравнивания различных типов данных и выдадут исключения, если Вы не соблюдаете это правило. В стандартном режиме x86 не требует этого для типов основных данных, но может пострадать, потери производительности (проверьте www.agner.org на подсказки по оптимизации низкого уровня).

Однако система команд SSE (часто используемый для высокоэффективного) аудио/видео обработка имеет строгие требования выравнивания и выдаст исключения, при попытке использовать ее на невыровненных данных (если Вы не используете, на некоторых процессорах, намного медленнее невыровненные версии).

Ваша проблема , вероятно , что один компилятор ожидает вызывающая сторона сохранять стек выровненным, в то время как другой ожидает вызываемый выравнивать стек при необходимости.

РЕДАКТИРОВАНИЕ : что касается того, почему происходит исключение, стандартная программа в DLL, вероятно, хочет использовать инструкции SSE относительно некоторых временных данных стека и сбои, потому что два различных компилятора не договариваются о соглашениях о вызовах.

10
задан brian d foy 5 November 2009 в 07:27
поделиться

4 ответа

Поскольку существует много способов, которыми модуль может экспортировать свои функции в пространство имен , используйте -ing, вам может потребоваться немного покопаться в коде, чтобы реализовать каждую желаемую библиотеку. То, о чем вы просите, не имеет ничего специфического для Moose, поэтому вы можете написать собственный модуль передовых практик для себя или своей компании, который установит для вас группу стандартов, с которыми вы будете работать, например,

use OurCompany::BestPractices::V1;

с

package OurCompany::BestPractices::V1;

use strict;
use warnings;
use feature (':5.10');
require Fatal;
require Moose;

# Required for straight implementation of autodie code
our @ISA;
push @ISA, qw(
   Fatal
);

sub import {
   my $caller = caller;
   strict->import;
   warnings->import;
   feature->import( ':5.10' );
   Moose->import ({into => $caller});

   #autodie implementation copied from autodie source
   splice(@_,1,0,Fatal::LEXICAL_TAG);
   goto &Fatal::import;
}

1;

Autodie делает все немного сложнее, так как он основан на поиске пакета пользователя из caller () и использует goto, но вы можете найти лучший способ с дополнительным тестированием. Чем больше вы реализуете, тем сложнее может быть эта библиотека,

2
ответ дан 4 December 2019 в 01:31
поделиться

Вы должны определить подпрограмму import в своем пакете и импортировать туда все остальное.

Пример из Modern :: Perl (еще один модуль политики, который вы можете посмотреть):

use 5.010_000;

use strict;
use warnings;

use mro     ();
use feature ();

sub import {
     warnings->import();
     strict->import();
     feature->import( ':5.10' );
     mro::set_mro( scalar caller(), 'c3' );
}

Обновление: Извините, я недостаточно внимательно прочитал вопрос.

Хороший способ расширить существующий метод импорта - написать свой собственный в новом пакете и вызвать оттуда метод импорта Moose. Вы можете сделать это путем создания подклассов, может быть, вы даже можете использовать Moose самостоятельно; -)

1
ответ дан 4 December 2019 в 01:31
поделиться

My подход решает проблему в обратном направлении.

Почему бы не использовать ToolSet для создания группы операторов использования , которая включает Moose вместе с вашими дополнительными прагмами?

] Код должен выглядеть примерно так:

 # MagicMoose.pm
 package MagicMoose;

 use base 'ToolSet'; 

 ToolSet->use_pragma( qw/feature :5.10/ ); # perl 5.10
 ToolSet->use_pragma( qw/autodie/ );

 # define exports from other modules
 ToolSet->export(
     'Moose'          => undef,       # get the defaults
 );

 1; # modules must return true

Я не тестировал это. Честно говоря, я нашел ToolSet несколько дней назад и еще не успел попробовать его. FWIW, отзывы положительные.

5
ответ дан 4 December 2019 в 01:31
поделиться

Moose :: Exporter позволит вам определить собственный метод import для используемого вами класса сахара. MooseX :: POE использовал эту версию в течение многих лет, но делает это тем, что я считаю «хакерским» способом. Глядя на документацию для Moose :: Exporter , следующее должно быть примерно тем, что вы просите

package Modern::Moose;
use Moose ();
use Moose::Exporter;

my ($import) = Moose::Exporter->build_import_methods(
    also => 'Moose',
    install => [qw(unimport init_meta)],
);

sub import { # borrowing from mortiz's answer for feature/mro
    feature->import( ':5.10' );
    mro::set_mro( scalar caller(), 'c3' );        
    goto &$import;
}

Это можно затем использовать так

package MyApp;
use Modern::Moose;

has greeting => (is => 'ro', default => 'Hello');
sub run { say $_[0]->greeting } # 5.10 is enabled
2
ответ дан 4 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: