php_vm 1.3.7 → 1.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/php_vm/php_vm.c +46 -40
- data/ext/php_vm/php_vm_z2v.c +0 -2
- metadata +1 -1
data/ext/php_vm/php_vm.c
CHANGED
|
@@ -49,13 +49,11 @@ static void php_embed_error_handler(char *message)
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
static zval *
|
|
52
|
+
static zval *g_exception = NULL;
|
|
53
53
|
static void php_vm_exception_hook(zval *ex TSRMLS_DC)
|
|
54
54
|
{
|
|
55
55
|
// TODO: no use global variable
|
|
56
|
-
|
|
57
|
-
//rb_exc_raise(exception);
|
|
58
|
-
global_exception = ex;
|
|
56
|
+
g_exception = ex;
|
|
59
57
|
EG(exception) = NULL;
|
|
60
58
|
}
|
|
61
59
|
|
|
@@ -181,9 +179,15 @@ int new_php_object(zend_class_entry *ce, VALUE v_args, zval *retval)
|
|
|
181
179
|
// call constructor
|
|
182
180
|
int result = call_php_method(ce, retval, ce->constructor, RARRAY_LEN(v_args), RARRAY_PTR(v_args), &retval TSRMLS_CC);
|
|
183
181
|
|
|
184
|
-
//
|
|
182
|
+
// exception
|
|
185
183
|
if (result==FAILURE) {
|
|
186
|
-
|
|
184
|
+
if (g_exception) {
|
|
185
|
+
VALUE exception = zval_to_value(g_exception);
|
|
186
|
+
g_exception = NULL;
|
|
187
|
+
rb_exc_raise(exception);
|
|
188
|
+
} else {
|
|
189
|
+
rb_raise(rb_ePHPError, "Invocation of %s's constructor failed", ce->name);
|
|
190
|
+
}
|
|
187
191
|
}
|
|
188
192
|
|
|
189
193
|
} else if (!RARRAY_LEN(v_args)) {
|
|
@@ -366,31 +370,36 @@ int call_php_method(zend_class_entry *ce, zval *obj, zend_function *mptr, int ar
|
|
|
366
370
|
|
|
367
371
|
zend_fcall_info_args(&fci, z_args);
|
|
368
372
|
|
|
369
|
-
// call method
|
|
370
373
|
zend_try {
|
|
374
|
+
// call method
|
|
371
375
|
result = zend_call_function(&fci, &fcc TSRMLS_CC);
|
|
372
|
-
} zend_catch {
|
|
373
|
-
} zend_end_try();
|
|
374
376
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
377
|
+
// reference variable
|
|
378
|
+
HashPosition pos;
|
|
379
|
+
zval **arg;
|
|
380
|
+
zend_arg_info *arg_info = mptr->common.arg_info;
|
|
381
|
+
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(z_args), &pos);
|
|
382
|
+
for (i=0; i<argc && i<mptr->common.num_args; i++) {
|
|
383
|
+
if (arg_info->pass_by_reference) {
|
|
384
|
+
zend_hash_get_current_data_ex(Z_ARRVAL_P(z_args), (void *)&arg, &pos);
|
|
385
|
+
value_copy(v_argv[i], zval_to_value(*arg));
|
|
386
|
+
}
|
|
387
|
+
zend_hash_move_forward_ex(Z_ARRVAL_P(z_args), &pos);
|
|
388
|
+
arg_info++;
|
|
384
389
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
}
|
|
390
|
+
} zend_catch {
|
|
391
|
+
} zend_end_try();
|
|
388
392
|
|
|
389
393
|
// release
|
|
390
394
|
for (i=0; i<fci.param_count; i++) {
|
|
391
395
|
zval_ptr_dtor(fci.params[i]);
|
|
392
396
|
}
|
|
393
397
|
zend_fcall_info_args_clear(&fci, 1);
|
|
398
|
+
|
|
399
|
+
// result
|
|
400
|
+
if (g_exception) {
|
|
401
|
+
result = FAILURE;
|
|
402
|
+
}
|
|
394
403
|
return result;
|
|
395
404
|
}
|
|
396
405
|
|
|
@@ -420,12 +429,14 @@ VALUE call_php_method_bridge(zend_class_entry *ce, zval *obj, zend_function *mpt
|
|
|
420
429
|
int result = call_php_method(ce, obj, mptr, argc, argv, &z_val TSRMLS_CC);
|
|
421
430
|
|
|
422
431
|
// exception
|
|
423
|
-
if (
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
432
|
+
if (result==FAILURE) {
|
|
433
|
+
if (g_exception) {
|
|
434
|
+
VALUE exception = zval_to_value(g_exception);
|
|
435
|
+
g_exception = NULL;
|
|
436
|
+
rb_exc_raise(exception);
|
|
437
|
+
} else {
|
|
438
|
+
rb_raise(rb_ePHPError, "raise exception: %s", mptr->common.function_name);
|
|
439
|
+
}
|
|
429
440
|
}
|
|
430
441
|
|
|
431
442
|
return zval_to_value(z_val);
|
|
@@ -445,22 +456,13 @@ VALUE call_php_method_name_bridge(zend_class_entry *ce, zval *obj, VALUE callee,
|
|
|
445
456
|
find_zend_function(ce, RSTRING_PTR(callee), RSTRING_LEN(callee), &mptr);
|
|
446
457
|
|
|
447
458
|
// call
|
|
448
|
-
zval *z_val;
|
|
449
459
|
if (mptr) {
|
|
450
460
|
// call method
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
// exception
|
|
454
|
-
if (global_exception) {
|
|
455
|
-
VALUE exception = zval_to_value(global_exception);
|
|
456
|
-
global_exception = NULL;
|
|
457
|
-
rb_exc_raise(exception);
|
|
458
|
-
} else if (result==FAILURE) {
|
|
459
|
-
rb_raise(rb_ePHPError, "raise exception: %s", RSTRING_PTR(callee));
|
|
460
|
-
}
|
|
461
|
+
return call_php_method_bridge(ce, obj, mptr, argc, argv);
|
|
461
462
|
} else {
|
|
462
463
|
// accessor
|
|
463
464
|
VALUE is_setter = rb_funcall(callee, rb_intern("end_with?"), 1, rb_str_new2("="));
|
|
465
|
+
zval *z_val;
|
|
464
466
|
|
|
465
467
|
if (is_setter) {
|
|
466
468
|
// setter
|
|
@@ -488,10 +490,11 @@ VALUE call_php_method_name_bridge(zend_class_entry *ce, zval *obj, VALUE callee,
|
|
|
488
490
|
// static
|
|
489
491
|
z_val = zend_read_static_property(ce, RSTRING_PTR(callee), RSTRING_LEN(callee), 0 TSRMLS_CC);
|
|
490
492
|
}
|
|
493
|
+
return zval_to_value(z_val);
|
|
491
494
|
}
|
|
492
495
|
}
|
|
493
496
|
|
|
494
|
-
return
|
|
497
|
+
return Qnil;
|
|
495
498
|
}
|
|
496
499
|
|
|
497
500
|
void value_copy(VALUE dst, VALUE src)
|
|
@@ -664,6 +667,7 @@ VALUE define_global_constants()
|
|
|
664
667
|
zval *z_val;
|
|
665
668
|
int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
|
|
666
669
|
if (result==FAILURE) {
|
|
670
|
+
g_exception = NULL;
|
|
667
671
|
return Qfalse;
|
|
668
672
|
}
|
|
669
673
|
|
|
@@ -717,6 +721,7 @@ VALUE define_global_functions()
|
|
|
717
721
|
zval *z_val;
|
|
718
722
|
int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
|
|
719
723
|
if (result==FAILURE) {
|
|
724
|
+
g_exception = NULL;
|
|
720
725
|
return Qfalse;
|
|
721
726
|
}
|
|
722
727
|
|
|
@@ -756,6 +761,7 @@ VALUE define_global_classes()
|
|
|
756
761
|
zval *z_val;
|
|
757
762
|
int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
|
|
758
763
|
if (result==FAILURE) {
|
|
764
|
+
g_exception = NULL;
|
|
759
765
|
return Qfalse;
|
|
760
766
|
}
|
|
761
767
|
|
|
@@ -1335,7 +1341,7 @@ void Init_php_vm()
|
|
|
1335
1341
|
rb_define_singleton_method(rb_mPHPVM, "get_class", rb_php_vm_get_class, 1);
|
|
1336
1342
|
rb_define_singleton_method(rb_mPHPVM, "define_global", rb_php_vm_define_global, 0);
|
|
1337
1343
|
|
|
1338
|
-
rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.3.
|
|
1344
|
+
rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.3.8"));
|
|
1339
1345
|
|
|
1340
1346
|
rb_cv_set(rb_mPHPVM, "@@output_handler", Qnil);
|
|
1341
1347
|
rb_cv_set(rb_mPHPVM, "@@error_handler", Qnil);
|
data/ext/php_vm/php_vm_z2v.c
CHANGED