Skip to content

Commit 79b3d34

Browse files
author
Andi Gutmans
committed
- Commiting to branch newoperator.
- To check it out do cvs checkout -rnewoperator libzend
1 parent b1617d8 commit 79b3d34

File tree

4 files changed

+27
-19
lines changed

4 files changed

+27
-19
lines changed

Zend/zend-parser.y

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ expr_without_variable:
367367
T_LIST '(' { do_list_init(CLS_C); } assignment_list ')' '=' expr { do_list_end(&$$, &$7 CLS_CC); }
368368
| w_cvar '=' expr { do_assign(&$$, &$1, &$3 CLS_CC); }
369369
| w_cvar '=' '&' w_cvar { do_assign_ref(&$$, &$1, &$4 CLS_CC); }
370-
| w_cvar '=' T_NEW class_name { do_extended_fcall_begin(CLS_C); do_begin_new_object(&$2, &$1, &$3, &$4 CLS_CC); } ctor_arguments { do_end_new_object(&$4, &$3, &$6 CLS_CC); do_extended_fcall_end(CLS_C); $$ = $2;}
370+
| T_NEW class_name { do_extended_fcall_begin(CLS_C); do_begin_new_object(&$1, &$2 CLS_CC); } ctor_arguments { do_end_new_object(&$$, &$2, &$1, &$4 CLS_CC); do_extended_fcall_end(CLS_C);}
371371
| rw_cvar T_PLUS_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_ADD, &$$, &$1, &$3 CLS_CC); }
372372
| rw_cvar T_MINUS_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_SUB, &$$, &$1, &$3 CLS_CC); }
373373
| rw_cvar T_MUL_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_MUL, &$$, &$1, &$3 CLS_CC); }

Zend/zend_compile.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,7 +1332,7 @@ void do_pop_object(znode *object CLS_DC)
13321332
}
13331333

13341334

1335-
void do_begin_new_object(znode *result, znode *variable, znode *new_token, znode *class_name CLS_DC)
1335+
void do_begin_new_object(znode *new_token, znode *class_name CLS_DC)
13361336
{
13371337
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
13381338
unsigned char *ptr = NULL;
@@ -1343,27 +1343,29 @@ void do_begin_new_object(znode *result, znode *variable, znode *new_token, znode
13431343
opline->op1 = *class_name;
13441344
SET_UNUSED(opline->op2);
13451345

1346-
do_assign(result, variable, &opline->result CLS_CC);
1346+
//*result = opline->result;
1347+
//do_assign(result, variable, &opline->result CLS_CC);
1348+
13471349

13481350
new_token->u.opline_num = get_next_op_number(CG(active_op_array));
13491351
opline = get_next_op(CG(active_op_array) CLS_CC);
13501352
opline->opcode = ZEND_JMP_NO_CTOR;
1351-
opline->op1 = *result;
1353+
opline->op1 = (opline-1)->result;
13521354
SET_UNUSED(opline->op2);
13531355

13541356
if (class_name->op_type == IS_CONST) {
13551357
zval_copy_ctor(&class_name->u.constant);
13561358
}
13571359
opline = get_next_op(CG(active_op_array) CLS_CC);
13581360
opline->opcode = ZEND_INIT_FCALL_BY_NAME;
1359-
opline->op1 = *result;
1361+
opline->op1 = (opline-2)->result;
13601362
opline->op2 = *class_name;
13611363
opline->extended_value = ZEND_MEMBER_FUNC_CALL | ZEND_CTOR_CALL;
13621364
zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(unsigned char *));
13631365
}
13641366

13651367

1366-
void do_end_new_object(znode *class_name, znode *new_token, znode *argument_list CLS_DC)
1368+
void do_end_new_object(znode *result, znode *class_name, znode *new_token, znode *argument_list CLS_DC)
13671369
{
13681370
znode ctor_result;
13691371

@@ -1374,6 +1376,7 @@ void do_end_new_object(znode *class_name, znode *new_token, znode *argument_list
13741376
do_free(&ctor_result CLS_CC);
13751377

13761378
CG(active_op_array)->opcodes[new_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array));
1379+
*result = CG(active_op_array)->opcodes[new_token->u.opline_num].op1;
13771380
}
13781381

13791382

Zend/zend_compile.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,8 @@ void do_push_object(znode *object CLS_DC);
295295
void do_pop_object(znode *object CLS_DC);
296296

297297

298-
void do_begin_new_object(znode *result, znode *variable, znode *new_token, znode *class_name CLS_DC);
299-
void do_end_new_object(znode *class_name, znode *new_token, znode *argument_list CLS_DC);
298+
void do_begin_new_object(znode *new_token, znode *class_name CLS_DC);
299+
void do_end_new_object(znode *result, znode *class_name, znode *new_token, znode *argument_list CLS_DC);
300300

301301
void do_fetch_constant(znode *result, znode *constant_name, int mode CLS_DC);
302302

Zend/zend_execute.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -844,7 +844,7 @@ void execute(zend_op_array *op_array ELS_DC)
844844
zend_function_state function_state;
845845
HashTable *calling_symbol_table;
846846
zend_function *function_being_called=NULL;
847-
zval **object_ptr=NULL;
847+
zval *object_ptr=NULL;
848848
#if !defined (__GNUC__) || __GNUC__ < 2
849849
temp_variable *Ts = (temp_variable *) do_alloca(sizeof(temp_variable)*op_array->T);
850850
#else
@@ -1270,7 +1270,9 @@ binary_assign_op_addr: {
12701270

12711271
if (opline->extended_value & ZEND_CTOR_CALL) {
12721272
/* constructor call */
1273-
PZVAL_LOCK(*Ts[opline->op1.u.var].var);
1273+
if (opline->op1.op_type == IS_VAR) {
1274+
PZVAL_LOCK(*Ts[opline->op1.u.var].var);
1275+
}
12741276
if (opline->op2.op_type==IS_VAR) {
12751277
PZVAL_LOCK(*Ts[opline->op2.u.var].var);
12761278
}
@@ -1295,11 +1297,11 @@ binary_assign_op_addr: {
12951297
object_ptr=NULL;
12961298
}
12971299
} else { /* used for member function calls */
1298-
object_ptr = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_R);
1299-
1300+
object_ptr = get_zval_ptr(&opline->op1, Ts, &free_op1, BP_VAR_R);
1301+
13001302

13011303
if (!object_ptr
1302-
|| ((*object_ptr)->type==IS_OBJECT && (*object_ptr)->value.obj.ce->handle_function_call)) { /* overloaded function call */
1304+
|| (object_ptr->type==IS_OBJECT && object_ptr->value.obj.ce->handle_function_call)) { /* overloaded function call */
13031305
zend_overloaded_element overloaded_element;
13041306
zend_property_reference *property_reference;
13051307

@@ -1322,10 +1324,10 @@ binary_assign_op_addr: {
13221324
goto overloaded_function_call_cont;
13231325
}
13241326

1325-
if ((*object_ptr)->type != IS_OBJECT) {
1327+
if (object_ptr->type != IS_OBJECT) {
13261328
zend_error(E_ERROR, "Call to a member function on a non-object");
13271329
}
1328-
active_function_table = &(*object_ptr)->value.obj.ce->function_table;
1330+
active_function_table = &object_ptr->value.obj.ce->function_table;
13291331
}
13301332
} else { /* function pointer */
13311333
object_ptr = NULL;
@@ -1359,7 +1361,7 @@ binary_assign_op_addr: {
13591361
zend_ptr_stack_push(&EG(argument_stack), (void *) opline->extended_value);
13601362
if (function_state.function->type==ZEND_INTERNAL_FUNCTION) {
13611363
var_uninit(&Ts[opline->result.u.var].tmp_var);
1362-
((zend_internal_function *) function_state.function)->handler(opline->extended_value, &Ts[opline->result.u.var].tmp_var, &EG(regular_list), &EG(persistent_list), (object_ptr?*object_ptr:NULL));
1364+
((zend_internal_function *) function_state.function)->handler(opline->extended_value, &Ts[opline->result.u.var].tmp_var, &EG(regular_list), &EG(persistent_list), (object_ptr?object_ptr:NULL));
13631365
} else if (function_state.function->type==ZEND_USER_FUNCTION) {
13641366
if (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
13651367
/*printf("Cache hit! Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
@@ -1374,12 +1376,13 @@ binary_assign_op_addr: {
13741376
if (opline->opcode==ZEND_DO_FCALL_BY_NAME
13751377
&& object_ptr
13761378
&& function_being_called->type!=ZEND_OVERLOADED_FUNCTION) {
1377-
zval *dummy = (zval *) emalloc(sizeof(zval)), **this_ptr;
1379+
/*zval *dummy = (zval *) emalloc(sizeof(zval)), **this_ptr;
13781380
13791381
var_uninit(dummy);
13801382
INIT_PZVAL(dummy);
13811383
zend_hash_update_ptr(function_state.function_symbol_table, "this", sizeof("this"), dummy, sizeof(zval *), (void **) &this_ptr);
13821384
zend_assign_to_variable_reference(NULL, this_ptr, object_ptr, NULL ELS_CC);
1385+
*/
13831386
object_ptr = NULL;
13841387
}
13851388
original_return_value = EG(return_value);
@@ -1850,8 +1853,10 @@ binary_assign_op_addr: {
18501853
break;
18511854
case ZEND_JMP_NO_CTOR: {
18521855
zval *object;
1853-
1854-
PZVAL_LOCK(*Ts[opline->op1.u.var].var);
1856+
1857+
if (opline->op1.op_type == IS_VAR) {
1858+
PZVAL_LOCK(*Ts[opline->op1.u.var].var);
1859+
}
18551860
object = get_zval_ptr(&opline->op1, Ts, &free_op1, BP_VAR_R);
18561861
if (!object->value.obj.ce->handle_function_call
18571862
&& !zend_hash_exists(&object->value.obj.ce->function_table, object->value.obj.ce->name, object->value.obj.ce->name_length+1)) {

0 commit comments

Comments
 (0)