Skip to content
This repository was archived by the owner on Mar 29, 2024. It is now read-only.

Commit 0ba3ba9

Browse files
committed
Add V8\UnboundScript class
1 parent 1342df9 commit 0ba3ba9

File tree

10 files changed

+584
-5
lines changed

10 files changed

+584
-5
lines changed

config.m4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ if test "$PHP_V8" != "no"; then
185185
src/php_v8_object_template.cc \
186186
src/php_v8_function_template.cc \
187187
src/php_v8_script.cc \
188+
src/php_v8_unbound_script.cc \
188189
src/php_v8_data.cc \
189190
src/php_v8_value.cc \
190191
src/php_v8_primitive.cc \

src/php_v8_script.cc

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "php_v8_script.h"
1818
#include "php_v8_script_origin.h"
19+
#include "php_v8_unbound_script.h"
1920
#include "php_v8_string.h"
2021
#include "php_v8_value.h"
2122
#include "php_v8.h"
@@ -186,13 +187,30 @@ static PHP_METHOD(V8Script, Run)
186187
v8::MaybeLocal<v8::Value> result = local_script->Run(context);
187188

188189
PHP_V8_MAYBE_CATCH(php_v8_script->php_v8_context, try_catch);
189-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(result, "Failed to create run script");
190+
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(result, "Failed to run script");
190191

191192
v8::Local<v8::Value> local_result = result.ToLocalChecked();
192193

193194
php_v8_get_or_create_value(return_value, local_result, isolate);
194195
}
195196

197+
static PHP_METHOD(V8Script, GetUnboundScript)
198+
{
199+
if (zend_parse_parameters_none() == FAILURE) {
200+
return;
201+
}
202+
203+
PHP_V8_FETCH_SCRIPT_WITH_CHECK(getThis(), php_v8_script);
204+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_script);
205+
PHP_V8_ENTER_STORED_CONTEXT(php_v8_script);
206+
207+
v8::Local<v8::Script> local_script = php_v8_script_get_local(isolate, php_v8_script);
208+
209+
v8::Local<v8::UnboundScript> unbound_script = local_script->GetUnboundScript();
210+
211+
php_v8_create_unbound_script(return_value, php_v8_script->php_v8_isolate, unbound_script);
212+
}
213+
196214

197215
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_script___construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 2)
198216
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
@@ -210,13 +228,17 @@ PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_script_Run, ZEND_RETURN
210228
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
211229
ZEND_END_ARG_INFO()
212230

231+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_script_GetUnboundScript, ZEND_RETURN_VALUE, 0, V8\\UnboundScript, 0)
232+
ZEND_END_ARG_INFO()
233+
213234

214235
static const zend_function_entry php_v8_script_methods[] = {
215236
PHP_ME(V8Script, __construct, arginfo_v8_script___construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
216237
PHP_ME(V8Script, GetIsolate, arginfo_v8_script_GetIsolate, ZEND_ACC_PUBLIC)
217238
PHP_ME(V8Script, GetContext, arginfo_v8_script_GetContext, ZEND_ACC_PUBLIC)
218239

219240
PHP_ME(V8Script, Run, arginfo_v8_script_Run, ZEND_ACC_PUBLIC)
241+
PHP_ME(V8Script, GetUnboundScript, arginfo_v8_script_GetUnboundScript, ZEND_ACC_PUBLIC)
220242

221243
PHP_FE_END
222244
};

src/php_v8_unbound_script.cc

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
/*
2+
* This file is part of the pinepain/php-v8 PHP extension.
3+
*
4+
* Copyright (c) 2015-2017 Bogdan Padalko <[email protected]>
5+
*
6+
* Licensed under the MIT license: http://opensource.org/licenses/MIT
7+
*
8+
* For the full copyright and license information, please view the
9+
* LICENSE file that was distributed with this source or visit
10+
* http://opensource.org/licenses/MIT
11+
*/
12+
13+
#ifdef HAVE_CONFIG_H
14+
#include "config.h"
15+
#endif
16+
17+
#include "php_v8_unbound_script.h"
18+
#include "php_v8_script.h"
19+
#include "php_v8_string.h"
20+
#include "php_v8_value.h"
21+
#include "php_v8.h"
22+
23+
zend_class_entry* php_v8_unbound_script_class_entry;
24+
#define this_ce php_v8_unbound_script_class_entry
25+
26+
static zend_object_handlers php_v8_unbound_script_object_handlers;
27+
28+
29+
v8::Local<v8::UnboundScript> php_v8_unbound_script_get_local(v8::Isolate *isolate, php_v8_unbound_script_t *php_v8_unbound_script) {
30+
return v8::Local<v8::UnboundScript>::New(isolate, *php_v8_unbound_script->persistent);
31+
}
32+
33+
php_v8_unbound_script_t * php_v8_unbound_script_fetch_object(zend_object *obj) {
34+
return (php_v8_unbound_script_t *)((char *)obj - XtOffsetOf(php_v8_unbound_script_t, std));
35+
}
36+
37+
php_v8_unbound_script_t * php_v8_create_unbound_script(zval *return_value, php_v8_isolate_t *php_v8_isolate, v8::Local<v8::UnboundScript> unbound_script) {
38+
assert(!unbound_script.IsEmpty());
39+
40+
object_init_ex(return_value, this_ce);
41+
42+
PHP_V8_FETCH_UNBOUND_SCRIPT_INTO(return_value, php_v8_unbound_script);
43+
PHP_V8_UNBOUND_SCRIPT_STORE_ISOLATE(return_value, &php_v8_isolate->this_ptr)
44+
PHP_V8_STORE_POINTER_TO_ISOLATE(php_v8_unbound_script, php_v8_isolate);
45+
46+
php_v8_unbound_script->persistent->Reset(php_v8_isolate->isolate, unbound_script);
47+
48+
return php_v8_unbound_script;
49+
}
50+
51+
52+
static void php_v8_unbound_script_free(zend_object *object)
53+
{
54+
php_v8_unbound_script_t *php_v8_unbound_script = php_v8_unbound_script_fetch_object(object);
55+
56+
if (php_v8_unbound_script->persistent) {
57+
if (PHP_V8_ISOLATE_HAS_VALID_HANDLE(php_v8_unbound_script)) {
58+
php_v8_unbound_script->persistent->Reset();
59+
}
60+
delete php_v8_unbound_script->persistent;
61+
}
62+
63+
zend_object_std_dtor(&php_v8_unbound_script->std);
64+
}
65+
66+
static zend_object * php_v8_unbound_script_ctor(zend_class_entry *ce)
67+
{
68+
php_v8_unbound_script_t *php_v8_unbound_script;
69+
70+
php_v8_unbound_script = (php_v8_unbound_script_t *) ecalloc(1, sizeof(php_v8_unbound_script_t) + zend_object_properties_size(ce));
71+
72+
zend_object_std_init(&php_v8_unbound_script->std, ce);
73+
object_properties_init(&php_v8_unbound_script->std, ce);
74+
75+
php_v8_unbound_script->persistent = new v8::Persistent<v8::UnboundScript>();
76+
77+
php_v8_unbound_script->std.handlers = &php_v8_unbound_script_object_handlers;
78+
79+
return &php_v8_unbound_script->std;
80+
}
81+
82+
static PHP_METHOD(V8UnboundScript, __construct)
83+
{
84+
if (zend_parse_parameters_none() == FAILURE) {
85+
return;
86+
}
87+
88+
PHP_V8_THROW_EXCEPTION("V8\\UnboundScript::__construct() should not be called. Use other methods which yield V8\\UnboundScript object.")
89+
}
90+
91+
static PHP_METHOD(V8UnboundScript, GetIsolate)
92+
{
93+
zval rv;
94+
95+
if (zend_parse_parameters_none() == FAILURE) {
96+
return;
97+
}
98+
99+
PHP_V8_FETCH_UNBOUND_SCRIPT_WITH_CHECK(getThis(), php_v8_unbound_script);
100+
101+
RETVAL_ZVAL(PHP_V8_UNBOUND_SCRIPT_READ_ISOLATE(getThis()), 1, 0);
102+
}
103+
104+
static PHP_METHOD(V8UnboundScript, BindToContext)
105+
{
106+
zval *php_v8_context_zv;
107+
108+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &php_v8_context_zv) == FAILURE) {
109+
return;
110+
}
111+
112+
PHP_V8_FETCH_UNBOUND_SCRIPT_WITH_CHECK(getThis(), php_v8_unbound_script);
113+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
114+
115+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_unbound_script, php_v8_context);
116+
117+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_context);
118+
PHP_V8_ENTER_CONTEXT(php_v8_context);
119+
120+
v8::Local<v8::UnboundScript> local_unbound_script = php_v8_unbound_script_get_local(isolate, php_v8_unbound_script);
121+
v8::Local<v8::Script> local_script = local_unbound_script->BindToCurrentContext();
122+
123+
124+
125+
php_v8_create_script(return_value, local_script, php_v8_context);
126+
}
127+
128+
static PHP_METHOD(V8UnboundScript, GetId)
129+
{
130+
if (zend_parse_parameters_none() == FAILURE) {
131+
return;
132+
}
133+
134+
PHP_V8_FETCH_UNBOUND_SCRIPT_WITH_CHECK(getThis(), php_v8_unbound_script);
135+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_unbound_script);
136+
137+
v8::Local<v8::UnboundScript> local_unbound_script = php_v8_unbound_script_get_local(isolate, php_v8_unbound_script);
138+
139+
RETURN_LONG(static_cast<zend_long>(local_unbound_script->GetId()));
140+
}
141+
142+
static PHP_METHOD(V8UnboundScript, GetScriptName)
143+
{
144+
if (zend_parse_parameters_none() == FAILURE) {
145+
return;
146+
}
147+
148+
PHP_V8_FETCH_UNBOUND_SCRIPT_WITH_CHECK(getThis(), php_v8_unbound_script);
149+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_unbound_script);
150+
151+
v8::Local<v8::UnboundScript> local_unbound_script = php_v8_unbound_script_get_local(isolate, php_v8_unbound_script);
152+
153+
php_v8_get_or_create_value(return_value, local_unbound_script->GetScriptName(), isolate);
154+
}
155+
156+
static PHP_METHOD(V8UnboundScript, GetSourceURL)
157+
{
158+
if (zend_parse_parameters_none() == FAILURE) {
159+
return;
160+
}
161+
162+
PHP_V8_FETCH_UNBOUND_SCRIPT_WITH_CHECK(getThis(), php_v8_unbound_script);
163+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_unbound_script);
164+
165+
v8::Local<v8::UnboundScript> local_unbound_script = php_v8_unbound_script_get_local(isolate, php_v8_unbound_script);
166+
167+
php_v8_get_or_create_value(return_value, local_unbound_script->GetSourceURL(), isolate);
168+
}
169+
170+
static PHP_METHOD(V8UnboundScript, GetSourceMappingURL)
171+
{
172+
if (zend_parse_parameters_none() == FAILURE) {
173+
return;
174+
}
175+
176+
PHP_V8_FETCH_UNBOUND_SCRIPT_WITH_CHECK(getThis(), php_v8_unbound_script);
177+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_unbound_script);
178+
179+
v8::Local<v8::UnboundScript> local_unbound_script = php_v8_unbound_script_get_local(isolate, php_v8_unbound_script);
180+
181+
php_v8_get_or_create_value(return_value, local_unbound_script->GetSourceMappingURL(), isolate);
182+
}
183+
184+
static PHP_METHOD(V8UnboundScript, GetLineNumber)
185+
{
186+
zend_long code_pos = 0;
187+
188+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &code_pos) == FAILURE) {
189+
return;
190+
}
191+
192+
PHP_V8_CHECK_CODE_POS_RANGE(code_pos, "Value is out of range");
193+
194+
PHP_V8_FETCH_UNBOUND_SCRIPT_WITH_CHECK(getThis(), php_v8_unbound_script);
195+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_unbound_script);
196+
197+
v8::Local<v8::UnboundScript> local_unbound_script = php_v8_unbound_script_get_local(isolate, php_v8_unbound_script);
198+
199+
RETURN_LONG(static_cast<zend_long>(local_unbound_script->GetLineNumber(static_cast<int>(code_pos))));
200+
}
201+
202+
203+
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_unbound_script___construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
204+
ZEND_END_ARG_INFO()
205+
206+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_unbound_script_GetIsolate, ZEND_RETURN_VALUE, 0, V8\\Isolate, 0)
207+
ZEND_END_ARG_INFO()
208+
209+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_unbound_script_BindToContext, ZEND_RETURN_VALUE, 1, V8\\Script, 0)
210+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
211+
ZEND_END_ARG_INFO()
212+
213+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_unbound_script_GetId, ZEND_RETURN_VALUE, 0, IS_LONG, 0)
214+
ZEND_END_ARG_INFO()
215+
216+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_unbound_script_GetScriptName, ZEND_RETURN_VALUE, 0, V8\\Value, 0)
217+
ZEND_END_ARG_INFO()
218+
219+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_unbound_script_GetSourceURL, ZEND_RETURN_VALUE, 0, V8\\Value, 0)
220+
ZEND_END_ARG_INFO()
221+
222+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_unbound_script_GetSourceMappingURL, ZEND_RETURN_VALUE, 0, V8\\Value, 0)
223+
ZEND_END_ARG_INFO()
224+
225+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_unbound_script_GetLineNumber, ZEND_RETURN_VALUE, 1, IS_LONG, 0)
226+
ZEND_ARG_TYPE_INFO(0, code_pos, IS_LONG, 0)
227+
ZEND_END_ARG_INFO()
228+
229+
230+
static const zend_function_entry php_v8_unbound_script_methods[] = {
231+
PHP_ME(V8UnboundScript, __construct, arginfo_v8_unbound_script___construct, ZEND_ACC_PRIVATE | ZEND_ACC_CTOR)
232+
PHP_ME(V8UnboundScript, GetIsolate, arginfo_v8_unbound_script_GetIsolate, ZEND_ACC_PUBLIC)
233+
PHP_ME(V8UnboundScript, BindToContext, arginfo_v8_unbound_script_BindToContext, ZEND_ACC_PUBLIC)
234+
PHP_ME(V8UnboundScript, GetId, arginfo_v8_unbound_script_GetId, ZEND_ACC_PUBLIC)
235+
PHP_ME(V8UnboundScript, GetScriptName, arginfo_v8_unbound_script_GetScriptName, ZEND_ACC_PUBLIC)
236+
PHP_ME(V8UnboundScript, GetSourceURL, arginfo_v8_unbound_script_GetSourceURL, ZEND_ACC_PUBLIC)
237+
PHP_ME(V8UnboundScript, GetSourceMappingURL, arginfo_v8_unbound_script_GetSourceMappingURL, ZEND_ACC_PUBLIC)
238+
PHP_ME(V8UnboundScript, GetLineNumber, arginfo_v8_unbound_script_GetLineNumber, ZEND_ACC_PUBLIC)
239+
240+
PHP_FE_END
241+
};
242+
243+
244+
PHP_MINIT_FUNCTION(php_v8_unbound_script)
245+
{
246+
zend_class_entry ce;
247+
248+
INIT_NS_CLASS_ENTRY(ce, PHP_V8_NS, "UnboundScript", php_v8_unbound_script_methods);
249+
this_ce = zend_register_internal_class(&ce);
250+
this_ce->create_object = php_v8_unbound_script_ctor;
251+
252+
zend_declare_property_null(this_ce, ZEND_STRL("isolate"), ZEND_ACC_PRIVATE);
253+
zend_declare_class_constant_long(this_ce, ZEND_STRL("kNoScriptId"), v8::UnboundScript::kNoScriptId);
254+
255+
memcpy(&php_v8_unbound_script_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
256+
257+
php_v8_unbound_script_object_handlers.offset = XtOffsetOf(php_v8_unbound_script_t, std);
258+
php_v8_unbound_script_object_handlers.free_obj = php_v8_unbound_script_free;
259+
260+
return SUCCESS;
261+
}

src/php_v8_unbound_script.h

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* This file is part of the pinepain/php-v8 PHP extension.
3+
*
4+
* Copyright (c) 2015-2017 Bogdan Padalko <[email protected]>
5+
*
6+
* Licensed under the MIT license: http://opensource.org/licenses/MIT
7+
*
8+
* For the full copyright and license information, please view the
9+
* LICENSE file that was distributed with this source or visit
10+
* http://opensource.org/licenses/MIT
11+
*/
12+
13+
#ifndef PHP_V8_UNBOUND_SCRIPT_H
14+
#define PHP_V8_UNBOUND_SCRIPT_H
15+
16+
typedef struct _php_v8_unbound_script_t php_v8_unbound_script_t;
17+
18+
#include "php_v8_exception.h"
19+
#include "php_v8_context.h"
20+
#include "php_v8_isolate.h"
21+
#include <v8.h>
22+
23+
extern "C" {
24+
#include "php.h"
25+
26+
#ifdef ZTS
27+
#include "TSRM.h"
28+
#endif
29+
}
30+
31+
extern zend_class_entry *php_v8_unbound_script_class_entry;
32+
33+
extern v8::Local<v8::UnboundScript> php_v8_unbound_script_get_local(v8::Isolate *isolate, php_v8_unbound_script_t *php_v8_unbound_script);
34+
extern php_v8_unbound_script_t * php_v8_unbound_script_fetch_object(zend_object *obj);
35+
extern php_v8_unbound_script_t * php_v8_create_unbound_script(zval *return_value, php_v8_isolate_t *php_v8_isolate, v8::Local<v8::UnboundScript> unbound_script);
36+
37+
38+
#define PHP_V8_FETCH_UNBOUND_SCRIPT(zv) php_v8_unbound_script_fetch_object(Z_OBJ_P(zv))
39+
#define PHP_V8_FETCH_UNBOUND_SCRIPT_INTO(pzval, into) php_v8_unbound_script_t *(into) = PHP_V8_FETCH_UNBOUND_SCRIPT((pzval))
40+
41+
#define PHP_V8_EMPTY_UNBOUND_SCRIPT_MSG "UnboundScript" PHP_V8_EMPTY_HANDLER_MSG_PART
42+
#define PHP_V8_CHECK_EMPTY_UNBOUND_SCRIPT_HANDLER(val) PHP_V8_CHECK_EMPTY_HANDLER((val), PHP_V8_EMPTY_UNBOUND_SCRIPT_MSG)
43+
44+
#define PHP_V8_FETCH_UNBOUND_SCRIPT_WITH_CHECK(pzval, into) \
45+
PHP_V8_FETCH_UNBOUND_SCRIPT_INTO(pzval, into); \
46+
PHP_V8_CHECK_EMPTY_UNBOUND_SCRIPT_HANDLER(into);
47+
48+
49+
#define PHP_V8_UNBOUND_SCRIPT_STORE_ISOLATE(to_zval, isolate_zv) zend_update_property(php_v8_unbound_script_class_entry, (to_zval), ZEND_STRL("isolate"), (isolate_zv));
50+
#define PHP_V8_UNBOUND_SCRIPT_READ_ISOLATE(from_zval) zend_read_property(php_v8_unbound_script_class_entry, (from_zval), ZEND_STRL("isolate"), 0, &rv)
51+
52+
#define PHP_V8_CHECK_CODE_POS_RANGE(val, message) \
53+
if ((val) > INT_MAX || (val) < INT_MIN) { \
54+
PHP_V8_THROW_VALUE_EXCEPTION(message); \
55+
return; \
56+
}
57+
58+
struct _php_v8_unbound_script_t {
59+
php_v8_isolate_t *php_v8_isolate;
60+
uint32_t isolate_handle;
61+
62+
v8::Persistent<v8::UnboundScript> *persistent;
63+
64+
zend_object std;
65+
};
66+
67+
PHP_MINIT_FUNCTION(php_v8_unbound_script);
68+
69+
#endif //PHP_V8_UNBOUND_SCRIPT_H

0 commit comments

Comments
 (0)