php_vm 1.1.2 → 1.2.0

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.
Files changed (3) hide show
  1. data/ext/php_vm/php_vm.c +156 -3
  2. data/ext/php_vm/php_vm.h +9 -1
  3. metadata +1 -1
data/ext/php_vm/php_vm.c CHANGED
@@ -7,6 +7,7 @@
7
7
  // global
8
8
 
9
9
  VALUE rb_mPHPVM;
10
+ VALUE rb_mPHPGlobal;
10
11
  VALUE rb_cPHPClass;
11
12
  VALUE rb_cPHPObject;
12
13
  VALUE rb_ePHPError;
@@ -456,11 +457,155 @@ VALUE rb_php_vm_exec(VALUE cls, VALUE code)
456
457
  return Qnil;
457
458
  }
458
459
 
459
- VALUE rb_php_vm_getClass(VALUE cls, VALUE v_class_name)
460
+ VALUE rb_php_vm_get_class(VALUE cls, VALUE v_class_name)
460
461
  {
461
462
  return rb_php_class_get(rb_cPHPClass, v_class_name);
462
463
  }
463
464
 
465
+ VALUE rb_php_vm_define_global_constants(VALUE cls)
466
+ {
467
+ TSRMLS_FETCH();
468
+
469
+ // method
470
+ zend_function *mptr;
471
+ find_zend_function(NULL, "get_defined_constants", strlen("get_defined_constants"), &mptr);
472
+ if (!mptr) {
473
+ return Qfalse;
474
+ }
475
+
476
+ // call method
477
+ zval *z_val;
478
+ int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
479
+ if (result==FAILURE) {
480
+ return Qfalse;
481
+ }
482
+
483
+ HashTable* ht = Z_ARRVAL_P(z_val);
484
+ HashPosition pos;
485
+ zval** data;
486
+
487
+ zend_hash_internal_pointer_reset_ex(ht, &pos);
488
+ while (SUCCESS == zend_hash_get_current_data_ex(ht, (void **)&data, &pos)) {
489
+ char *string_key;
490
+ ulong num_index;
491
+
492
+ switch(zend_hash_get_current_key_ex(ht, &string_key, NULL, &num_index, 0, &pos)) {
493
+ case HASH_KEY_IS_STRING:{
494
+ if (0x61<=string_key[0] && string_key[0]<=0x7a) {
495
+ // lower case
496
+ char *string_key2 = malloc(strlen(string_key));
497
+ string_key2[0] = string_key2[0]-32;
498
+ if (!rb_const_defined(rb_mPHPGlobal, rb_intern(string_key2))) {
499
+ rb_define_const(rb_mPHPGlobal, string_key2, zval_to_value(*data));
500
+ }
501
+ free(string_key2);
502
+ } else {
503
+ // upper case
504
+ if (!rb_const_defined(rb_mPHPGlobal, rb_intern(string_key))) {
505
+ rb_define_const(rb_mPHPGlobal, string_key, zval_to_value(*data));
506
+ }
507
+ }
508
+ break;
509
+ }
510
+ }
511
+
512
+ zend_hash_move_forward_ex(ht, &pos);
513
+ }
514
+ return Qtrue;
515
+ }
516
+
517
+ VALUE rb_php_vm_define_global_functions(VALUE cls)
518
+ {
519
+ TSRMLS_FETCH();
520
+
521
+ // method
522
+ zend_function *mptr;
523
+ find_zend_function(NULL, "get_defined_functions", strlen("get_defined_functions"), &mptr);
524
+ if (!mptr) {
525
+ return Qfalse;
526
+ }
527
+
528
+ // call method
529
+ zval *z_val;
530
+ int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
531
+ if (result==FAILURE) {
532
+ return Qfalse;
533
+ }
534
+
535
+ HashTable* ht = Z_ARRVAL_P(z_val);
536
+ HashPosition pos;
537
+ zval** data;
538
+
539
+ zend_hash_internal_pointer_reset_ex(ht, &pos);
540
+ while (SUCCESS == zend_hash_get_current_data_ex(ht, (void **)&data, &pos)) {
541
+ HashTable* ht2 = Z_ARRVAL_P(*data);
542
+ HashPosition pos2;
543
+ zval** data2;
544
+
545
+ zend_hash_internal_pointer_reset_ex(ht2, &pos2);
546
+ while (SUCCESS == zend_hash_get_current_data_ex(ht2, (void **)&data2, &pos2)) {
547
+ rb_define_module_function(rb_mPHPGlobal, Z_STRVAL_P(*data2), rb_php_global_function_call, -1);
548
+ zend_hash_move_forward_ex(ht2, &pos2);
549
+ }
550
+
551
+ zend_hash_move_forward_ex(ht, &pos);
552
+ }
553
+ return Qtrue;
554
+ }
555
+
556
+ VALUE rb_php_vm_define_global_classes(VALUE cls)
557
+ {
558
+ TSRMLS_FETCH();
559
+
560
+ // method
561
+ zend_function *mptr;
562
+ find_zend_function(NULL, "get_declared_classes", strlen("get_declared_classes"), &mptr);
563
+ if (!mptr) {
564
+ return Qfalse;
565
+ }
566
+
567
+ // call method
568
+ zval *z_val;
569
+ int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
570
+ if (result==FAILURE) {
571
+ return Qfalse;
572
+ }
573
+
574
+ HashTable* ht = Z_ARRVAL_P(z_val);
575
+ HashPosition pos;
576
+ zval** data;
577
+
578
+ zend_hash_internal_pointer_reset_ex(ht, &pos);
579
+ while (SUCCESS == zend_hash_get_current_data_ex(ht, (void **)&data, &pos)) {
580
+ rb_define_module_function(rb_mPHPGlobal, Z_STRVAL_P(*data), rb_php_global_class_call, 0);
581
+ zend_hash_move_forward_ex(ht, &pos);
582
+ }
583
+ return Qtrue;
584
+ }
585
+
586
+ VALUE rb_php_vm_define_global(VALUE cls)
587
+ {
588
+ VALUE res1 = rb_php_vm_define_global_constants(cls);
589
+ VALUE res2 = rb_php_vm_define_global_functions(cls);
590
+ VALUE res3 = rb_php_vm_define_global_classes(cls);
591
+ return res1==Qtrue && res2==Qtrue && res3==Qtrue;
592
+ }
593
+
594
+
595
+ // module PHPVM::PHPGlobal
596
+
597
+ VALUE rb_php_global_function_call(int argc, VALUE *argv, VALUE self)
598
+ {
599
+ VALUE callee = get_callee_name();
600
+ return call_php_method_bridge(NULL, NULL, callee, argc, argv);
601
+ }
602
+
603
+ VALUE rb_php_global_class_call(VALUE self)
604
+ {
605
+ VALUE callee = get_callee_name();
606
+ return rb_php_class_get(rb_cPHPClass, callee);
607
+ }
608
+
464
609
 
465
610
  // class PHPVM::PHPClass
466
611
 
@@ -654,9 +799,17 @@ void Init_php_vm()
654
799
  rb_define_singleton_method(rb_mPHPVM, "require", rb_php_vm_require, 1);
655
800
  rb_define_singleton_method(rb_mPHPVM, "require_once", rb_php_vm_require_once, 1);
656
801
  rb_define_singleton_method(rb_mPHPVM, "exec", rb_php_vm_exec, 1);
657
- rb_define_singleton_method(rb_mPHPVM, "getClass", rb_php_vm_getClass, 1);
802
+ rb_define_singleton_method(rb_mPHPVM, "get_class", rb_php_vm_get_class, 1);
803
+ rb_define_singleton_method(rb_mPHPVM, "define_global_constants", rb_php_vm_define_global_constants, 0);
804
+ rb_define_singleton_method(rb_mPHPVM, "define_global_functions", rb_php_vm_define_global_functions, 0);
805
+ rb_define_singleton_method(rb_mPHPVM, "define_global_classes", rb_php_vm_define_global_classes, 0);
806
+ rb_define_singleton_method(rb_mPHPVM, "define_global", rb_php_vm_define_global, 0);
807
+
808
+ rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.2.0"));
658
809
 
659
- rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.1.2"));
810
+ // module PHPVM::PHPGlobal
811
+ rb_mPHPGlobal = rb_define_module_under(rb_mPHPVM, "PHPGlobal");
812
+ rb_php_vm_define_global(rb_mPHPVM);
660
813
 
661
814
  // class PHPVM::PHPClass
662
815
  rb_cPHPClass = rb_define_class_under(rb_mPHPVM, "PHPClass", rb_cObject);
data/ext/php_vm/php_vm.h CHANGED
@@ -43,7 +43,15 @@ extern zval* get_zval(VALUE self);
43
43
  // module PHPVM
44
44
  extern VALUE rb_php_vm_require(VALUE cls, VALUE rbv_filepath);
45
45
  extern VALUE rb_php_vm_exec(VALUE cls, VALUE rbv_code);
46
- extern VALUE rb_php_vm_getClass(VALUE cls, VALUE rbv_class_name);
46
+ extern VALUE rb_php_vm_get_class(VALUE cls, VALUE rbv_class_name);
47
+ extern VALUE rb_php_vm_define_global_constants(VALUE cls);
48
+ extern VALUE rb_php_vm_define_global_functions(VALUE cls);
49
+ extern VALUE rb_php_vm_define_global_classes(VALUE cls);
50
+ extern VALUE rb_php_vm_define_global(VALUE cls);
51
+
52
+ // module PHPVM::PHPGlobal
53
+ extern VALUE rb_php_global_function_call(int argc, VALUE *argv, VALUE self);
54
+ extern VALUE rb_php_global_class_call(VALUE self);
47
55
 
48
56
  // class PHPVM::PHPClass
49
57
  extern VALUE rb_php_class_get(VALUE cls, VALUE rbv_name);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: php_vm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: