Skip to content

Commit 98b253e

Browse files
author
drswinghead
committed
add class manager
1 parent a8f0046 commit 98b253e

File tree

4 files changed

+168
-0
lines changed

4 files changed

+168
-0
lines changed

phpgo/class.c

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#include <assert.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include <stdint.h>
5+
#include <assert.h>
6+
7+
/**
8+
* PHP includes
9+
*/
10+
#include <php.h>
11+
#include <zend_exceptions.h>
12+
#include <zend_interfaces.h>
13+
#include <zend_ini.h>
14+
#include <SAPI.h>
15+
#include <zend_hash.h>
16+
#include <zend_API.h>
17+
18+
#ifdef ZTS
19+
#include "TSRM.h"
20+
#endif
21+
22+
#include "_cgo_export.h"
23+
24+
// #include "sztypes.h"
25+
#include "../zend/goapi.h"
26+
#include "../zend/clog.h"
27+
#include "uthash.h"
28+
#include "objectmap.h"
29+
30+
#include "class.h"
31+
32+
33+
struct _phpgo_class_entry {
34+
zend_class_entry *ce;
35+
phpgo_function_entry **fes;
36+
const char *class_name;
37+
int func_count;
38+
39+
phpgo_object_map *fmap;
40+
};
41+
42+
phpgo_class_entry* phpgo_class_new(const char *class_name) {
43+
phpgo_class_entry* pce = (phpgo_class_entry*)calloc(1, sizeof(phpgo_class_entry));
44+
memset(pce, 0, sizeof(phpgo_class_entry));
45+
pce->ce = (zend_class_entry*)calloc(1, sizeof(zend_class_entry));
46+
pce->fes = NULL;
47+
pce->class_name = class_name;
48+
pce->fmap = NULL;
49+
return pce;
50+
}
51+
52+
void phpgo_class_method_add(phpgo_class_entry* pce, const char *func_name) {
53+
int curr_index = -1;
54+
55+
if (pce->fes == NULL) {
56+
pce->fes = (phpgo_function_entry**)calloc(1, 1 * sizeof(phpgo_function_entry*));
57+
pce->func_count = 1;
58+
} else {
59+
pce->func_count += 1;
60+
pce->fes = (phpgo_function_entry**)realloc(pce->fes, pce->func_count * sizeof(phpgo_function_entry*));
61+
}
62+
63+
curr_index = pce->func_count - 1;
64+
pce->fes[curr_index] = phpgo_function_new(func_name);
65+
66+
phpgo_object_map_add(pce->fmap, func_name, pce->fes[curr_index]);
67+
}
68+
69+
phpgo_function_entry* phpgo_class_method_get(phpgo_class_entry* pce, const char *func_name) {
70+
phpgo_function_entry* pfe = (phpgo_function_entry*)phpgo_object_map_get(pce->fmap, func_name);
71+
if (pfe != NULL) {
72+
return pfe;
73+
}
74+
return NULL;
75+
}
76+
77+
// function operations
78+
struct _phpgo_function_entry {
79+
const char *func_name;
80+
zend_function_entry *fe;
81+
};
82+
83+
#ifdef ZEND_ENGINE_3
84+
extern void phpgo_function_handler(zend_execute_data *execute_data, zval *return_value);
85+
#else
86+
extern void phpgo_function_handler(int ht, zval *return_value, zval **return_value_ptr,
87+
zval *this_ptr, int return_value_used TSRMLS_DC);
88+
#endif
89+
90+
phpgo_function_entry *phpgo_function_new(const char *func_name) {
91+
phpgo_function_entry *pce = (phpgo_function_entry*)calloc(1, sizeof(phpgo_function_entry));
92+
pce->func_name = func_name;
93+
pce->fe = (zend_function_entry*)calloc(1, sizeof(zend_function_entry));
94+
95+
zend_function_entry *fe = pce->fe;
96+
zend_function_entry e = {strdup(func_name), phpgo_function_handler, NULL, 0, 0};
97+
memcpy(fe, &e, sizeof(e));
98+
99+
return pce;
100+
}
101+
102+
int phpgo_function_delete(phpgo_function_entry *pfe) {
103+
free((void*)(pfe->fe->fname));
104+
free(pfe);
105+
return 0;
106+
}
107+
108+
zend_function_entry* phpgo_function_get(phpgo_function_entry* pfe) {
109+
return pfe->fe;
110+
}

phpgo/class.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef _PHPGO_CLASS_H_
2+
#define _PHPGO_CLASS_H_
3+
4+
// struct _phpgo_function_entry;
5+
typedef struct _phpgo_function_entry phpgo_function_entry;
6+
7+
phpgo_function_entry *phpgo_function_new(const char *func_name);
8+
int phpgo_function_delete(phpgo_function_entry *pfe);
9+
zend_function_entry* phpgo_function_get(phpgo_function_entry* pfe);
10+
11+
///////
12+
// struct _phpgo_class_entry;
13+
typedef struct _phpgo_class_entry phpgo_class_entry;
14+
15+
phpgo_class_entry* phpgo_class_new(const char *class_name);
16+
void phpgo_class_method_add(phpgo_class_entry* pce, const char *func_name);
17+
phpgo_function_entry* phpgo_class_method_get(phpgo_class_entry* pce, const char *func_name);
18+
19+
#endif
20+

phpgo/objectmap.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ typedef struct _phpgo_callback_map {
3737
UT_hash_handle hh;
3838
} phpgo_callback_map;
3939

40+
struct _phpgo_object_map {
41+
const char *name;
42+
void *obj;
43+
UT_hash_handle hh;
44+
};
45+
4046
static phpgo_function_map *g_funcs_map = NULL;
4147
static phpgo_class_map *g_classes_map = NULL;
4248
static phpgo_callback_map *g_callbacks_map = NULL;
@@ -110,3 +116,29 @@ int phpgo_callback_map_get(const char *class_name, const char *func_name)
110116
}
111117

112118

119+
phpgo_object_map* phpgo_object_map_new() {
120+
phpgo_object_map *om = (phpgo_object_map*)malloc(sizeof(phpgo_object_map));
121+
return om;
122+
}
123+
124+
void phpgo_object_map_add(phpgo_object_map* om, const char *name, void* obj)
125+
{
126+
phpgo_object_map *m = (phpgo_object_map*)malloc(sizeof(phpgo_object_map));
127+
char *key = strdup(name);
128+
m->name = key;
129+
m->obj = obj;
130+
UTHASH_ADD_KEYPTR(hh, om, key, strlen(key), m);
131+
}
132+
133+
void* phpgo_object_map_get(phpgo_object_map* om, const char *name)
134+
{
135+
phpgo_object_map *m = NULL;
136+
const char *key = name;
137+
UTHASH_FIND_STR(om, key, m);
138+
if (m == NULL) {
139+
return NULL;
140+
}
141+
return m->obj;
142+
}
143+
144+

phpgo/objectmap.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ struct _zend_function_entry;
55
struct _zend_class_entry;
66
struct _zend_module_entry;
77

8+
typedef struct _phpgo_object_map phpgo_object_map;
9+
810
void phpgo_function_map_add(const char *class_name, const char *func_name, struct _zend_function_entry *fe);
911

1012
struct _zend_function_entry* phpgo_function_map_get(const char *class_name, const char *func_name);
@@ -17,5 +19,9 @@ void phpgo_callback_map_add(const char *class_name, const char *func_name, int c
1719

1820
int phpgo_callback_map_get(const char *class_name, const char *func_name);
1921

22+
phpgo_object_map *phpgo_object_map_new();
23+
void phpgo_object_map_add(phpgo_object_map* om, const char *name, void* obj);
24+
void* phpgo_object_map_get(phpgo_object_map* om, const char *name);
25+
2026
#endif
2127

0 commit comments

Comments
 (0)