Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoyee Cheung <joyeec9h3@gmail.com>2020-04-19 22:51:05 +0300
committerAnna Henningsen <anna@addaleax.net>2020-05-06 07:44:04 +0300
commit86fdaa745572a3bec4370ac7bd05d18e6bf64c01 (patch)
tree45890dbc713ad29edd830fd2aa17f592909ccbb7 /src/README.md
parentf446b2058dcfaf9d4e2f6bdfe555bc4437f41acf (diff)
src: retrieve binding data from the context
Instead of passing them through the data bound to function templates, store references to them in a list embedded inside the context. This makes the function templates more context-independent, and makes it possible to embed binding data in non-main contexts. Co-authored-by: Anna Henningsen <anna@addaleax.net> PR-URL: https://github.com/nodejs/node/pull/33139 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Diffstat (limited to 'src/README.md')
-rw-r--r--src/README.md24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/README.md b/src/README.md
index e2b256fba20..f940da3fe24 100644
--- a/src/README.md
+++ b/src/README.md
@@ -400,16 +400,23 @@ NODE_MODULE_CONTEXT_AWARE_INTERNAL(cares_wrap, Initialize)
Some internal bindings, such as the HTTP parser, maintain internal state that
only affects that particular binding. In that case, one common way to store
-that state is through the use of `Environment::BindingScope`, which gives all
-new functions created within it access to an object for storing such state.
+that state is through the use of `Environment::AddBindingData`, which gives
+binding functions access to an object for storing such state.
That object is always a [`BaseObject`][].
+Its class needs to have a static `binding_data_name` field that based on a
+constant string, in order to disambiguate it from other classes of this type,
+and which could e.g. match the binding’s name (in the example above, that would
+be `cares_wrap`).
+
```c++
// In the HTTP parser source code file:
class BindingData : public BaseObject {
public:
BindingData(Environment* env, Local<Object> obj) : BaseObject(env, obj) {}
+ static constexpr FastStringKey binding_data_name { "http_parser" };
+
std::vector<char> parser_buffer;
bool parser_buffer_in_use = false;
@@ -418,22 +425,21 @@ class BindingData : public BaseObject {
// Available for binding functions, e.g. the HTTP Parser constructor:
static void New(const FunctionCallbackInfo<Value>& args) {
- BindingData* binding_data = Unwrap<BindingData>(args.Data());
+ BindingData* binding_data = Environment::GetBindingData<BindingData>(args);
new Parser(binding_data, args.This());
}
-// ... because the initialization function told the Environment to use this
-// BindingData class for all functions created by it:
+// ... because the initialization function told the Environment to store the
+// BindingData object:
void InitializeHttpParser(Local<Object> target,
Local<Value> unused,
Local<Context> context,
void* priv) {
Environment* env = Environment::GetCurrent(context);
- Environment::BindingScope<BindingData> binding_scope(env);
- if (!binding_scope) return;
- BindingData* binding_data = binding_scope.data;
+ BindingData* const binding_data =
+ env->AddBindingData<BindingData>(context, target);
+ if (binding_data == nullptr) return;
- // Created within the Environment::BindingScope
Local<FunctionTemplate> t = env->NewFunctionTemplate(Parser::New);
...
}