From 1c7e355937d4ced59571b7e9420970bc5c0e143f Mon Sep 17 00:00:00 2001 From: Stefan Siegl Date: Sun, 12 Nov 2017 16:25:59 +0100 Subject: [PATCH] allow modules to return arbitrary values --- tests/commonjs_node_compat_002.phpt | 29 +++++++++++++++++++++++++++++ v8js_class.cc | 4 ++-- v8js_class.h | 3 ++- v8js_methods.cc | 6 +++--- 4 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 tests/commonjs_node_compat_002.phpt diff --git a/tests/commonjs_node_compat_002.phpt b/tests/commonjs_node_compat_002.phpt new file mode 100644 index 0000000..2ee279f --- /dev/null +++ b/tests/commonjs_node_compat_002.phpt @@ -0,0 +1,29 @@ +--TEST-- +Test V8Js::setModuleLoader : modules can return arbitrary values +--SKIPIF-- + +--FILE-- +setModuleLoader(function ($moduleName) { + return <<<'EOJS' + module.exports = 23; +EOJS + ; +}); + +$v8->executeString(<<<'EOJS' + var result = require('foo'); + var_dump(typeof result); + var_dump(result); +EOJS +); + +?> +===EOF=== +--EXPECT-- +string(6) "number" +int(23) +===EOF=== diff --git a/v8js_class.cc b/v8js_class.cc index db3fcdd..4aa4c54 100644 --- a/v8js_class.cc +++ b/v8js_class.cc @@ -182,7 +182,7 @@ static void v8js_free_storage(zend_object *object) /* {{{ */ c->script_objects.~vector(); /* Clear persistent handles in module cache */ - for (std::map::iterator it = c->modules_loaded.begin(); + for (std::map::iterator it = c->modules_loaded.begin(); it != c->modules_loaded.end(); ++it) { efree(it->first); it->second.Reset(); @@ -227,7 +227,7 @@ static zend_object* v8js_new(zend_class_entry *ce) /* {{{ */ new(&c->modules_stack) std::vector(); new(&c->modules_base) std::vector(); - new(&c->modules_loaded) std::map; + new(&c->modules_loaded) std::map; new(&c->template_cache) std::map(); new(&c->accessor_list) std::vector(); diff --git a/v8js_class.h b/v8js_class.h index e05b061..4886754 100644 --- a/v8js_class.h +++ b/v8js_class.h @@ -20,6 +20,7 @@ typedef v8::Persistent > v8js_function_tmpl_t; typedef v8::Persistent > v8js_object_tmpl_t; typedef v8::Persistent > v8js_persistent_obj_t; +typedef v8::Persistent > v8js_persistent_value_t; /* Forward declarations */ struct v8js_v8object; @@ -57,7 +58,7 @@ struct v8js_ctx { std::vector modules_stack; std::vector modules_base; - std::map modules_loaded; + std::map modules_loaded; std::map template_cache; std::map weak_objects; diff --git a/v8js_methods.cc b/v8js_methods.cc index ac69d64..6fb4c03 100644 --- a/v8js_methods.cc +++ b/v8js_methods.cc @@ -336,7 +336,7 @@ V8JS_METHOD(require) // If we have already loaded and cached this module then use it if (c->modules_loaded.count(normalised_module_id) > 0) { - v8::Persistent newobj; + v8::Persistent newobj; newobj.Reset(isolate, c->modules_loaded[normalised_module_id]); info.GetReturnValue().Set(newobj); @@ -492,12 +492,12 @@ V8JS_METHOD(require) return; } - v8::Local newobj; + v8::Local newobj; // Cache the module so it doesn't need to be compiled and run again // Ensure compatibility with CommonJS implementations such as NodeJS by playing nicely with module.exports and exports if (module->Has(V8JS_SYM("exports"))) { - newobj = module->Get(V8JS_SYM("exports"))->ToObject(); + newobj = module->Get(V8JS_SYM("exports")); } c->modules_loaded[normalised_module_id].Reset(isolate, newobj);