I believe this is the change you wanted me to do:

Local<Object> HTTPBody::WrapHTTPBodyMap() {
  EscapableHandleScope handle_scope(GetIsolate());

  Local<FunctionTemplate> body_map_template = 
FunctionTemplate::New(GetIsolate());
  body_map_template->InstanceTemplate()->SetHandler(
          NamedPropertyHandlerConfiguration(NULL, HTTPBodySet));
  body_map_template->InstanceTemplate()->SetInternalFieldCount(1);
  Local<Object> result = body_map_template->GetFunction()->NewInstance();

  Local<External> map_ptr = External::New(GetIsolate(), &http_body);

  result->SetInternalField(0, map_ptr);

  return handle_scope.Escape(result);
}

This didn’t help. I’ll share a standalone program that simulates problem I see, 
maybe that would help you to see what the problem could be? Would be some bit 
of effort for me, but will do given it will be very useful to have nested c++ 
maps exposed to JS.

> On 28-Jul-2016, at 12:54 PM, Jochen Eisinger <[email protected]> wrote:
> 
> I guess you should use function templates here.
> 
> Local<FunctionTemplate> body_map_template = FunctionTemplate::New(isolate);
> body_map_template->InstanceTemplate()->SetHandler(...)
> body_map_template->InstanceTemplate()->SetInternalFieldCount(1);
> result = body_map_template->GetFunction()->NewInstance();
> 
> On Wed, Jul 27, 2016 at 4:27 PM Abhishek Singh <[email protected] 
> <mailto:[email protected]>> wrote:
> Hi Jochen,
> 
> Full code of relevant file available - http://pastebin.com/fZJENvSi 
> <http://pastebin.com/fZJENvSi>
> 
> Snippet of relevant portions for WrapHTTPBodyMap:
> 
> Local<ObjectTemplate> HTTPBody::MakeHTTPBodyMapTemplate(
>     Isolate* isolate) {
>   EscapableHandleScope handle_scope(isolate);
> 
>   Local<ObjectTemplate> result = ObjectTemplate::New(isolate);
>   result->SetInternalFieldCount(1);
>   result->SetHandler(NamedPropertyHandlerConfiguration(NULL,
>                                                        HTTPBodySet));
> 
>   return handle_scope.Escape(result);
> }
> 
> Local<Object> HTTPBody::WrapHTTPBodyMap() {
>   EscapableHandleScope handle_scope(GetIsolate());
> 
>   if (http_body_map_template_.IsEmpty()) {
>     Local<ObjectTemplate> raw_template = 
> MakeHTTPBodyMapTemplate(GetIsolate());
>     http_body_map_template_.Reset(GetIsolate(), raw_template);
>   }
>   Local<ObjectTemplate> templ =
>       Local<ObjectTemplate>::New(GetIsolate(), http_body_map_template_);
> 
>   Local<Object> result =
>       templ->NewInstance(GetIsolate()->GetCurrentContext()).ToLocalChecked();
> 
>   Local<External> map_ptr = External::New(GetIsolate(), &http_body);
> 
>   result->SetInternalField(0, map_ptr);
> 
>   return handle_scope.Escape(result);
> }
> 
> 
>> On 27-Jul-2016, at 7:47 PM, Jochen Eisinger <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Can you provide a complete example? I suspect that WrapHTTPBodyMap doesn't 
>> do what you expect it does
>> 
>> On Tue, Jul 26, 2016 at 1:04 PM Abhishek Singh <[email protected] 
>> <mailto:[email protected]>> wrote:
>> Would you mind guiding me a bit here? For now just trying to expose nested 
>> “body” map i.e. to allow something like “response.body.result = 
>> dbQueryResult"
>> 
>> First is the Set interceptor for “response” (C++ object) and here I’m 
>> setting up “body” (C++ object for “body”) & setting return value to “body” 
>> object. Second one is Set interceptor for “body”
>> 
>> void HTTPResponse::HTTPResponseSet(Local<Name> name, Local<Value> value_obj,
>>                                    const PropertyCallbackInfo<Value>& info) {
>>   if (name->IsSymbol()) return;
>> 
>>   V8Handle* w = UnwrapV8HandleInstance(info.Holder());
>>   HTTPBody* body = new HTTPBody(w);
>> 
>>   Local<Object> body_map = body->WrapHTTPBodyMap();
>>   info.GetReturnValue().Set(body_map);
>> }
>> 
>> 
>> void HTTPBody::HTTPBodySet(Local<Name> name, Local<Value> value_obj,
>>                            const PropertyCallbackInfo<Value>& info) {
>>   if (name->IsSymbol()) return;
>> 
>>   string key = ObjectToString(Local<String>::Cast(name));
>>   string value = ToString(info.GetIsolate(), value_obj);
>> 
>>   map<string, string>* body = UnwrapMap(info.Holder());
>>   (*body)[key] = value;
>> 
>>   cout << "body field " << value << endl;
>> }
>> 
>> 
>> Currently I’m not hitting Set interceptor of “body” object, I suppose I’m 
>> doing something wrong here.
>> 
>> 
>>> On 25-Jul-2016, at 10:00 PM, Jochen Eisinger <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>> 
>>> To create dynamic nested maps from C++, the outter object (response) would 
>>> have to return another intercepted object (e.g. body) that then returns the 
>>> actual values on access.
>>> 
>>> On Fri, Jul 22, 2016 at 8:12 AM Abhishek Singh <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> Hi,
>>> 
>>> I’m wondering if there is a way to expose map<string, map<string, string> > 
>>> into JS world from C++? Exposing map<string, string> looks straightforward 
>>> and I’m doing for some C++ objects using NamedPropertyConfigurationHandler. 
>>> I’ll just show sample JS code that I would like to have and where C++ 
>>> map<string, map<string, string> > will come into picture:
>>> 
>>> function OnHTTPGet(request, response) {
>>> 
>>>         var city = “BLR”;
>>>         var limit = “10”;
>>> 
>>>         var queryResult = dbCal(“select * from users where city=${city} 
>>> limit ${limit}”);
>>> 
>>>         // This works for me presently
>>>         /* response.data = queryResult;
>>>         response.status_code = 200; */
>>> 
>>>         // What I would like to have
>>>         response.body.data = queryResult;
>>>         response.header.status_code = 200;
>>> }
>>> 
>>> “request” - native HTTP request JSON passed from C++ V8 binding as args to 
>>> JS function
>>> “response” - C++ based HTTP object exposed with Setter callback set using 
>>> NamedPropertyConfigHandler and this what I write back to user who made the 
>>> “request"
>>> 
>>> I basically want to set HTTP response body and header transparently, which 
>>> would require me to expose C++ HTTP object probably as a map<string, 
>>> map<string, string> >. Hope my question is clear, please let me know if 
>>> there a way to do this?
>>> 
>>> Thanks,
>>> Abhishek
>>> 
>>> --
>>> --
>>> v8-users mailing list
>>> [email protected] <mailto:[email protected]>
>>> http://groups.google.com/group/v8-users 
>>> <http://groups.google.com/group/v8-users>
>>> ---
>>> You received this message because you are subscribed to the Google Groups 
>>> "v8-users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to [email protected] 
>>> <mailto:v8-users%[email protected]>.
>>> For more options, visit https://groups.google.com/d/optout 
>>> <https://groups.google.com/d/optout>.
>>> 
>>> -- 
>>> -- 
>>> v8-users mailing list
>>> [email protected] <mailto:[email protected]>
>>> http://groups.google.com/group/v8-users 
>>> <http://groups.google.com/group/v8-users>
>>> --- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "v8-users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to [email protected] 
>>> <mailto:[email protected]>.
>>> For more options, visit https://groups.google.com/d/optout 
>>> <https://groups.google.com/d/optout>.
>> 
>> 
>> -- 
>> -- 
>> v8-users mailing list
>> [email protected] <mailto:[email protected]>
>> http://groups.google.com/group/v8-users 
>> <http://groups.google.com/group/v8-users>
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "v8-users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] 
>> <mailto:[email protected]>.
>> For more options, visit https://groups.google.com/d/optout 
>> <https://groups.google.com/d/optout>.
>> 
>> -- 
>> -- 
>> v8-users mailing list
>> [email protected] <mailto:[email protected]>
>> http://groups.google.com/group/v8-users 
>> <http://groups.google.com/group/v8-users>
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "v8-users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] 
>> <mailto:[email protected]>.
>> For more options, visit https://groups.google.com/d/optout 
>> <https://groups.google.com/d/optout>.
> 
> 
> -- 
> -- 
> v8-users mailing list
> [email protected] <mailto:[email protected]>
> http://groups.google.com/group/v8-users 
> <http://groups.google.com/group/v8-users>
> --- 
> You received this message because you are subscribed to the Google Groups 
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] 
> <mailto:[email protected]>.
> For more options, visit https://groups.google.com/d/optout 
> <https://groups.google.com/d/optout>.
> 
> -- 
> -- 
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users 
> <http://groups.google.com/group/v8-users>
> --- 
> You received this message because you are subscribed to the Google Groups 
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] 
> <mailto:[email protected]>.
> For more options, visit https://groups.google.com/d/optout 
> <https://groups.google.com/d/optout>.

-- 
-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to