Рузкий языг
Как думаете, как изменится русский язык, скажем, в ближайшую тысячу лет? Какие тенденции вы видите? Если не рассматривать вариант, что через тысячу лет все будут говорить на китайском, конечно.
Мне сейчас кажется следующее.
А что фи́нкаете ВЫ,
Замыкания и Джаваскрипт
Все знают, что зона видимости в JS создаётся только внутри функций (если не брать в расчёт конструкцию «let» из JS 1.7):
var v = 5;
!(function() {
var v = 6;
})();
alert(v); // будет 5Я тут подумал, что ведь есть и второй способ (я
var x = 1, y = 0;
// конструкция «let», JS 1.7+
let (x = x+10, y = 5) {
alert(x+y); // 16
}
alert(x+y); // 1
// конструкция «with»
with ({ x: x+10, y: 5 }) {
alert(x+y); // 16
}
alert(x+y); // 1Не так уж и много отличий, только выражением «with» быть не умеет, но можно было бы и научить.
Патч модуля bcompiler для PHP 5.4
Мы тут по работе пытаемся закешировать
Я посидел над сообщениями при компиляции, посмотрел что другие ребята делали в модуле xcache для того, чтобы он заработал в 5.4, посмотрел внутренние структуры ПХП и родил патч, который позволяет успешно скомпилировать модуль. Модуль мои простенькие тесты проходит, но это правда не значит, что всё действительно работает.
Добавлено позднее: на более сложных тестах модуль Неудобно только то, что модуль не позволяет работать с объектами и анонимными функциями из ПХП 5.3 (которые тоже объекты), а так же компилирует всё в файл. Но второй недостаток легко обходится:Патч и немного кода.
diff -wrdu bcompiler-1.0.2/bcompiler_zend.c bcompiler-1.0.2.new/bcompiler_zend.c
--- bcompiler-1.0.2/bcompiler_zend.c 2011-06-09 15:58:42.000000000 +0400
+++ bcompiler-1.0.2.new/bcompiler_zend.c 2012-07-24 21:59:30.000000000 +0400
@@ -471,12 +471,6 @@
apc_serialize_zend_class_entry(zv->obj.ce, NULL, 0, NULL, 0 TSRMLS_CC);
#endif
break;
-#ifdef ZEND_ENGINE_2_4
- case IS_CLASS:
- case IS_SCALAR:
- case IS_NUMERIC:
- break;
-#endif
default:
/* The above list enumerates all types. If we get here,
* something very very bad has happened. */
@@ -551,12 +545,6 @@
apc_create_hashtable(&zv->obj.properties, apc_create_zval, NULL, sizeof(zval *) TSRMLS_CC);
#endif
break;
-#ifdef ZEND_ENGINE_2_4
- case IS_CLASS:
- case IS_SCALAR:
- case IS_NUMERIC:
- break;
-#endif
default:
/* The above list enumerates all types. If we get here,
* something very very bad has happened. */
@@ -636,8 +624,10 @@
}
SERIALIZE_SCALAR(arg_info->allow_null , zend_bool);
SERIALIZE_SCALAR(arg_info->pass_by_reference, zend_bool);
+#ifndef ZEND_ENGINE_2_4
SERIALIZE_SCALAR(arg_info->return_reference , zend_bool);
SERIALIZE_SCALAR(arg_info->required_num_args, int);
+#endif
#ifdef ZEND_ENGINE_2_1
if (BCOMPILERG(current_write) > 20) {
# ifdef ZEND_ENGINE_2_4
@@ -667,8 +657,10 @@
else ZS2SR(arg_info->class_name) = NULL;
DESERIALIZE_SCALAR(&arg_info->allow_null, zend_bool);
DESERIALIZE_SCALAR(&arg_info->pass_by_reference, zend_bool);
+#ifndef ZEND_ENGINE_2_4
DESERIALIZE_SCALAR(&arg_info->return_reference, zend_bool);
DESERIALIZE_SCALAR(&arg_info->required_num_args, int);
+#endif
#ifdef ZEND_ENGINE_2_1
if (BCOMPILERG(current_version) > 20) {
# ifdef ZEND_ENGINE_2_4
@@ -883,7 +875,9 @@
#else
SERIALIZE_SCALAR(*(zce->refcount) , int);
#endif
+#ifndef ZEND_ENGINE_2_4
SERIALIZE_SCALAR(zce->constants_updated, zend_bool);
+#endif
#ifdef ZEND_ENGINE_2
SERIALIZE_SCALAR(zce->ce_flags, zend_uint);
#endif
@@ -930,15 +924,15 @@
* and all the functions. */
BCOMPILER_DEBUG(("-----------------------------\nBUILTIN:\n"));
count = 0;
- if (zce->type == ZEND_INTERNAL_CLASS && zce->builtin_functions) {
- for (zfe = (zend_function_entry*)zce->builtin_functions; zfe->fname != NULL; zfe++) {
+ if (zce->type == ZEND_INTERNAL_CLASS && zce->info.internal.builtin_functions) {
+ for (zfe = (zend_function_entry*)zce->info.internal.builtin_functions; zfe->fname != NULL; zfe++) {
count++;
}
}
SERIALIZE_SCALAR(count, int);
for (i = 0; i < count; i++) {
- apc_serialize_zend_function_entry((zend_function_entry *)&zce->builtin_functions[i] TSRMLS_CC);
+ apc_serialize_zend_function_entry((zend_function_entry *)&zce->info.internal.builtin_functions[i] TSRMLS_CC);
}
#ifndef ZEND_ENGINE_2
/** old code: SERIALIZE_SCALAR(zce->handle_function_call, void*); */
@@ -974,12 +968,12 @@
/* do reflection info (file/start/end) !! TODO: check for PHP6 !! */
#ifdef ZEND_ENGINE_2
if (BCOMPILERG(current_write) >= 25) {
- char* fname = bcompiler_handle_filename(zce->filename TSRMLS_CC);
+ char* fname = bcompiler_handle_filename(zce->info.user.filename TSRMLS_CC);
apc_serialize_string(fname TSRMLS_CC);
- SERIALIZE_SCALAR(zce->line_start, int);
- SERIALIZE_SCALAR(zce->line_end, int);
- apc_serialize_zstring(zce->doc_comment, zce->doc_comment_len TSRMLS_CC);
- SERIALIZE_SCALAR(zce->doc_comment_len, int);
+ SERIALIZE_SCALAR(zce->info.user.line_start, int);
+ SERIALIZE_SCALAR(zce->info.user.line_end, int);
+ apc_serialize_zstring(zce->info.user.doc_comment, zce->info.user.doc_comment_len TSRMLS_CC);
+ SERIALIZE_SCALAR(zce->info.user.doc_comment_len, int);
}
#endif
@@ -1089,7 +1083,9 @@
*zce->refcount = 1; /* val: to avoid memort leaks */
}
#endif
+#ifndef ZEND_ENGINE_2_4
DESERIALIZE_SCALAR(&zce->constants_updated, zend_bool);
+#endif
#ifdef ZEND_ENGINE_2
DESERIALIZE_SCALAR(&zce->ce_flags, zend_uint);
#endif
@@ -1184,11 +1180,11 @@
zend_class_entry.builtin_functions member */
DESERIALIZE_SCALAR(&count, int);
- zce->builtin_functions = NULL;
+ zce->info.internal.builtin_functions = NULL;
if (count > 0) {
- zce->builtin_functions = (zend_function_entry*) ecalloc(count+1, sizeof(zend_function_entry));
+ zce->info.internal.builtin_functions = (zend_function_entry*) ecalloc(count+1, sizeof(zend_function_entry));
for (i = 0; i < count; i++) {
- apc_deserialize_zend_function_entry((zend_function_entry*)&zce->builtin_functions[i] TSRMLS_CC);
+ apc_deserialize_zend_function_entry((zend_function_entry*)&zce->info.internal.builtin_functions[i] TSRMLS_CC);
}
}
#ifndef ZEND_ENGINE_2
@@ -1237,11 +1233,11 @@
if (BCOMPILERG(current_version) >= 25) {
char* fname;
apc_create_string_u(&fname, -1 TSRMLS_CC);
- zce->filename = fname ? fname : estrdup(BCOMPILERG(current_filename));
- DESERIALIZE_SCALAR(&zce->line_start, int);
- DESERIALIZE_SCALAR(&zce->line_end, int);
- apc_create_string_u(ZS2SP(zce->doc_comment), -1 TSRMLS_CC);
- DESERIALIZE_SCALAR(&zce->doc_comment_len, int);
+ zce->info.user.filename = fname ? fname : estrdup(BCOMPILERG(current_filename));
+ DESERIALIZE_SCALAR(&zce->info.user.line_start, int);
+ DESERIALIZE_SCALAR(&zce->info.user.line_end, int);
+ apc_create_string_u(ZS2SP(zce->info.user.doc_comment), -1 TSRMLS_CC);
+ DESERIALIZE_SCALAR(&zce->info.user.doc_comment_len, int);
}
#endif
@@ -1564,7 +1560,7 @@
#ifdef ZEND_ENGINE_2_4
SERIALIZE_SCALAR(zoa->last_literal, zend_uint);
- SERIALIZE_SCALAR(zoa->size_literal, zend_uint);
+ //SERIALIZE_SCALAR(zoa->size_literal, zend_uint);
for (i = 0; i < (int) zoa->last_literal; i++) {
bc_serialize_zend_literal(&zoa->literals[i] TSRMLS_CC);
}
@@ -1572,7 +1568,7 @@
SERIALIZE_SCALAR(zoa->refcount[0], zend_uint);
SERIALIZE_SCALAR(zoa->last, zend_uint);
- SERIALIZE_SCALAR(zoa->size, zend_uint);
+ //SERIALIZE_SCALAR(zoa->size, zend_uint);
/* If a file 'A' is included twice in a single request, the following
* situation can occur: A is deserialized and its functions added to
@@ -1595,7 +1591,7 @@
SERIALIZE_SCALAR(zoa->T, zend_uint);
SERIALIZE_SCALAR(zoa->last_brk_cont, zend_uint);
- SERIALIZE_SCALAR(zoa->current_brk_cont, zend_uint);
+ //SERIALIZE_SCALAR(zoa->current_brk_cont, zend_uint);
#ifndef ZEND_ENGINE_2
SERIALIZE_SCALAR(zoa->uses_globals, zend_bool);
#endif
@@ -1608,8 +1604,8 @@
}
apc_serialize_hashtable(zoa->static_variables, apc_serialize_zval_ptr TSRMLS_CC);
assert(zoa->start_op == NULL);
- SERIALIZE_SCALAR(zoa->return_reference, zend_bool);
- SERIALIZE_SCALAR(zoa->done_pass_two, zend_bool);
+ //SERIALIZE_SCALAR(zoa->return_reference, zend_bool);
+ //SERIALIZE_SCALAR(zoa->done_pass_two, zend_bool);
fname = bcompiler_handle_filename(zoa->filename TSRMLS_CC);
apc_serialize_string(fname TSRMLS_CC);
if (fname) efree(fname);
@@ -1628,9 +1624,9 @@
#endif
SERIALIZE_SCALAR(zoa->fn_flags, zend_uint);
SERIALIZE_SCALAR(zoa->required_num_args, zend_uint);
- SERIALIZE_SCALAR(zoa->pass_rest_by_reference, zend_bool);
+ //SERIALIZE_SCALAR(zoa->pass_rest_by_reference, zend_bool);
- SERIALIZE_SCALAR(zoa->backpatch_count, int);
+ //SERIALIZE_SCALAR(zoa->backpatch_count, int);
#ifdef ZEND_ENGINE_2_3
SERIALIZE_SCALAR(zoa->this_var, zend_uint);
#else
@@ -1642,7 +1638,7 @@
#ifdef ZEND_ENGINE_2_1
if (BCOMPILERG(current_write) >= 0x0007) {
SERIALIZE_SCALAR(zoa->last_var, int);
- SERIALIZE_SCALAR(zoa->size_var, int);
+ //SERIALIZE_SCALAR(zoa->size_var, int);
for (i = 0; i < zoa->last_var; i++) {
SERIALIZE_SCALAR(zoa->vars[i].name_len, int);
apc_serialize_zstring(ZS2S(zoa->vars[i].name), ZLEN(zoa->vars[i].name_len) TSRMLS_CC);
@@ -1706,7 +1702,7 @@
#ifdef ZEND_ENGINE_2_4
DESERIALIZE_SCALAR(&zoa->last_literal, zend_uint);
- DESERIALIZE_SCALAR(&zoa->size_literal, zend_uint);
+ //DESERIALIZE_SCALAR(&zoa->size_literal, zend_uint);
zoa->literals = NULL;
if (zoa->last_literal) {
zoa->literals = (zend_literal*) ecalloc(zoa->last_literal, sizeof(zend_literal));
@@ -1722,7 +1718,7 @@
*zoa->refcount = 1; /* val: to avoid memort leaks */
}
DESERIALIZE_SCALAR(&zoa->last, zend_uint);
- DESERIALIZE_SCALAR(&zoa->size, zend_uint);
+ //DESERIALIZE_SCALAR(&zoa->size, zend_uint);
zoa->opcodes = NULL;
@@ -1736,7 +1732,7 @@
DESERIALIZE_SCALAR(&zoa->T, zend_uint);
DESERIALIZE_SCALAR(&zoa->last_brk_cont, zend_uint);
- DESERIALIZE_SCALAR(&zoa->current_brk_cont, zend_uint);
+ //DESERIALIZE_SCALAR(&zoa->current_brk_cont, zend_uint);
#ifndef ZEND_ENGINE_2
DESERIALIZE_SCALAR(&zoa->uses_globals, zend_bool);
#endif
@@ -1749,10 +1745,10 @@
}
apc_create_hashtable(&zoa->static_variables, apc_create_zval, NULL, sizeof(zval *) TSRMLS_CC);
- zoa->start_op = NULL;
+ //zoa->start_op = NULL;
- DESERIALIZE_SCALAR(&zoa->return_reference, zend_bool);
- DESERIALIZE_SCALAR(&zoa->done_pass_two, zend_bool);
+ //DESERIALIZE_SCALAR(&zoa->return_reference, zend_bool);
+ //DESERIALIZE_SCALAR(&zoa->done_pass_two, zend_bool);
apc_create_string_u(&fname, -1 TSRMLS_CC);
if (fname) {
zoa->filename = zend_set_compiled_filename(fname TSRMLS_CC);
@@ -1798,8 +1794,8 @@
zoa->fn_flags &= ~ZEND_ACC_IMPLEMENTED_ABSTRACT; /* this is set later by zend_do_inheritance() */
#endif
DESERIALIZE_SCALAR(&zoa->required_num_args, zend_uint);
- DESERIALIZE_SCALAR(&zoa->pass_rest_by_reference, zend_bool);
- DESERIALIZE_SCALAR(&zoa->backpatch_count, int);
+ //DESERIALIZE_SCALAR(&zoa->pass_rest_by_reference, zend_bool);
+ //DESERIALIZE_SCALAR(&zoa->backpatch_count, int);
#ifdef ZEND_ENGINE_2_3
DESERIALIZE_SCALAR(&zoa->this_var, zend_uint);
#else
@@ -1811,15 +1807,15 @@
#ifdef ZEND_ENGINE_2_1
if (BCOMPILERG(current_version) >= 0x0007) {
DESERIALIZE_SCALAR(&zoa->last_var, int);
- DESERIALIZE_SCALAR(&zoa->size_var, int);
- if (zoa->size_var > 0) {
+ //DESERIALIZE_SCALAR(&zoa->size_var, int);
+ /*if (zoa->size_var > 0) {
zoa->vars = ecalloc(zoa->size_var, sizeof(zoa->vars[0]));
for (i = 0; i < zoa->last_var; i++) {
DESERIALIZE_SCALAR(&(zoa->vars[i].name_len), int);
apc_create_string_u(ZS2SP(zoa->vars[i].name), -1 TSRMLS_CC);
DESERIALIZE_SCALAR(&(zoa->vars[i].hash_value), ulong);
}
- }
+ }*/
}
#endif
diff -wrdu bcompiler-1.0.2/php_bcompiler.c bcompiler-1.0.2.new/php_bcompiler.c
--- bcompiler-1.0.2/php_bcompiler.c 2011-06-09 15:58:42.000000000 +0400
+++ bcompiler-1.0.2.new/php_bcompiler.c 2012-07-24 21:27:31.000000000 +0400
@@ -571,7 +571,7 @@
#ifndef ZEND_ENGINE_2
if (i > n_old_class)
#else
- if (zc->filename && strcmp(zc->filename, real_path) == 0)
+ if (zc->info.user.filename && strcmp(zc->info.user.filename, real_path) == 0)
#endif
{
SERIALIZE_SCALAR(BCOMPILER_CLASS_ENTRY, char)
@@ -632,7 +632,7 @@
#ifndef ZEND_ENGINE_2
if (i > n_old_class)
#else
- if (zc->filename && strcmp(zc->filename, real_path) == 0)
+ if (zc->info.user.filename && strcmp(zc->info.user.filename, real_path) == 0)
#endif
{
#if PHP_MAJOR_VERSION >= 6
diff -wrdu bcompiler-1.0.2/php_bcompiler.h bcompiler-1.0.2.new/php_bcompiler.h
--- bcompiler-1.0.2/php_bcompiler.h 2011-06-09 15:58:42.000000000 +0400
+++ bcompiler-1.0.2.new/php_bcompiler.h 2012-07-24 22:13:31.000000000 +0400
@@ -22,7 +22,7 @@
#ifndef PHP_BCOMPILER_H
#define PHP_BCOMPILER_H
-#define PHP_BCOMPILER_VERSION "1.0.2"
+#define PHP_BCOMPILER_VERSION "1.0.2 (bolk) "
#ifdef HAVE_CONFIG_H
#include "config.h"$fp = fopen('php://memory', 'rw');
bcompiler_write_header($fp);
bcompiler_write_function($fp, 'тут имя вашей функции, которую надо скомпилировать');
bcompiler_write_footer($fp);
fseek($fp, 0);
$compiled = stream_get_contents($fp); // байт-код теперь в переменной $compiled
fclose($fp);