| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent faf94b1 commit 4c1181d
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,69 @@ | |||
| 1 | + #include <node_api.h> | ||
| 2 | + #include "../common.h" | ||
| 3 | + | ||
| 4 | + napi_value BaseClass(napi_env env, napi_callback_info info) { | ||
| 5 | + napi_value newTargetArg; | ||
| 6 | + NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg)); | ||
| 7 | + napi_value thisArg; | ||
| 8 | + NAPI_CALL(env, napi_get_cb_info(env, info, NULL, NULL, &thisArg, NULL)); | ||
| 9 | + napi_value undefined; | ||
| 10 | + NAPI_CALL(env, napi_get_undefined(env, &undefined)); | ||
| 11 | + | ||
| 12 | + // this !== new.target since we are being invoked through super() | ||
| 13 | + bool result; | ||
| 14 | + NAPI_CALL(env, napi_strict_equals(env, newTargetArg, thisArg, &result)); | ||
| 15 | + NAPI_ASSERT(env, !result, "this !== new.target"); | ||
| 16 | + | ||
| 17 | + // new.target !== undefined because we should be called as a new expression | ||
| 18 | + NAPI_ASSERT(env, newTargetArg != NULL, "newTargetArg != NULL"); | ||
| 19 | + NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result)); | ||
| 20 | + NAPI_ASSERT(env, !result, "new.target !== undefined"); | ||
| 21 | + | ||
| 22 | + return thisArg; | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + napi_value Constructor(napi_env env, napi_callback_info info) { | ||
| 26 | + bool result; | ||
| 27 | + napi_value newTargetArg; | ||
| 28 | + NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg)); | ||
| 29 | + size_t argc = 1; | ||
| 30 | + napi_value argv; | ||
| 31 | + napi_value thisArg; | ||
| 32 | + NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisArg, NULL)); | ||
| 33 | + napi_value undefined; | ||
| 34 | + NAPI_CALL(env, napi_get_undefined(env, &undefined)); | ||
| 35 | + | ||
| 36 | + // new.target !== undefined because we should be called as a new expression | ||
| 37 | + NAPI_ASSERT(env, newTargetArg != NULL, "newTargetArg != NULL"); | ||
| 38 | + NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result)); | ||
| 39 | + NAPI_ASSERT(env, !result, "new.target !== undefined"); | ||
| 40 | + | ||
| 41 | + // arguments[0] should be Constructor itself (test harness passed it) | ||
| 42 | + NAPI_CALL(env, napi_strict_equals(env, newTargetArg, argv, &result)); | ||
| 43 | + NAPI_ASSERT(env, result, "new.target === Constructor"); | ||
| 44 | + | ||
| 45 | + return thisArg; | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + napi_value OrdinaryFunction(napi_env env, napi_callback_info info) { | ||
| 49 | + napi_value newTargetArg; | ||
| 50 | + NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg)); | ||
| 51 | + | ||
| 52 | + NAPI_ASSERT(env, newTargetArg == NULL, "newTargetArg == NULL"); | ||
| 53 | + | ||
| 54 | + napi_value _true; | ||
| 55 | + NAPI_CALL(env, napi_get_boolean(env, true, &_true)); | ||
| 56 | + return _true; | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + napi_value Init(napi_env env, napi_value exports) { | ||
| 60 | + const napi_property_descriptor desc[] = { | ||
| 61 | + DECLARE_NAPI_PROPERTY("BaseClass", BaseClass), | ||
| 62 | + DECLARE_NAPI_PROPERTY("OrdinaryFunction", OrdinaryFunction), | ||
| 63 | + DECLARE_NAPI_PROPERTY("Constructor", Constructor) | ||
| 64 | + }; | ||
| 65 | + NAPI_CALL(env, napi_define_properties(env, exports, 3, desc)); | ||
| 66 | + return exports; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,9 @@ | |||
| 1 | + { | ||
| 2 | + 'targets': [ | ||
| 3 | + { | ||
| 4 | + 'target_name': 'binding', | ||
| 5 | + 'defines': [ 'V8_DEPRECATION_WARNINGS=1' ], | ||
| 6 | + 'sources': [ 'binding.c' ] | ||
| 7 | + } | ||
| 8 | + ] | ||
| 9 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,21 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + | ||
| 3 | + const common = require('../../common'); | ||
| 4 | + const assert = require('assert'); | ||
| 5 | + const binding = require(`./build/${common.buildType}/binding`); | ||
| 6 | + | ||
| 7 | + class Class extends binding.BaseClass { | ||
| 8 | + constructor() { | ||
| 9 | + super(); | ||
| 10 | + this.method(); | ||
| 11 | + } | ||
| 12 | + method() { | ||
| 13 | + this.ok = true; | ||
| 14 | + } | ||
| 15 | + } | ||
| 16 | + | ||
| 17 | + assert.ok(new Class() instanceof binding.BaseClass); | ||
| 18 | + assert.ok(new Class().ok); | ||
| 19 | + assert.ok(binding.OrdinaryFunction()); | ||
| 20 | + assert.ok( | ||
| 21 | + new binding.Constructor(binding.Constructor) instanceof binding.Constructor); | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments